16
16
17
17
package org .springframework .web .filter ;
18
18
19
+ import java .util .function .BiConsumer ;
20
+ import java .util .stream .Stream ;
21
+
19
22
import jakarta .servlet .http .HttpServletResponse ;
20
23
import org .junit .jupiter .api .Test ;
24
+ import org .junit .jupiter .params .ParameterizedTest ;
25
+ import org .junit .jupiter .params .provider .Arguments ;
26
+ import org .junit .jupiter .params .provider .MethodSource ;
21
27
28
+ import org .springframework .http .MediaType ;
22
29
import org .springframework .util .FileCopyUtils ;
23
30
import org .springframework .web .testfixture .servlet .MockHttpServletResponse ;
24
31
import org .springframework .web .util .ContentCachingResponseWrapper ;
25
32
26
33
import static java .nio .charset .StandardCharsets .UTF_8 ;
27
34
import static org .assertj .core .api .Assertions .assertThat ;
35
+ import static org .junit .jupiter .api .Named .named ;
36
+ import static org .junit .jupiter .params .provider .Arguments .arguments ;
28
37
import static org .springframework .http .HttpHeaders .CONTENT_LENGTH ;
38
+ import static org .springframework .http .HttpHeaders .CONTENT_TYPE ;
29
39
import static org .springframework .http .HttpHeaders .TRANSFER_ENCODING ;
30
40
31
41
/**
32
42
* Unit tests for {@link ContentCachingResponseWrapper}.
33
43
* @author Rossen Stoyanchev
44
+ * @author Sam Brannen
34
45
*/
35
46
public class ContentCachingResponseWrapperTests {
36
47
@@ -49,6 +60,124 @@ void copyBodyToResponse() throws Exception {
49
60
assertThat (response .getContentAsByteArray ()).isEqualTo (responseBody );
50
61
}
51
62
63
+ @ Test
64
+ void copyBodyToResponseWithPresetHeaders () throws Exception {
65
+ String PUZZLE = "puzzle" ;
66
+ String ENIGMA = "enigma" ;
67
+ String NUMBER = "number" ;
68
+ String MAGIC = "42" ;
69
+
70
+ byte [] responseBody = "Hello World" .getBytes (UTF_8 );
71
+ int responseLength = responseBody .length ;
72
+ int originalContentLength = 999 ;
73
+ String contentType = MediaType .APPLICATION_JSON_VALUE ;
74
+
75
+ MockHttpServletResponse response = new MockHttpServletResponse ();
76
+ response .setContentType (contentType );
77
+ response .setContentLength (originalContentLength );
78
+ response .setHeader (PUZZLE , ENIGMA );
79
+ response .setIntHeader (NUMBER , 42 );
80
+
81
+ ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper (response );
82
+ responseWrapper .setStatus (HttpServletResponse .SC_CREATED );
83
+
84
+ assertThat (responseWrapper .getStatus ()).isEqualTo (HttpServletResponse .SC_CREATED );
85
+ assertThat (responseWrapper .getContentSize ()).isZero ();
86
+ assertThat (responseWrapper .getHeaderNames ())
87
+ .containsExactlyInAnyOrder (PUZZLE , NUMBER , CONTENT_TYPE , CONTENT_LENGTH );
88
+
89
+ assertHeader (responseWrapper , PUZZLE , ENIGMA );
90
+ assertHeader (responseWrapper , NUMBER , MAGIC );
91
+ assertHeader (responseWrapper , CONTENT_LENGTH , originalContentLength );
92
+ assertContentTypeHeader (responseWrapper , contentType );
93
+
94
+ FileCopyUtils .copy (responseBody , responseWrapper .getOutputStream ());
95
+ assertThat (responseWrapper .getContentSize ()).isEqualTo (responseLength );
96
+
97
+ responseWrapper .copyBodyToResponse ();
98
+
99
+ assertThat (responseWrapper .getStatus ()).isEqualTo (HttpServletResponse .SC_CREATED );
100
+ assertThat (responseWrapper .getContentSize ()).isZero ();
101
+ assertThat (responseWrapper .getHeaderNames ())
102
+ .containsExactlyInAnyOrder (PUZZLE , NUMBER , CONTENT_TYPE , CONTENT_LENGTH );
103
+
104
+ assertHeader (responseWrapper , PUZZLE , ENIGMA );
105
+ assertHeader (responseWrapper , NUMBER , MAGIC );
106
+ assertHeader (responseWrapper , CONTENT_LENGTH , responseLength );
107
+ assertContentTypeHeader (responseWrapper , contentType );
108
+
109
+ assertThat (response .getStatus ()).isEqualTo (HttpServletResponse .SC_CREATED );
110
+ assertThat (response .getContentLength ()).isEqualTo (responseLength );
111
+ assertThat (response .getContentAsByteArray ()).isEqualTo (responseBody );
112
+ assertThat (response .getHeaderNames ())
113
+ .containsExactlyInAnyOrder (PUZZLE , NUMBER , CONTENT_TYPE , CONTENT_LENGTH );
114
+
115
+ assertHeader (response , PUZZLE , ENIGMA );
116
+ assertHeader (response , NUMBER , MAGIC );
117
+ assertHeader (response , CONTENT_LENGTH , responseLength );
118
+ assertContentTypeHeader (response , contentType );
119
+ }
120
+
121
+ @ ParameterizedTest (name = "[{index}] {0}" )
122
+ @ MethodSource ("setContentTypeFunctions" )
123
+ void copyBodyToResponseWithOverridingHeaders (BiConsumer <HttpServletResponse , String > setContentType ) throws Exception {
124
+ byte [] responseBody = "Hello World" .getBytes (UTF_8 );
125
+ int responseLength = responseBody .length ;
126
+ int originalContentLength = 11 ;
127
+ int overridingContentLength = 22 ;
128
+ String originalContentType = MediaType .TEXT_PLAIN_VALUE ;
129
+ String overridingContentType = MediaType .APPLICATION_JSON_VALUE ;
130
+
131
+ MockHttpServletResponse response = new MockHttpServletResponse ();
132
+ response .setContentLength (originalContentLength );
133
+ response .setContentType (originalContentType );
134
+
135
+ ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper (response );
136
+ responseWrapper .setStatus (HttpServletResponse .SC_CREATED );
137
+ responseWrapper .setContentLength (overridingContentLength );
138
+ setContentType .accept (responseWrapper , overridingContentType );
139
+
140
+ assertThat (responseWrapper .getStatus ()).isEqualTo (HttpServletResponse .SC_CREATED );
141
+ assertThat (responseWrapper .getContentSize ()).isZero ();
142
+ assertThat (responseWrapper .getHeaderNames ()).containsExactlyInAnyOrder (CONTENT_TYPE , CONTENT_LENGTH );
143
+
144
+ assertHeader (response , CONTENT_LENGTH , originalContentLength );
145
+ assertHeader (responseWrapper , CONTENT_LENGTH , overridingContentLength );
146
+ assertContentTypeHeader (response , originalContentType );
147
+ assertContentTypeHeader (responseWrapper , overridingContentType );
148
+
149
+ FileCopyUtils .copy (responseBody , responseWrapper .getOutputStream ());
150
+ assertThat (responseWrapper .getContentSize ()).isEqualTo (responseLength );
151
+
152
+ responseWrapper .copyBodyToResponse ();
153
+
154
+ assertThat (responseWrapper .getStatus ()).isEqualTo (HttpServletResponse .SC_CREATED );
155
+ assertThat (responseWrapper .getContentSize ()).isZero ();
156
+ assertThat (responseWrapper .getHeaderNames ()).containsExactlyInAnyOrder (CONTENT_TYPE , CONTENT_LENGTH );
157
+
158
+ assertHeader (response , CONTENT_LENGTH , responseLength );
159
+ assertHeader (responseWrapper , CONTENT_LENGTH , responseLength );
160
+ assertContentTypeHeader (response , overridingContentType );
161
+ assertContentTypeHeader (responseWrapper , overridingContentType );
162
+
163
+ assertThat (response .getStatus ()).isEqualTo (HttpServletResponse .SC_CREATED );
164
+ assertThat (response .getContentLength ()).isEqualTo (responseLength );
165
+ assertThat (response .getContentAsByteArray ()).isEqualTo (responseBody );
166
+ assertThat (response .getHeaderNames ()).containsExactlyInAnyOrder (CONTENT_TYPE , CONTENT_LENGTH );
167
+ }
168
+
169
+ private static Stream <Arguments > setContentTypeFunctions () {
170
+ return Stream .of (
171
+ namedArguments ("setContentType()" , HttpServletResponse ::setContentType ),
172
+ namedArguments ("setHeader()" , (response , contentType ) -> response .setHeader (CONTENT_TYPE , contentType )),
173
+ namedArguments ("addHeader()" , (response , contentType ) -> response .addHeader (CONTENT_TYPE , contentType ))
174
+ );
175
+ }
176
+
177
+ private static Arguments namedArguments (String name , BiConsumer <HttpServletResponse , String > setContentTypeFunction ) {
178
+ return arguments (named (name , setContentTypeFunction ));
179
+ }
180
+
52
181
@ Test
53
182
void copyBodyToResponseWithTransferEncoding () throws Exception {
54
183
byte [] responseBody = "6\r \n Hello 5\r \n World0\r \n \r \n " .getBytes (UTF_8 );
@@ -66,6 +195,10 @@ void copyBodyToResponseWithTransferEncoding() throws Exception {
66
195
assertThat (response .getContentAsByteArray ()).isEqualTo (responseBody );
67
196
}
68
197
198
+ private void assertHeader (HttpServletResponse response , String header , int value ) {
199
+ assertHeader (response , header , Integer .toString (value ));
200
+ }
201
+
69
202
private void assertHeader (HttpServletResponse response , String header , String value ) {
70
203
if (value == null ) {
71
204
assertThat (response .containsHeader (header )).as (header ).isFalse ();
@@ -79,4 +212,9 @@ private void assertHeader(HttpServletResponse response, String header, String va
79
212
}
80
213
}
81
214
215
+ private void assertContentTypeHeader (HttpServletResponse response , String contentType ) {
216
+ assertHeader (response , CONTENT_TYPE , contentType );
217
+ assertThat (response .getContentType ()).as (CONTENT_TYPE ).isEqualTo (contentType );
218
+ }
219
+
82
220
}
0 commit comments