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() {

Reply via email to