From 4c77b7c93b6adbc1437a488c2d6822b9d20b606b Mon Sep 17 00:00:00 2001 From: Gunnar Hillert Date: Wed, 29 Aug 2012 17:21:27 -0400 Subject: [PATCH] INT-2524 - Don't Map Transfer-Encoding Header For reference see: https://jira.springsource.org/browse/INT-2524 INT-2524 - Add some more tests --- .../http/support/DefaultHttpHeaderMapper.java | 48 ++--- ...tpHeaderMapperFromMessageInboundTests.java | 41 ++++ ...pHeaderMapperFromMessageOutboundTests.java | 199 ++++++++++-------- 3 files changed, 175 insertions(+), 113 deletions(-) diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java b/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java index 07e4f97bae..c703635e76 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/support/DefaultHttpHeaderMapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,10 +52,11 @@ import org.springframework.util.StringUtils; /** * Default {@link HeaderMapper} implementation for HTTP. - * + * * @author Mark Fisher * @author Jeremy Grelle * @author Oleg Zhurakousky + * @author Gunnar Hillert * @since 2.0 */ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanFactoryAware, InitializingBean{ @@ -63,7 +64,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF private static final Log logger = LogFactory.getLog(DefaultHttpHeaderMapper.class); private volatile ConversionService conversionService; - + private volatile BeanFactory beanFactory; private static final String ACCEPT = "Accept"; @@ -152,8 +153,6 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF private static final String TRAILER = "Trailer"; - private static final String TRANSFER_ENCODING = "Transfer-Encoding"; - private static final String UPGRADE = "Upgrade"; private static final String USER_AGENT = "User-Agent"; @@ -223,7 +222,6 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF SERVER, SET_COOKIE, TRAILER, - TRANSFER_ENCODING, VARY, VIA, WARNING, @@ -240,7 +238,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF private volatile String[] inboundHeaderNames = new String[0]; private volatile String userDefinedHeaderPrefix = "X-"; - + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } @@ -250,7 +248,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF * or HTTP response (for inbound adapters) from a Spring Integration Message's headers. * The values can also contain simple wildcard patterns (e.g. "foo*" or "*foo") to be matched. *

- * Any non-standard headers will be prefixed with the value specified by + * Any non-standard headers will be prefixed with the value specified by * {@link DefaultHttpHeaderMapper#setUserDefinedHeaderPrefix(String)}. The default is 'X-'. */ public void setOutboundHeaderNames(String[] outboundHeaderNames) { @@ -263,7 +261,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF * The values can also contain simple wildcard patterns (e.g. "foo*" or "*foo") to be matched. *

* This will match the header name directly or, for non-standard HTTP headers, it will match - * the header name prefixed with the value specified by + * the header name prefixed with the value specified by * {@link DefaultHttpHeaderMapper#setUserDefinedHeaderPrefix(String)}. The default is 'X-'. */ public void setInboundHeaderNames(String[] inboundHeaderNames) { @@ -280,7 +278,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF /** * Map from the integration MessageHeaders to an HttpHeaders instance. * Depending on which type of adapter is using this mapper, the HttpHeaders might be - * for an HTTP request (outbound adapter) or for an HTTP response (inbound adapter). + * for an HTTP request (outbound adapter) or for an HTTP response (inbound adapter). */ public void fromHeaders(MessageHeaders headers, HttpHeaders target) { if (logger.isDebugEnabled()){ @@ -291,18 +289,18 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF if (this.shouldMapOutboundHeader(name)) { Object value = headers.get(name); if (value != null) { - if (!this.containsElementIgnoreCase(HTTP_REQUEST_HEADER_NAMES, name) && + if (!this.containsElementIgnoreCase(HTTP_REQUEST_HEADER_NAMES, name) && !this.containsElementIgnoreCase(HTTP_RESPONSE_HEADER_NAMES, name)) { // prefix the user-defined header names if not already prefixed - - name = StringUtils.startsWithIgnoreCase(name, this.userDefinedHeaderPrefix) ? name : + + name = StringUtils.startsWithIgnoreCase(name, this.userDefinedHeaderPrefix) ? name : this.userDefinedHeaderPrefix + name; } if (logger.isDebugEnabled()) { logger.debug(MessageFormat.format("setting headerName=[{0}], value={1}", name, value)); } this.setHttpHeader(target, name, value); - } + } } } } @@ -310,7 +308,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF /** * Map from an HttpHeaders instance to integration MessageHeaders. * Depending on which type of adapter is using this mapper, the HttpHeaders might be - * from an HTTP request (inbound adapter) or from an HTTP response (outbound adapter). + * from an HTTP request (inbound adapter) or from an HTTP response (outbound adapter). */ public Map toHeaders(HttpHeaders source) { if (logger.isDebugEnabled()) { @@ -321,7 +319,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF for (String name : headerNames) { if (this.shouldMapInboundHeader(name)) { if (!ObjectUtils.containsElement(HTTP_REQUEST_HEADER_NAMES, name) && !ObjectUtils.containsElement(HTTP_RESPONSE_HEADER_NAMES, name)) { - String prefixedName = StringUtils.startsWithIgnoreCase(name, this.userDefinedHeaderPrefix) ? name : + String prefixedName = StringUtils.startsWithIgnoreCase(name, this.userDefinedHeaderPrefix) ? name : this.userDefinedHeaderPrefix + name; Object value = source.containsKey(prefixedName) ? this.getHttpHeader(source, prefixedName) : this.getHttpHeader(source, name); if (value != null) { @@ -344,7 +342,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF } return target; } - + public void afterPropertiesSet() throws Exception { if (this.beanFactory != null){ this.conversionService = IntegrationContextUtils.getConversionService(this.beanFactory); @@ -535,7 +533,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF else { Class clazz = (value != null) ? value.getClass() : null; throw new IllegalArgumentException( - "Expected HttpMethod or String value for 'Allow' header value, but received: " + clazz); + "Expected HttpMethod or String value for 'Allow' header value, but received: " + clazz); } } } @@ -546,7 +544,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF else { Class clazz = (value != null) ? value.getClass() : null; throw new IllegalArgumentException( - "Expected String value for 'Cache-Control' header value, but received: " + clazz); + "Expected String value for 'Cache-Control' header value, but received: " + clazz); } } else if (CONTENT_LENGTH.equalsIgnoreCase(name)) { @@ -715,7 +713,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF for (Object next : (Iterable) value) { String convertedValue = null; if (next instanceof String) { - convertedValue = (String) next; + convertedValue = (String) next; } else { convertedValue = this.convertToString(value); @@ -724,7 +722,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF target.add(name, (String) next); } else { - logger.warn("Element of the header '" + name + "' with value '" + value + + logger.warn("Element of the header '" + name + "' with value '" + value + "' will not be set since it is not a String and no Converter " + "is available. Consider registering a Converter with ConversionService (e.g., )"); } @@ -736,7 +734,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF target.set(name, convertedValue); } else { - logger.warn("Header '" + name + "' with value '" + value + + logger.warn("Header '" + name + "' with value '" + value + "' will not be set since it is not a String and no Converter " + "is available. Consider registering a Converter with ConversionService (e.g., )"); } @@ -824,9 +822,9 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF target.put(name, value); } } - + private String convertToString(Object value){ - if (this.conversionService != null && + if (this.conversionService != null && this.conversionService.canConvert(TypeDescriptor.forObject(value), TypeDescriptor.valueOf(String.class))){ return this.conversionService.convert(value, String.class); } @@ -836,7 +834,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper, BeanF /** * Factory method for creating a basic outbound mapper instance. - * This will map all standard HTTP request headers when sending an HTTP request, + * This will map all standard HTTP request headers when sending an HTTP request, * and it will map all standard HTTP response headers when receiving an HTTP response. */ public static DefaultHttpHeaderMapper outboundMapper() { diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java index f66861b0f3..11b8ae08c2 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageInboundTests.java @@ -46,6 +46,7 @@ import org.springframework.util.CollectionUtils; /** * @author Oleg Zhurakousky * @author Mark Fisher + * @author Gunnar Hillert * @since 2.0.1 */ public class DefaultHttpHeaderMapperFromMessageInboundTests { @@ -273,6 +274,46 @@ public class DefaultHttpHeaderMapperFromMessageInboundTests { assertEquals(new URI("http://foo.com").toString(), headers.getLocation().toString()); } + // Transfer Encoding tests + + @Test + public void validateTransferEncodingNotMappedFromMessageHeaders() throws Exception{ + HeaderMapper mapper = DefaultHttpHeaderMapper.inboundMapper(); + Map messageHeaders = new HashMap(); + messageHeaders.put("Transfer-Encoding", "chunked"); + HttpHeaders headers = new HttpHeaders(); + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); + + assertTrue(String.format("'Headers' is not empty. It contains '%s' element(s).", + headers.size()), headers.isEmpty()); + } + + @Test + public void validateTransferEncodingMappedFromHttpHeaders() throws Exception{ + DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper(); + mapper.setInboundHeaderNames(new String[] {"Transfer-Encoding"}); + HttpHeaders headers = new HttpHeaders(); + headers.set("Transfer-Encoding", "chunked"); + + Map result = mapper.toHeaders(headers); + assertEquals(1, result.size()); + assertEquals("chunked", result.get("Transfer-Encoding")); + + } + + @Test + public void validateTransferEncodingNotMappedFromHttpHeadersByDefault() throws Exception{ + DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper(); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Transfer-Encoding", "chunked"); + + Map result = mapper.toHeaders(headers); + assertTrue(String.format("'result' is not empty. It contains '%s' element(s).", + result.size()), result.isEmpty()); + + } + // Pragma tested as part of DefaultHttpHeaderMapperFromMessageOutboundTests @Test diff --git a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java index 8c6f9bada9..2283866211 100644 --- a/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java +++ b/spring-integration-http/src/test/java/org/springframework/integration/http/support/DefaultHttpHeaderMapperFromMessageOutboundTests.java @@ -53,10 +53,10 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { Map messageHeaders = new HashMap(); messageHeaders.put("Accept", "bar"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); } - + @Test public void validateAcceptHeaderSingleString(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -64,12 +64,12 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("Accept", "bar/foo"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals("bar", headers.getAccept().get(0).getType()); assertEquals("foo", headers.getAccept().get(0).getSubtype()); } - + @Test public void validateAcceptHeaderSingleMediaType(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -77,80 +77,80 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("Accept", new MediaType("bar", "foo")); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals("bar", headers.getAccept().get(0).getType()); assertEquals("foo", headers.getAccept().get(0).getSubtype()); } - + @Test public void validateAcceptHeaderMultipleAsDelimitedString(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Accept", "bar/foo, text/xml"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAccept().size()); assertEquals("bar/foo", headers.getAccept().get(0).toString()); assertEquals("text/xml", headers.getAccept().get(1).toString()); } - + @Test public void validateAcceptHeaderMultipleAsStringArray(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Accept", new String[]{"bar/foo", "text/xml"}); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAccept().size()); assertEquals("bar/foo", headers.getAccept().get(0).toString()); assertEquals("text/xml", headers.getAccept().get(1).toString()); } - + @Test public void validateAcceptHeaderMultipleAsStringCollection(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Accept", CollectionUtils.arrayToList(new String[]{"bar/foo", "text/xml"})); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAccept().size()); assertEquals("bar/foo", headers.getAccept().get(0).toString()); assertEquals("text/xml", headers.getAccept().get(1).toString()); } - + @Test public void validateAcceptHeaderMultipleAsStringCollectionCaseInsensitive(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("acCePt", CollectionUtils.arrayToList(new String[]{"bar/foo", "text/xml"})); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAccept().size()); assertEquals("bar/foo", headers.getAccept().get(0).toString()); assertEquals("text/xml", headers.getAccept().get(1).toString()); } - + @Test public void validateAcceptHeaderMultipleAsMediatypeCollection(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); - messageHeaders.put("Accept", + messageHeaders.put("Accept", CollectionUtils.arrayToList(new MediaType[]{new MediaType("bar", "foo"), new MediaType("text", "xml")})); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAccept().size()); assertEquals("bar/foo", headers.getAccept().get(0).toString()); assertEquals("text/xml", headers.getAccept().get(1).toString()); } - + // ACCEPT_CHARSET tests - + @Test(expected=UnsupportedCharsetException.class) public void validateAcceptCharsetHeaderWithWrongCharset(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -159,26 +159,26 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); } - + @Test public void validateAcceptCharsetHeaderSingleString(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Accept-Charset", "UTF-8"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(1, headers.getAcceptCharset().size()); assertEquals("UTF-8", headers.getAcceptCharset().get(0).displayName()); } - + @Test public void validateAcceptCharsetHeaderSingleCharset(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Accept-Charset", Charset.forName("UTF-8")); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(1, headers.getAcceptCharset().size()); assertEquals("UTF-8", headers.getAcceptCharset().get(0).displayName()); @@ -190,26 +190,26 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { Map messageHeaders = new HashMap(); messageHeaders.put("Accept-Charset", "UTF-8, ISO-8859-1"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAcceptCharset().size()); // validate contains since the order is not enforced - assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); - assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); } - + @Test public void validateAcceptCharsetHeaderMultipleAsStringArray(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Accept-Charset", new String[]{"UTF-8", "ISO-8859-1"}); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAcceptCharset().size()); // validate contains since the order is not enforced - assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); - assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); } @Test @@ -218,12 +218,12 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { Map messageHeaders = new HashMap(); messageHeaders.put("Accept-Charset", new Charset[]{ Charset.forName("UTF-8"), Charset.forName("ISO-8859-1") }); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAcceptCharset().size()); // validate contains since the order is not enforced - assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); - assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); } @Test @@ -232,114 +232,114 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { Map messageHeaders = new HashMap(); messageHeaders.put("Accept-Charset", CollectionUtils.arrayToList(new String[]{"UTF-8", "ISO-8859-1"})); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAcceptCharset().size()); // validate contains since the order is not enforced - assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); - assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); } @Test public void validateAcceptCharsetHeaderMultipleAsCollectionOfCharsets(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); - messageHeaders.put("Accept-Charset", + messageHeaders.put("Accept-Charset", CollectionUtils.arrayToList(new Charset[]{Charset.forName("UTF-8"), Charset.forName("ISO-8859-1")})); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(2, headers.getAcceptCharset().size()); // validate contains since the order is not enforced - assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); - assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("UTF-8"))); + assertTrue(headers.getAcceptCharset().contains(Charset.forName("ISO-8859-1"))); } - + // Cache-Control tests - + @Test public void validateCacheControl(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Cache-Control", "foo"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals("foo", headers.getCacheControl()); } - + // Content-Length tests - + @Test public void validateContentLengthAsString(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Content-Length", "1"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(1, headers.getContentLength()); } - + @Test public void validateContentLengthAsNumber(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Content-Length", 1); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals(1, headers.getContentLength()); } - + @Test(expected=NumberFormatException.class) public void validateContentLengthAsNonNumericString(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Content-Length", "foo"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); } - + // Content-Type test - + @Test(expected=IllegalArgumentException.class) public void validateContentTypeWrongValue(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Content-Type", "foo"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); } - + @Test public void validateContentTypeAsString(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Content-Type", "text/html"); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals("text", headers.getContentType().getType()); assertEquals("html", headers.getContentType().getSubtype()); } - + @Test public void validateContentTypeAsMediaType(){ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); Map messageHeaders = new HashMap(); messageHeaders.put("Content-Type", new MediaType("text", "html")); HttpHeaders headers = new HttpHeaders(); - + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals("text", headers.getContentType().getType()); assertEquals("html", headers.getContentType().getSubtype()); } - + // Date test - + @Test public void validateDateAsNumber() throws ParseException{ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -347,12 +347,12 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("Date", 12345678); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - + assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getDate()); } - + @Test public void validateDateAsString() throws ParseException{ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -360,9 +360,9 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("Date", "12345678"); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - + assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getDate()); } @Test @@ -372,14 +372,14 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("Date", new Date(12345678)); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - + assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getDate()); } - + // If-Modified-Since tests - + @Test public void validateIfModifiedSinceAsNumber() throws ParseException{ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -387,12 +387,12 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-Modified-Since", 12345678); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - + assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getIfNotModifiedSince()); } - + @Test public void validateIfModifiedSinceAsString() throws ParseException{ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -400,9 +400,9 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-Modified-Since", "12345678"); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - + assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getIfNotModifiedSince()); } @Test @@ -412,14 +412,14 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-Modified-Since", new Date(12345678)); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - + assertEquals(simpleDateFormat.parse("Thu, 01 Jan 1970 03:25:45 GMT").getTime(), headers.getIfNotModifiedSince()); } - + // If-None-Match - + @Test public void validateIfNoneMatch() throws ParseException{ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -427,11 +427,11 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-None-Match", "1234567"); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + assertEquals(1, headers.getIfNoneMatch().size()); assertEquals("1234567", headers.getIfNoneMatch().get(0)); } - + @Test public void validateIfNoneMatchAsDelimitedString() throws ParseException{ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -439,12 +439,12 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-None-Match", "1234567, 123"); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("1234567", headers.getIfNoneMatch().get(0)); assertEquals("123", headers.getIfNoneMatch().get(1)); } - + @Test public void validateIfNoneMatchAsStringArray() throws ParseException{ HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); @@ -452,7 +452,7 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-None-Match", new String[]{"1234567", "123"}); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("1234567", headers.getIfNoneMatch().get(0)); assertEquals("123", headers.getIfNoneMatch().get(1)); @@ -465,7 +465,7 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-None-Match", "1234567, 123"); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("1234567", headers.getIfNoneMatch().get(0)); assertEquals("123", headers.getIfNoneMatch().get(1)); @@ -478,12 +478,12 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { messageHeaders.put("If-None-Match", CollectionUtils.arrayToList(new String[]{"1234567", "123"})); HttpHeaders headers = new HttpHeaders(); mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); - + assertEquals(2, headers.getIfNoneMatch().size()); assertEquals("1234567", headers.getIfNoneMatch().get(0)); assertEquals("123", headers.getIfNoneMatch().get(1)); } - + // Pragma tests @Test public void validatePragma() throws ParseException{ @@ -494,9 +494,32 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); assertEquals("foo", headers.getPragma()); } - + + // Transfer-Encoding tests + @Test + public void validateTransferEncoding() throws ParseException{ + HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); + Map messageHeaders = new HashMap(); + messageHeaders.put("Transfer-Encoding", "chunked"); + HttpHeaders headers = new HttpHeaders(); + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); + assertNull(headers.get("Transfer-Encoding")); + } + + @Test + public void validateTransferEncodingToHeaders() throws ParseException{ + HeaderMapper mapper = DefaultHttpHeaderMapper.outboundMapper(); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.set("Transfer-Encoding", "chunked"); + + Map messageHeaders = mapper.toHeaders(httpHeaders); + assertEquals(0, messageHeaders.size()); + + } + // Custom headers - + @Test public void validateCustomHeaderWithNoHeaderNames() throws ParseException{ DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper(); @@ -507,7 +530,7 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { assertNull(headers.get("foo")); assertNull(headers.get("X-foo")); } - + @Test public void validateCustomHeaderWithHeaderNames() throws ParseException{ DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper(); @@ -592,7 +615,7 @@ public class DefaultHttpHeaderMapperFromMessageOutboundTests { assertEquals(1, result.size()); assertEquals("x-foo-value", result.get("x-foo")); } - + @Test public void validateCustomHeaderWithStandardPrefixSameCase() throws Exception{ DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper();