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