From a7de2656bdec77db4be6883c89b98109aa448bc8 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Mon, 17 Jan 2011 14:48:18 -0500 Subject: [PATCH] INT-1722 exposed userDefinedPrefix as configurable property of the DefaultHttpHeaderMapper --- .../http/support/DefaultHttpHeaderMapper.java | 20 +++++-- ...tpHeaderMapperFromMessageInboundTests.java | 54 +++++++++++++++++++ 2 files changed, 69 insertions(+), 5 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 d38e2e5b9d..11f9b049e4 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 @@ -55,7 +55,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper { private static Log log = LogFactory.getLog(DefaultHttpHeaderMapper.class); - public static final String USER_DEFINED_HEADER_PREFIX = "X-"; + private volatile String userDefinedPrefix = "X-"; private static final String ACCEPT = "Accept"; @@ -253,6 +253,16 @@ public class DefaultHttpHeaderMapper implements HeaderMapper { public void setInboundHeaderNames(String[] inboundHeaderNames) { this.inboundHeaderNames = (inboundHeaderNames != null) ? inboundHeaderNames : new String[0]; } + /** + * Sets prefix to use with custom headers. Default is 'X-' + * @param userDefinedPrefix + */ + public void setUserDefinedPrefix(String userDefinedPrefix) { + if (userDefinedPrefix == null){ + userDefinedPrefix = ""; + } + this.userDefinedPrefix = userDefinedPrefix; + } /** * Map from the integration MessageHeaders to an HttpHeaders instance. @@ -271,7 +281,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper { 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 = name.startsWith(USER_DEFINED_HEADER_PREFIX) ? name : USER_DEFINED_HEADER_PREFIX + name; + name = name.startsWith(userDefinedPrefix) ? name : userDefinedPrefix + name; } if (log.isDebugEnabled()) { log.debug(MessageFormat.format("setting headerName=[{0}], value={1}", name, value)); @@ -296,8 +306,8 @@ public class DefaultHttpHeaderMapper implements HeaderMapper { 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 = name.startsWith(USER_DEFINED_HEADER_PREFIX) ? name - : USER_DEFINED_HEADER_PREFIX + name; + String prefixedName = name.startsWith(userDefinedPrefix) ? name + : userDefinedPrefix + name; Object value = source.containsKey(prefixedName) ? this.getHttpHeader(source, prefixedName) : this.getHttpHeader(source, name); if (value != null) { if (log.isDebugEnabled()) { @@ -319,7 +329,7 @@ public class DefaultHttpHeaderMapper implements HeaderMapper { } return target; } - + private boolean containsElementIgnoreCase(String[] headerNames, String name){ for (String headerName : headerNames) { if (headerName.equalsIgnoreCase(name)){ 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 3dfe9a83d3..8c21be8844 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 @@ -329,6 +329,60 @@ public class DefaultHttpHeaderMapperFromMessageInboundTests { assertEquals(1, headers.get("X-foobar").size()); assertEquals("abc", headers.getFirst("X-foobar")); } + + @Test + public void validateCustomHeaderNamePatternsAndStandardResponseHeadersMappedToHttpHeadersWithCustomPrefix() throws Exception{ + DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper(); + mapper.setUserDefinedPrefix("Z-"); + mapper.setOutboundHeaderNames(new String[] {"foo*", "HTTP_RESPONSE_HEADERS"}); + Map messageHeaders = new HashMap(); + messageHeaders.put("foobar", "abc"); + messageHeaders.put("Accept", "text/html"); + messageHeaders.put("Content-Type", "text/xml"); + HttpHeaders headers = new HttpHeaders(); + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); + assertEquals(2, headers.size()); + assertTrue(headers.getAccept().isEmpty()); + assertEquals(MediaType.TEXT_XML, headers.getContentType()); + assertEquals(1, headers.get("Z-foobar").size()); + assertEquals("abc", headers.getFirst("Z-foobar")); + } + + @Test + public void validateCustomHeaderNamePatternsAndStandardResponseHeadersMappedToHttpHeadersWithCustomPrefixEmptyString() throws Exception{ + DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper(); + mapper.setUserDefinedPrefix(""); + mapper.setOutboundHeaderNames(new String[] {"foo*", "HTTP_RESPONSE_HEADERS"}); + Map messageHeaders = new HashMap(); + messageHeaders.put("foobar", "abc"); + messageHeaders.put("Accept", "text/html"); + messageHeaders.put("Content-Type", "text/xml"); + HttpHeaders headers = new HttpHeaders(); + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); + assertEquals(2, headers.size()); + assertTrue(headers.getAccept().isEmpty()); + assertEquals(MediaType.TEXT_XML, headers.getContentType()); + assertEquals(1, headers.get("foobar").size()); + assertEquals("abc", headers.getFirst("foobar")); + } + + @Test + public void validateCustomHeaderNamePatternsAndStandardResponseHeadersMappedToHttpHeadersWithCustomPrefixNull() throws Exception{ + DefaultHttpHeaderMapper mapper = new DefaultHttpHeaderMapper(); + mapper.setUserDefinedPrefix(null); + mapper.setOutboundHeaderNames(new String[] {"foo*", "HTTP_RESPONSE_HEADERS"}); + Map messageHeaders = new HashMap(); + messageHeaders.put("foobar", "abc"); + messageHeaders.put("Accept", "text/html"); + messageHeaders.put("Content-Type", "text/xml"); + HttpHeaders headers = new HttpHeaders(); + mapper.fromHeaders(new MessageHeaders(messageHeaders), headers); + assertEquals(2, headers.size()); + assertTrue(headers.getAccept().isEmpty()); + assertEquals(MediaType.TEXT_XML, headers.getContentType()); + assertEquals(1, headers.get("foobar").size()); + assertEquals("abc", headers.getFirst("foobar")); + } @Test public void validateCustomHeaderNamesMappedFromHttpHeaders() throws Exception{