Add support for setting the "Vary" response header
Issue: SPR-14070
This commit is contained in:
@@ -21,6 +21,7 @@ import java.net.URI;
|
||||
import java.nio.charset.Charset;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
@@ -517,6 +518,47 @@ public class HttpEntityMethodProcessorMockTests {
|
||||
assertEquals(etagValue, servletResponse.getHeader(HttpHeaders.ETAG));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeader() throws Exception {
|
||||
String[] entityValues = {"Accept-Language", "User-Agent"};
|
||||
String[] existingValues = {};
|
||||
String[] expected = {"Accept-Language, User-Agent"};
|
||||
testVaryHeader(entityValues, existingValues, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeaderWithExistingWildcard() throws Exception {
|
||||
String[] entityValues = {"Accept-Language"};
|
||||
String[] existingValues = {"*"};
|
||||
String[] expected = {"*"};
|
||||
testVaryHeader(entityValues, existingValues, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeaderWithExistingCommaValues() throws Exception {
|
||||
String[] entityValues = {"Accept-Language", "User-Agent"};
|
||||
String[] existingValues = {"Accept-Encoding", "Accept-Language"};
|
||||
String[] expected = {"Accept-Encoding", "Accept-Language", "User-Agent"};
|
||||
testVaryHeader(entityValues, existingValues, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeaderWithExistingCommaSeparatedValues() throws Exception {
|
||||
String[] entityValues = {"Accept-Language", "User-Agent"};
|
||||
String[] existingValues = {"Accept-Encoding, Accept-Language"};
|
||||
String[] expected = {"Accept-Encoding, Accept-Language", "User-Agent"};
|
||||
testVaryHeader(entityValues, existingValues, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleReturnValueVaryHeader() throws Exception {
|
||||
String[] entityValues = {"Accept-Language", "User-Agent"};
|
||||
String[] existingValues = {"Accept-Encoding, Accept-Language"};
|
||||
String[] expected = {"Accept-Encoding, Accept-Language", "User-Agent"};
|
||||
testVaryHeader(entityValues, existingValues, expected);
|
||||
}
|
||||
|
||||
|
||||
private void initStringMessageConversion(MediaType accepted) {
|
||||
given(messageConverter.canWrite(String.class, null)).willReturn(true);
|
||||
given(messageConverter.getSupportedMediaTypes()).willReturn(Collections.singletonList(MediaType.TEXT_PLAIN));
|
||||
@@ -536,6 +578,20 @@ public class HttpEntityMethodProcessorMockTests {
|
||||
verify(messageConverter).write(eq(body), eq(MediaType.TEXT_PLAIN), outputMessage.capture());
|
||||
}
|
||||
|
||||
private void testVaryHeader(String[] entityValues, String[] existingValues, String[] expected) throws Exception {
|
||||
ResponseEntity<String> returnValue = ResponseEntity.ok().varyBy(entityValues).body("Foo");
|
||||
for (String value : existingValues) {
|
||||
servletResponse.addHeader("Vary", value);
|
||||
}
|
||||
initStringMessageConversion(MediaType.TEXT_PLAIN);
|
||||
processor.handleReturnValue(returnValue, returnTypeResponseEntity, mavContainer, webRequest);
|
||||
|
||||
assertTrue(mavContainer.isRequestHandled());
|
||||
assertEquals(Arrays.asList(expected), servletResponse.getHeaders("Vary"));
|
||||
verify(messageConverter).write(eq("Foo"), eq(MediaType.TEXT_PLAIN), isA(HttpOutputMessage.class));
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public ResponseEntity<String> handle1(HttpEntity<String> httpEntity, ResponseEntity<String> entity,
|
||||
int i, RequestEntity<String> requestEntity) {
|
||||
|
||||
@@ -15,9 +15,14 @@
|
||||
*/
|
||||
package org.springframework.web.servlet.support;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import org.springframework.mock.web.test.MockHttpServletResponse;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link WebContentGenerator}.
|
||||
@@ -25,7 +30,6 @@ import static org.junit.Assert.assertEquals;
|
||||
*/
|
||||
public class WebContentGeneratorTests {
|
||||
|
||||
|
||||
@Test
|
||||
public void getAllowHeaderWithConstructorTrue() throws Exception {
|
||||
WebContentGenerator generator = new TestWebContentGenerator(true);
|
||||
@@ -59,6 +63,58 @@ public class WebContentGeneratorTests {
|
||||
"GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS", generator.getAllowHeader());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeaderNone() throws Exception {
|
||||
WebContentGenerator generator = new TestWebContentGenerator();
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
generator.prepareResponse(response);
|
||||
|
||||
assertNull(response.getHeader("Vary"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeader() throws Exception {
|
||||
String[] configuredValues = {"Accept-Language", "User-Agent"};
|
||||
String[] responseValues = {};
|
||||
String[] expected = {"Accept-Language", "User-Agent"};
|
||||
testVaryHeader(configuredValues, responseValues, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeaderWithExistingWildcard() throws Exception {
|
||||
String[] configuredValues = {"Accept-Language"};
|
||||
String[] responseValues = {"*"};
|
||||
String[] expected = {"*"};
|
||||
testVaryHeader(configuredValues, responseValues, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeaderWithExistingCommaValues() throws Exception {
|
||||
String[] configuredValues = {"Accept-Language", "User-Agent"};
|
||||
String[] responseValues = {"Accept-Encoding", "Accept-Language"};
|
||||
String[] expected = {"Accept-Encoding", "Accept-Language", "User-Agent"};
|
||||
testVaryHeader(configuredValues, responseValues, expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void varyHeaderWithExistingCommaSeparatedValues() throws Exception {
|
||||
String[] configuredValues = {"Accept-Language", "User-Agent"};
|
||||
String[] responseValues = {"Accept-Encoding, Accept-Language"};
|
||||
String[] expected = {"Accept-Encoding, Accept-Language", "User-Agent"};
|
||||
testVaryHeader(configuredValues, responseValues, expected);
|
||||
}
|
||||
|
||||
private void testVaryHeader(String[] configuredValues, String[] responseValues, String[] expected) {
|
||||
WebContentGenerator generator = new TestWebContentGenerator();
|
||||
generator.setVaryByRequestHeaders(configuredValues);
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
for (String value : responseValues) {
|
||||
response.addHeader("Vary", value);
|
||||
}
|
||||
generator.prepareResponse(response);
|
||||
assertEquals(Arrays.asList(expected), response.getHeaderValues("Vary"));
|
||||
}
|
||||
|
||||
|
||||
private static class TestWebContentGenerator extends WebContentGenerator {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user