Updated Branches: refs/heads/camel-2.12.x 7db4d7e02 -> 379ca058a refs/heads/master cdad658ca -> 0ab6bba5b
CAMEL-6872: Do not decode Content-Type header by deafult. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/0ab6bba5 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/0ab6bba5 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/0ab6bba5 Branch: refs/heads/master Commit: 0ab6bba5b2abdba6b30202c4c982ac731af23bb1 Parents: cdad658 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Oct 30 14:17:23 2013 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Oct 30 14:18:13 2013 +0100 ---------------------------------------------------------------------- .../netty/http/DefaultNettyHttpBinding.java | 30 +++++++++++++++++--- .../netty/http/NettyHttpContentTypeTest.java | 16 +++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/0ab6bba5/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java index 84d315b..f6c6c45 100644 --- a/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java +++ b/components/camel-netty-http/src/main/java/org/apache/camel/component/netty/http/DefaultNettyHttpBinding.java @@ -20,6 +20,7 @@ import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLDecoder; import java.nio.charset.Charset; @@ -153,7 +154,7 @@ public class DefaultNettyHttpBinding implements NettyHttpBinding { Iterator<?> it = ObjectHelper.createIterator(values); while (it.hasNext()) { Object extracted = it.next(); - Object decoded = configuration.isUrlDecodeHeaders() ? URLDecoder.decode(extracted.toString(), "UTF-8") : extracted.toString(); + Object decoded = shouldUrlDecodeHeader(configuration, name, extracted, "UTF-8"); LOG.trace("HTTP-header: {}", extracted); if (headerFilterStrategy != null && !headerFilterStrategy.applyFilterToExternalHeaders(name, decoded, exchange)) { @@ -173,7 +174,7 @@ public class DefaultNettyHttpBinding implements NettyHttpBinding { Iterator<?> it = ObjectHelper.createIterator(values); while (it.hasNext()) { Object extracted = it.next(); - Object decoded = configuration.isUrlDecodeHeaders() ? URLDecoder.decode(extracted.toString(), "UTF-8") : extracted.toString(); + Object decoded = shouldUrlDecodeHeader(configuration, name, extracted, "UTF-8"); LOG.trace("URI-Parameter: {}", extracted); if (headerFilterStrategy != null && !headerFilterStrategy.applyFilterToExternalHeaders(name, decoded, exchange)) { @@ -195,8 +196,8 @@ public class DefaultNettyHttpBinding implements NettyHttpBinding { for (String param : body.split("&")) { String[] pair = param.split("=", 2); if (pair.length == 2) { - String name = configuration.isUrlDecodeHeaders() ? URLDecoder.decode(pair[0], charset) : pair[0]; - String value = configuration.isUrlDecodeHeaders() ? URLDecoder.decode(pair[1], charset) : pair[1]; + String name = shouldUrlDecodeHeader(configuration, "", pair[0], charset); + String value = shouldUrlDecodeHeader(configuration, name, pair[1], charset); if (headerFilterStrategy != null && !headerFilterStrategy.applyFilterToExternalHeaders(name, value, exchange)) { NettyHttpHelper.appendHeader(headers, name, value); @@ -210,6 +211,27 @@ public class DefaultNettyHttpBinding implements NettyHttpBinding { } + /** + * Decodes the header if needed to, or returns the header value as is. + * + * @param configuration the configuration + * @param headerName the header name + * @param value the current header value + * @param charset the charset to use for decoding + * @return the decoded value (if decoded was needed) or a <tt>toString</tt> representation of the value. + * @throws UnsupportedEncodingException is thrown if error decoding. + */ + protected String shouldUrlDecodeHeader(NettyHttpConfiguration configuration, String headerName, Object value, String charset) throws UnsupportedEncodingException { + // do not decode Content-Type + if (Exchange.CONTENT_TYPE.equals(headerName)) { + return value.toString(); + } else if (configuration.isUrlDecodeHeaders()) { + return URLDecoder.decode(value.toString(), charset); + } else { + return value.toString(); + } + } + @Override public Message toCamelMessage(HttpResponse response, Exchange exchange, NettyHttpConfiguration configuration) throws Exception { LOG.trace("toCamelMessage: {}", response); http://git-wip-us.apache.org/repos/asf/camel/blob/0ab6bba5/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpContentTypeTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpContentTypeTest.java b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpContentTypeTest.java index 7828856..8499c52 100644 --- a/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpContentTypeTest.java +++ b/components/camel-netty-http/src/test/java/org/apache/camel/component/netty/http/NettyHttpContentTypeTest.java @@ -56,6 +56,22 @@ public class NettyHttpContentTypeTest extends BaseNettyTest { assertMockEndpointsSatisfied(); } + @Test + public void testContentTypeWithActionAndPlus() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.CONTENT_TYPE, "application/soap+xml;charset=\"utf-8\";action=\"http://somewhere.com/foo\""); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_CHARACTER_ENCODING, "utf-8"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://0.0.0.0:" + getPort() + "/foo"); + getMockEndpoint("mock:input").expectedPropertyReceived(Exchange.CHARSET_NAME, "utf-8"); + + byte[] data = "Hello World".getBytes(Charset.forName("utf-8")); + String out = template.requestBodyAndHeader("netty-http:http://0.0.0.0:{{port}}/foo", data, + "content-type", "application/soap+xml;charset=\"utf-8\";action=\"http://somewhere.com/foo\"", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() {