1
1
/*
2
- * Copyright 2002-2024 the original author or authors.
2
+ * Copyright 2002-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -97,7 +97,7 @@ public class MockHttpServletResponse implements HttpServletResponse {
97
97
98
98
private final ByteArrayOutputStream content = new ByteArrayOutputStream (1024 );
99
99
100
- private final ServletOutputStream outputStream = new ResponseServletOutputStream ( this . content ) ;
100
+ private @ Nullable ServletOutputStream outputStream ;
101
101
102
102
private @ Nullable PrintWriter writer ;
103
103
@@ -258,12 +258,17 @@ public String getCharacterEncoding() {
258
258
@ Override
259
259
public ServletOutputStream getOutputStream () {
260
260
Assert .state (this .outputStreamAccessAllowed , "OutputStream access not allowed" );
261
+ Assert .state (this .writer == null , "getWriter() has already been called" );
262
+ if (this .outputStream == null ) {
263
+ this .outputStream = new ResponseServletOutputStream (this .content );
264
+ }
261
265
return this .outputStream ;
262
266
}
263
267
264
268
@ Override
265
269
public PrintWriter getWriter () throws UnsupportedEncodingException {
266
270
Assert .state (this .writerAccessAllowed , "Writer access not allowed" );
271
+ Assert .state (this .outputStream == null , "getOutputStream() has already been called" );
267
272
if (this .writer == null ) {
268
273
Writer targetWriter = new OutputStreamWriter (this .content , getCharacterEncoding ());
269
274
this .writer = new ResponsePrintWriter (targetWriter );
@@ -365,6 +370,9 @@ else if (mediaType.isCompatibleWith(MediaType.APPLICATION_JSON) ||
365
370
}
366
371
updateContentTypePropertyAndHeader ();
367
372
}
373
+ else {
374
+ this .headers .remove (HttpHeaders .CONTENT_TYPE );
375
+ }
368
376
}
369
377
370
378
@ Override
@@ -421,6 +429,8 @@ public void reset() {
421
429
this .headers .clear ();
422
430
this .status = HttpServletResponse .SC_OK ;
423
431
this .errorMessage = null ;
432
+ this .writer = null ;
433
+ this .outputStream = null ;
424
434
}
425
435
426
436
@ Override
@@ -680,17 +690,12 @@ private DateFormat newDateFormat() {
680
690
}
681
691
682
692
@ Override
683
- public void setHeader (String name , @ Nullable String value ) {
684
- if (value == null ) {
685
- this .headers .remove (name );
686
- }
687
- else {
688
- setHeaderValue (name , value );
689
- }
693
+ public void setHeader (@ Nullable String name , @ Nullable String value ) {
694
+ setHeaderValue (name , value );
690
695
}
691
696
692
697
@ Override
693
- public void addHeader (String name , @ Nullable String value ) {
698
+ public void addHeader (@ Nullable String name , @ Nullable String value ) {
694
699
addHeaderValue (name , value );
695
700
}
696
701
@@ -704,8 +709,8 @@ public void addIntHeader(String name, int value) {
704
709
addHeaderValue (name , value );
705
710
}
706
711
707
- private void setHeaderValue (String name , @ Nullable Object value ) {
708
- if (value == null ) {
712
+ private void setHeaderValue (@ Nullable String name , @ Nullable Object value ) {
713
+ if (name == null ) {
709
714
return ;
710
715
}
711
716
boolean replaceHeader = true ;
@@ -715,8 +720,8 @@ private void setHeaderValue(String name, @Nullable Object value) {
715
720
doAddHeaderValue (name , value , replaceHeader );
716
721
}
717
722
718
- private void addHeaderValue (String name , @ Nullable Object value ) {
719
- if (value == null ) {
723
+ private void addHeaderValue (@ Nullable String name , @ Nullable Object value ) {
724
+ if (name == null ) {
720
725
return ;
721
726
}
722
727
boolean replaceHeader = false ;
@@ -726,7 +731,19 @@ private void addHeaderValue(String name, @Nullable Object value) {
726
731
doAddHeaderValue (name , value , replaceHeader );
727
732
}
728
733
729
- private boolean setSpecialHeader (String name , Object value , boolean replaceHeader ) {
734
+ private boolean setSpecialHeader (String name , @ Nullable Object value , boolean replaceHeader ) {
735
+ if (value == null ) {
736
+ if (HttpHeaders .CONTENT_TYPE .equalsIgnoreCase (name )) {
737
+ setContentType (null );
738
+ }
739
+ else if (HttpHeaders .CONTENT_LENGTH .equalsIgnoreCase (name )) {
740
+ this .contentLength = 0 ;
741
+ }
742
+ else {
743
+ this .headers .remove (name );
744
+ }
745
+ return true ;
746
+ }
730
747
if (HttpHeaders .CONTENT_TYPE .equalsIgnoreCase (name )) {
731
748
setContentType (value .toString ());
732
749
return true ;
@@ -763,7 +780,7 @@ else if (HttpHeaders.SET_COOKIE.equalsIgnoreCase(name)) {
763
780
}
764
781
}
765
782
766
- private void doAddHeaderValue (String name , Object value , boolean replace ) {
783
+ private void doAddHeaderValue (String name , @ Nullable Object value , boolean replace ) {
767
784
Assert .notNull (value , "Header value must not be null" );
768
785
HeaderValueHolder header = this .headers .computeIfAbsent (name , key -> new HeaderValueHolder ());
769
786
if (replace ) {
0 commit comments