@ -17,24 +17,27 @@
@@ -17,24 +17,27 @@
package org.springframework.web.filter ;
import java.io.InputStream ;
import java.nio.charset.StandardCharsets ;
import jakarta.servlet.FilterChain ;
import jakarta.servlet.http.HttpServletResponse ;
import org.junit.jupiter.api.Test ;
import org.springframework.http.MediaType ;
import org.springframework.util.FileCopyUtils ;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest ;
import org.springframework.web.testfixture.servlet.MockHttpServletResponse ;
import static java.nio.charset.StandardCharsets.UTF_8 ;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE ;
import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE ;
/ * *
* Tests for { @link ShallowEtagHeaderFilter } .
*
* @author Arjen Poutsma
* @author Brian Clozel
* @author Juergen Hoeller
* @author Sam Brannen
* /
class ShallowEtagHeaderFilterTests {
@ -62,14 +65,14 @@ class ShallowEtagHeaderFilterTests {
@@ -62,14 +65,14 @@ class ShallowEtagHeaderFilterTests {
@Test
void filterNoMatch ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
final byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
( ( HttpServletResponse ) filterResponse ) . setStatus ( HttpServletResponse . SC_OK ) ;
filterResponse . setContentType ( MediaType . TEXT_PLAIN_VALUE ) ;
filterResponse . setContentType ( TEXT_PLAIN_VALUE ) ;
FileCopyUtils . copy ( responseBody , filterResponse . getOutputStream ( ) ) ;
} ;
filter . doFilter ( request , response , filterChain ) ;
@ -77,21 +80,21 @@ class ShallowEtagHeaderFilterTests {
@@ -77,21 +80,21 @@ class ShallowEtagHeaderFilterTests {
assertThat ( response . getStatus ( ) ) . as ( "Invalid status" ) . isEqualTo ( 200 ) ;
assertThat ( response . getHeader ( "ETag" ) ) . as ( "Invalid ETag" ) . isEqualTo ( "\"0b10a8db164e0754105b7a99be72e3fe5\"" ) ;
assertThat ( response . getContentLength ( ) ) . as ( "Invalid Content-Length header" ) . isGreaterThan ( 0 ) ;
assertThat ( response . getContentType ( ) ) . as ( "Invalid Content-Type header" ) . isEqualTo ( MediaType . TEXT_PLAIN_VALUE ) ;
assertThat ( response . getContentType ( ) ) . as ( "Invalid Content-Type header" ) . isEqualTo ( TEXT_PLAIN_VALUE ) ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEqualTo ( responseBody ) ;
}
@Test
void filterNoMatchWeakETag ( ) throws Exception {
this . filter . setWriteWeakETag ( true ) ;
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
final byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
( ( HttpServletResponse ) filterResponse ) . setStatus ( HttpServletResponse . SC_OK ) ;
filterResponse . setContentType ( MediaType . TEXT_PLAIN_VALUE ) ;
filterResponse . setContentType ( TEXT_PLAIN_VALUE ) ;
FileCopyUtils . copy ( responseBody , filterResponse . getOutputStream ( ) ) ;
} ;
filter . doFilter ( request , response , filterChain ) ;
@ -99,22 +102,22 @@ class ShallowEtagHeaderFilterTests {
@@ -99,22 +102,22 @@ class ShallowEtagHeaderFilterTests {
assertThat ( response . getStatus ( ) ) . as ( "Invalid status" ) . isEqualTo ( 200 ) ;
assertThat ( response . getHeader ( "ETag" ) ) . as ( "Invalid ETag" ) . isEqualTo ( "W/\"0b10a8db164e0754105b7a99be72e3fe5\"" ) ;
assertThat ( response . getContentLength ( ) ) . as ( "Invalid Content-Length header" ) . isGreaterThan ( 0 ) ;
assertThat ( response . getContentType ( ) ) . as ( "Invalid Content-Type header" ) . isEqualTo ( MediaType . TEXT_PLAIN_VALUE ) ;
assertThat ( response . getContentType ( ) ) . as ( "Invalid Content-Type header" ) . isEqualTo ( TEXT_PLAIN_VALUE ) ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEqualTo ( responseBody ) ;
}
@Test
void filterMatch ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
String etag = "\"0b10a8db164e0754105b7a99be72e3fe5\"" ;
request . addHeader ( "If-None-Match" , etag ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
filterResponse . setContentLength ( responseBody . length ) ;
filterResponse . setContentType ( MediaType . TEXT_PLAIN_VALUE ) ;
filterResponse . setContentType ( TEXT_PLAIN_VALUE ) ;
FileCopyUtils . copy ( responseBody , filterResponse . getOutputStream ( ) ) ;
} ;
filter . doFilter ( request , response , filterChain ) ;
@ -122,21 +125,20 @@ class ShallowEtagHeaderFilterTests {
@@ -122,21 +125,20 @@ class ShallowEtagHeaderFilterTests {
assertThat ( response . getStatus ( ) ) . as ( "Invalid status" ) . isEqualTo ( 304 ) ;
assertThat ( response . getHeader ( "ETag" ) ) . as ( "Invalid ETag" ) . isEqualTo ( "\"0b10a8db164e0754105b7a99be72e3fe5\"" ) ;
assertThat ( response . containsHeader ( "Content-Length" ) ) . as ( "Response has Content-Length header" ) . isFalse ( ) ;
assertThat ( response . containsHeader ( "Content-Type" ) ) . as ( "Response has Content-Type header" ) . isFalse ( ) ;
byte [ ] expecteds = new byte [ 0 ] ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEqualTo ( expecteds ) ;
assertThat ( response . getContentType ( ) ) . as ( "Invalid Content-Type header" ) . isEqualTo ( TEXT_PLAIN_VALUE ) ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEmpty ( ) ;
}
@Test
void filterMatchWeakEtag ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
String etag = "\"0b10a8db164e0754105b7a99be72e3fe5\"" ;
request . addHeader ( "If-None-Match" , "W/" + etag ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FileCopyUtils . copy ( responseBody , filterResponse . getOutputStream ( ) ) ;
filterResponse . setContentLength ( responseBody . length ) ;
} ;
@ -145,13 +147,12 @@ class ShallowEtagHeaderFilterTests {
@@ -145,13 +147,12 @@ class ShallowEtagHeaderFilterTests {
assertThat ( response . getStatus ( ) ) . as ( "Invalid status" ) . isEqualTo ( 304 ) ;
assertThat ( response . getHeader ( "ETag" ) ) . as ( "Invalid ETag" ) . isEqualTo ( "\"0b10a8db164e0754105b7a99be72e3fe5\"" ) ;
assertThat ( response . containsHeader ( "Content-Length" ) ) . as ( "Response has Content-Length header" ) . isFalse ( ) ;
byte [ ] expecteds = new byte [ 0 ] ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEqualTo ( expecteds ) ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEmpty ( ) ;
}
@Test
void filterWriter ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
String etag = "\"0b10a8db164e0754105b7a99be72e3fe5\"" ;
request . addHeader ( "If-None-Match" , etag ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
@ -167,19 +168,20 @@ class ShallowEtagHeaderFilterTests {
@@ -167,19 +168,20 @@ class ShallowEtagHeaderFilterTests {
assertThat ( response . getStatus ( ) ) . as ( "Invalid status" ) . isEqualTo ( 304 ) ;
assertThat ( response . getHeader ( "ETag" ) ) . as ( "Invalid ETag" ) . isEqualTo ( "\"0b10a8db164e0754105b7a99be72e3fe5\"" ) ;
assertThat ( response . containsHeader ( "Content-Length" ) ) . as ( "Response has Content-Length header" ) . isFalse ( ) ;
byte [ ] expecteds = new byte [ 0 ] ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEqualTo ( expecteds ) ;
assertThat ( response . getContentAsByteArray ( ) ) . as ( "Invalid content" ) . isEmpty ( ) ;
}
@Test // SPR-12960
public void filterWriterWithDisabledCaching ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
response . setContentType ( TEXT_PLAIN_VALUE ) ;
final byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
( ( HttpServletResponse ) filterResponse ) . setStatus ( HttpServletResponse . SC_OK ) ;
filterResponse . setContentType ( APPLICATION_JSON_VALUE ) ;
FileCopyUtils . copy ( responseBody , filterResponse . getOutputStream ( ) ) ;
} ;
@ -188,15 +190,16 @@ class ShallowEtagHeaderFilterTests {
@@ -188,15 +190,16 @@ class ShallowEtagHeaderFilterTests {
assertThat ( response . getStatus ( ) ) . isEqualTo ( 200 ) ;
assertThat ( response . getHeader ( "ETag" ) ) . isNull ( ) ;
assertThat ( response . getContentType ( ) ) . as ( "Invalid Content-Type header" ) . isEqualTo ( APPLICATION_JSON_VALUE ) ;
assertThat ( response . getContentAsByteArray ( ) ) . isEqualTo ( responseBody ) ;
}
@Test
void filterSendError ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
final byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
response . setContentLength ( 100 ) ;
@ -213,10 +216,10 @@ class ShallowEtagHeaderFilterTests {
@@ -213,10 +216,10 @@ class ShallowEtagHeaderFilterTests {
@Test
void filterSendErrorMessage ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
final byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
response . setContentLength ( 100 ) ;
@ -234,10 +237,10 @@ class ShallowEtagHeaderFilterTests {
@@ -234,10 +237,10 @@ class ShallowEtagHeaderFilterTests {
@Test
void filterSendRedirect ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
final byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
response . setContentLength ( 100 ) ;
@ -255,10 +258,10 @@ class ShallowEtagHeaderFilterTests {
@@ -255,10 +258,10 @@ class ShallowEtagHeaderFilterTests {
@Test // SPR-13717
public void filterFlushResponse ( ) throws Exception {
final MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletRequest request = new MockHttpServletRequest ( "GET" , "/hotels" ) ;
MockHttpServletResponse response = new MockHttpServletResponse ( ) ;
final byte [ ] responseBody = "Hello World" . getBytes ( StandardCharsets . UTF_8 ) ;
byte [ ] responseBody = "Hello World" . getBytes ( UTF_8 ) ;
FilterChain filterChain = ( filterRequest , filterResponse ) - > {
assertThat ( filterRequest ) . as ( "Invalid request passed" ) . isEqualTo ( request ) ;
( ( HttpServletResponse ) filterResponse ) . setStatus ( HttpServletResponse . SC_OK ) ;