HttpEntityMethodProcessor lets entity headers override existing headers (again)
Issue: SPR-15952
This commit is contained in:
		
							parent
							
								
									8caeb33974
								
							
						
					
					
						commit
						5bdcb895c0
					
				| 
						 | 
					@ -181,15 +181,15 @@ public class HttpEntityMethodProcessor extends AbstractMessageConverterMethodPro
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		HttpHeaders outputHeaders = outputMessage.getHeaders();
 | 
							HttpHeaders outputHeaders = outputMessage.getHeaders();
 | 
				
			||||||
		HttpHeaders entityHeaders = responseEntity.getHeaders();
 | 
							HttpHeaders entityHeaders = responseEntity.getHeaders();
 | 
				
			||||||
		if (outputHeaders.containsKey(HttpHeaders.VARY) && entityHeaders.containsKey(HttpHeaders.VARY)) {
 | 
					 | 
				
			||||||
			List<String> values = getVaryRequestHeadersToAdd(outputHeaders, entityHeaders);
 | 
					 | 
				
			||||||
			if (!values.isEmpty()) {
 | 
					 | 
				
			||||||
				outputHeaders.setVary(values);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (!entityHeaders.isEmpty()) {
 | 
							if (!entityHeaders.isEmpty()) {
 | 
				
			||||||
			entityHeaders.forEach((key, value) -> {
 | 
								entityHeaders.forEach((key, value) -> {
 | 
				
			||||||
				if (!outputHeaders.containsKey(key)) {
 | 
									if (HttpHeaders.VARY.equals(key) && outputHeaders.containsKey(HttpHeaders.VARY)) {
 | 
				
			||||||
 | 
										List<String> values = getVaryRequestHeadersToAdd(outputHeaders, entityHeaders);
 | 
				
			||||||
 | 
										if (!values.isEmpty()) {
 | 
				
			||||||
 | 
											outputHeaders.setVary(values);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else {
 | 
				
			||||||
					outputHeaders.put(key, value);
 | 
										outputHeaders.put(key, value);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -542,6 +542,59 @@ public class HttpEntityMethodProcessorMockTests {
 | 
				
			||||||
		assertConditionalResponse(HttpStatus.OK, "body", etagValue, -1);
 | 
							assertConditionalResponse(HttpStatus.OK, "body", etagValue, -1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@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 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(stringHttpMessageConverter).write(eq("Foo"), eq(MediaType.TEXT_PLAIN), isA(HttpOutputMessage.class));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private void initStringMessageConversion(MediaType accepted) {
 | 
						private void initStringMessageConversion(MediaType accepted) {
 | 
				
			||||||
		given(stringHttpMessageConverter.canWrite(String.class, null)).willReturn(true);
 | 
							given(stringHttpMessageConverter.canWrite(String.class, null)).willReturn(true);
 | 
				
			||||||
| 
						 | 
					@ -554,8 +607,7 @@ public class HttpEntityMethodProcessorMockTests {
 | 
				
			||||||
		verify(stringHttpMessageConverter).write(eq(body), eq(MediaType.TEXT_PLAIN), outputMessage.capture());
 | 
							verify(stringHttpMessageConverter).write(eq(body), eq(MediaType.TEXT_PLAIN), outputMessage.capture());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private void assertConditionalResponse(HttpStatus status, String body,
 | 
						private void assertConditionalResponse(HttpStatus status, String body, String etag, long lastModified) throws Exception {
 | 
				
			||||||
			String etag, long lastModified) throws Exception {
 | 
					 | 
				
			||||||
		assertEquals(status.value(), servletResponse.getStatus());
 | 
							assertEquals(status.value(), servletResponse.getStatus());
 | 
				
			||||||
		assertTrue(mavContainer.isRequestHandled());
 | 
							assertTrue(mavContainer.isRequestHandled());
 | 
				
			||||||
		if (body != null) {
 | 
							if (body != null) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue