|
16 | 16 |
|
17 | 17 | package org.springframework.web.filter; |
18 | 18 |
|
19 | | -import java.nio.charset.StandardCharsets; |
20 | | - |
21 | 19 | import jakarta.servlet.http.HttpServletResponse; |
22 | 20 | import org.junit.jupiter.api.Test; |
23 | 21 |
|
24 | | -import org.springframework.http.HttpHeaders; |
| 22 | +import org.springframework.http.MediaType; |
25 | 23 | import org.springframework.util.FileCopyUtils; |
26 | 24 | import org.springframework.web.testfixture.servlet.MockHttpServletResponse; |
27 | 25 | import org.springframework.web.util.ContentCachingResponseWrapper; |
28 | 26 |
|
| 27 | +import static java.nio.charset.StandardCharsets.UTF_8; |
29 | 28 | import static org.assertj.core.api.Assertions.assertThat; |
| 29 | +import static org.springframework.http.HttpHeaders.CONTENT_LENGTH; |
| 30 | +import static org.springframework.http.HttpHeaders.CONTENT_TYPE; |
| 31 | +import static org.springframework.http.HttpHeaders.TRANSFER_ENCODING; |
30 | 32 |
|
31 | 33 | /** |
32 | 34 | * Tests for {@link ContentCachingResponseWrapper}. |
33 | 35 | * |
34 | 36 | * @author Rossen Stoyanchev |
| 37 | + * @author Sam Brannen |
35 | 38 | */ |
36 | 39 | class ContentCachingResponseWrapperTests { |
37 | 40 |
|
38 | 41 | @Test |
39 | 42 | void copyBodyToResponse() throws Exception { |
40 | | - byte[] responseBody = "Hello World".getBytes(StandardCharsets.UTF_8); |
| 43 | + byte[] responseBody = "Hello World".getBytes(UTF_8); |
41 | 44 | MockHttpServletResponse response = new MockHttpServletResponse(); |
42 | 45 |
|
43 | 46 | ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); |
44 | 47 | responseWrapper.setStatus(HttpServletResponse.SC_OK); |
45 | 48 | FileCopyUtils.copy(responseBody, responseWrapper.getOutputStream()); |
46 | 49 | responseWrapper.copyBodyToResponse(); |
47 | 50 |
|
48 | | - assertThat(response.getStatus()).isEqualTo(200); |
| 51 | + assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_OK); |
49 | 52 | assertThat(response.getContentLength()).isGreaterThan(0); |
50 | 53 | assertThat(response.getContentAsByteArray()).isEqualTo(responseBody); |
51 | 54 | } |
52 | 55 |
|
| 56 | + @Test |
| 57 | + void copyBodyToResponseWithPresetHeaders() throws Exception { |
| 58 | + String PUZZLE = "puzzle"; |
| 59 | + String ENIGMA = "enigma"; |
| 60 | + String NUMBER = "number"; |
| 61 | + String MAGIC = "42"; |
| 62 | + |
| 63 | + byte[] responseBody = "Hello World".getBytes(UTF_8); |
| 64 | + String responseLength = Integer.toString(responseBody.length); |
| 65 | + String contentType = MediaType.APPLICATION_JSON_VALUE; |
| 66 | + |
| 67 | + MockHttpServletResponse response = new MockHttpServletResponse(); |
| 68 | + response.setContentType(contentType); |
| 69 | + response.setContentLength(999); |
| 70 | + response.setHeader(PUZZLE, ENIGMA); |
| 71 | + response.setIntHeader(NUMBER, 42); |
| 72 | + |
| 73 | + ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); |
| 74 | + responseWrapper.setStatus(HttpServletResponse.SC_OK); |
| 75 | + |
| 76 | + assertThat(responseWrapper.getStatus()).isEqualTo(HttpServletResponse.SC_OK); |
| 77 | + assertThat(responseWrapper.getContentSize()).isZero(); |
| 78 | + assertThat(responseWrapper.getHeaderNames()) |
| 79 | + .containsExactlyInAnyOrder(PUZZLE, NUMBER, CONTENT_TYPE, CONTENT_LENGTH); |
| 80 | + |
| 81 | + assertThat(responseWrapper.containsHeader(PUZZLE)).as(PUZZLE).isTrue(); |
| 82 | + assertThat(responseWrapper.getHeader(PUZZLE)).as(PUZZLE).isEqualTo(ENIGMA); |
| 83 | + assertThat(responseWrapper.getHeaders(PUZZLE)).as(PUZZLE).containsExactly(ENIGMA); |
| 84 | + |
| 85 | + assertThat(responseWrapper.containsHeader(NUMBER)).as(NUMBER).isTrue(); |
| 86 | + assertThat(responseWrapper.getHeader(NUMBER)).as(NUMBER).isEqualTo(MAGIC); |
| 87 | + assertThat(responseWrapper.getHeaders(NUMBER)).as(NUMBER).containsExactly(MAGIC); |
| 88 | + |
| 89 | + assertThat(responseWrapper.containsHeader(CONTENT_TYPE)).as(CONTENT_TYPE).isTrue(); |
| 90 | + assertThat(responseWrapper.getHeader(CONTENT_TYPE)).as(CONTENT_TYPE).isEqualTo(contentType); |
| 91 | + assertThat(responseWrapper.getHeaders(CONTENT_TYPE)).as(CONTENT_TYPE).containsExactly(contentType); |
| 92 | + assertThat(responseWrapper.getContentType()).as(CONTENT_TYPE).isEqualTo(contentType); |
| 93 | + |
| 94 | + assertThat(responseWrapper.containsHeader(CONTENT_LENGTH)).as(CONTENT_LENGTH).isTrue(); |
| 95 | + assertThat(responseWrapper.getHeader(CONTENT_LENGTH)).as(CONTENT_LENGTH).isEqualTo("999"); |
| 96 | + assertThat(responseWrapper.getHeaders(CONTENT_LENGTH)).as(CONTENT_LENGTH).containsExactly("999"); |
| 97 | + |
| 98 | + FileCopyUtils.copy(responseBody, responseWrapper.getOutputStream()); |
| 99 | + responseWrapper.copyBodyToResponse(); |
| 100 | + |
| 101 | + assertThat(responseWrapper.getHeaderNames()) |
| 102 | + .containsExactlyInAnyOrder(PUZZLE, NUMBER, CONTENT_TYPE, CONTENT_LENGTH); |
| 103 | + |
| 104 | + assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_OK); |
| 105 | + assertThat(response.getContentType()).isEqualTo(contentType); |
| 106 | + assertThat(response.getContentLength()).isEqualTo(responseBody.length); |
| 107 | + assertThat(response.getContentAsByteArray()).isEqualTo(responseBody); |
| 108 | + assertThat(response.getHeaderNames()) |
| 109 | + .containsExactlyInAnyOrder(PUZZLE, NUMBER, CONTENT_TYPE, CONTENT_LENGTH); |
| 110 | + |
| 111 | + assertThat(response.containsHeader(PUZZLE)).as(PUZZLE).isTrue(); |
| 112 | + assertThat(response.getHeader(PUZZLE)).as(PUZZLE).isEqualTo(ENIGMA); |
| 113 | + assertThat(response.getHeaders(PUZZLE)).as(PUZZLE).containsExactly(ENIGMA); |
| 114 | + |
| 115 | + assertThat(response.containsHeader(NUMBER)).as(NUMBER).isTrue(); |
| 116 | + assertThat(response.getHeader(NUMBER)).as(NUMBER).isEqualTo(MAGIC); |
| 117 | + assertThat(response.getHeaders(NUMBER)).as(NUMBER).containsExactly(MAGIC); |
| 118 | + |
| 119 | + assertThat(response.containsHeader(CONTENT_TYPE)).as(CONTENT_TYPE).isTrue(); |
| 120 | + assertThat(response.getHeader(CONTENT_TYPE)).as(CONTENT_TYPE).isEqualTo(contentType); |
| 121 | + assertThat(response.getHeaders(CONTENT_TYPE)).as(CONTENT_TYPE).containsExactly(contentType); |
| 122 | + assertThat(response.getContentType()).as(CONTENT_TYPE).isEqualTo(contentType); |
| 123 | + |
| 124 | + assertThat(response.containsHeader(CONTENT_LENGTH)).as(CONTENT_LENGTH).isTrue(); |
| 125 | + assertThat(response.getHeader(CONTENT_LENGTH)).as(CONTENT_LENGTH).isEqualTo(responseLength); |
| 126 | + assertThat(response.getHeaders(CONTENT_LENGTH)).as(CONTENT_LENGTH).containsExactly(responseLength); |
| 127 | + } |
| 128 | + |
53 | 129 | @Test |
54 | 130 | void copyBodyToResponseWithTransferEncoding() throws Exception { |
55 | | - byte[] responseBody = "6\r\nHello 5\r\nWorld0\r\n\r\n".getBytes(StandardCharsets.UTF_8); |
| 131 | + byte[] responseBody = "6\r\nHello 5\r\nWorld0\r\n\r\n".getBytes(UTF_8); |
56 | 132 | MockHttpServletResponse response = new MockHttpServletResponse(); |
57 | 133 |
|
58 | 134 | ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); |
59 | 135 | responseWrapper.setStatus(HttpServletResponse.SC_OK); |
60 | | - responseWrapper.setHeader(HttpHeaders.TRANSFER_ENCODING, "chunked"); |
| 136 | + responseWrapper.setHeader(TRANSFER_ENCODING, "chunked"); |
61 | 137 | FileCopyUtils.copy(responseBody, responseWrapper.getOutputStream()); |
62 | 138 | responseWrapper.copyBodyToResponse(); |
63 | 139 |
|
64 | | - assertThat(response.getStatus()).isEqualTo(200); |
65 | | - assertThat(response.getHeader(HttpHeaders.TRANSFER_ENCODING)).isEqualTo("chunked"); |
66 | | - assertThat(response.getHeader(HttpHeaders.CONTENT_LENGTH)).isNull(); |
| 140 | + assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_OK); |
| 141 | + assertThat(response.getHeader(TRANSFER_ENCODING)).isEqualTo("chunked"); |
| 142 | + assertThat(response.getHeader(CONTENT_LENGTH)).isNull(); |
67 | 143 | assertThat(response.getContentAsByteArray()).isEqualTo(responseBody); |
68 | 144 | } |
69 | 145 |
|
|
0 commit comments