CAMEL-7426 camel-http endpoint should skip reading the form body if it is bridgeEndpoint
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b8b0c37e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b8b0c37e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b8b0c37e Branch: refs/heads/master Commit: b8b0c37ef329a8d22b83c047950cd076406456d1 Parents: eac70a6 Author: Willem Jiang <willem.ji...@gmail.com> Authored: Fri May 9 16:38:30 2014 +0800 Committer: Willem Jiang <willem.ji...@gmail.com> Committed: Fri May 9 16:54:02 2014 +0800 ---------------------------------------------------------------------- .../main/java/org/apache/camel/Exchange.java | 1 + .../camel/component/http/CamelServlet.java | 1 + .../component/http/DefaultHttpBinding.java | 6 ++- .../camel/component/http/HttpMessage.java | 6 +++ components/camel-jetty/patchfile.txt | 40 ++++++++++++++++++++ .../jetty/CamelContinuationServlet.java | 1 + .../component/jetty/HttpProxyRouteTest.java | 21 ++++++++++ 7 files changed, 74 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/b8b0c37e/camel-core/src/main/java/org/apache/camel/Exchange.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/Exchange.java b/camel-core/src/main/java/org/apache/camel/Exchange.java index f9f3fe3..f8c6a90 100644 --- a/camel-core/src/main/java/org/apache/camel/Exchange.java +++ b/camel-core/src/main/java/org/apache/camel/Exchange.java @@ -179,6 +179,7 @@ public interface Exchange { String SOAP_ACTION = "CamelSoapAction"; String SKIP_GZIP_ENCODING = "CamelSkipGzipEncoding"; + String SKIP_WWW_FORM_URLENCODED = "CamelSkipWwwFormUrlEncoding"; String SLIP_ENDPOINT = "CamelSlipEndpoint"; String SPLIT_INDEX = "CamelSplitIndex"; String SPLIT_COMPLETE = "CamelSplitComplete"; http://git-wip-us.apache.org/repos/asf/camel/blob/b8b0c37e/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java ---------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java b/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java index a56257c..cbfded3 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/CamelServlet.java @@ -89,6 +89,7 @@ public class CamelServlet extends HttpServlet { if (consumer.getEndpoint().isBridgeEndpoint()) { exchange.setProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.TRUE); + exchange.setProperty(Exchange.SKIP_WWW_FORM_URLENCODED, Boolean.TRUE); } if (consumer.getEndpoint().isDisableStreamCache()) { exchange.setProperty(Exchange.DISABLE_HTTP_STREAM_CACHE, Boolean.TRUE); http://git-wip-us.apache.org/repos/asf/camel/blob/b8b0c37e/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java b/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java index dd74c43..49b9a47 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java @@ -171,9 +171,11 @@ public class DefaultHttpBinding implements HttpBinding { } LOG.trace("HTTP method {} with Content-Type {}", request.getMethod(), request.getContentType()); - + Boolean flag = message.getHeader(Exchange.SKIP_WWW_FORM_URLENCODED, Boolean.class); + boolean skipWwwFormUrlEncoding = flag != null ? flag : false; if (request.getMethod().equals("POST") && request.getContentType() != null - && request.getContentType().startsWith(HttpConstants.CONTENT_TYPE_WWW_FORM_URLENCODED)) { + && request.getContentType().startsWith(HttpConstants.CONTENT_TYPE_WWW_FORM_URLENCODED) + && !skipWwwFormUrlEncoding) { String charset = request.getCharacterEncoding(); if (charset == null) { charset = "UTF-8"; http://git-wip-us.apache.org/repos/asf/camel/blob/b8b0c37e/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java ---------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java index 80a6614..8218f2d 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpMessage.java @@ -40,6 +40,12 @@ public class HttpMessage extends DefaultMessage { // Put the request and response into the message header this.setHeader(Exchange.HTTP_SERVLET_REQUEST, request); this.setHeader(Exchange.HTTP_SERVLET_RESPONSE, response); + + // Check the setting of exchange + Boolean flag = exchange.getProperty(Exchange.SKIP_WWW_FORM_URLENCODED, Boolean.class); + if (flag != null && flag) { + this.setHeader(Exchange.SKIP_WWW_FORM_URLENCODED, Boolean.TRUE); + } // use binding to read the request allowing end users to use their // implementation of the binding http://git-wip-us.apache.org/repos/asf/camel/blob/b8b0c37e/components/camel-jetty/patchfile.txt ---------------------------------------------------------------------- diff --git a/components/camel-jetty/patchfile.txt b/components/camel-jetty/patchfile.txt new file mode 100644 index 0000000..fbe75ec --- /dev/null +++ b/components/camel-jetty/patchfile.txt @@ -0,0 +1,40 @@ +diff --git src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java +index 670a4a5..adc504f 100644 +--- src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java ++++ src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java +@@ -299,6 +299,8 @@ public class JettyHttpComponent extends HttpComponent { + // just set if we need sendServerVersion, the default value is true + server.setSendServerVersion(endpoint.isSendServerVersion()); + server.addConnector(connector); ++ ++ server.setSendDateHeader(endpoint.isSendDateHeader()); + + connectorRef = new ConnectorRef(server, connector, createServletForConnector(server, connector, endpoint.getHandlers(), endpoint)); + // must enable session before we start +diff --git src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java +index 089e159..ea04e6e 100644 +--- src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java ++++ src/main/java/org/apache/camel/component/jetty/JettyHttpEndpoint.java +@@ -49,6 +49,7 @@ public class JettyHttpEndpoint extends HttpEndpoint { + private boolean enableJmx; + private boolean enableMultipartFilter; + private boolean sendServerVersion = true; ++ private boolean sendDateHeader = false; + private Filter multipartFilter; + private List<Filter> filters; + private Long continuationTimeout; +@@ -176,6 +177,14 @@ public class JettyHttpEndpoint extends HttpEndpoint { + this.sendServerVersion = sendServerVersion; + } + ++ public boolean isSendDateHeader() { ++ return sendDateHeader; ++ } ++ ++ public void setSendDateHeader(boolean sendDateHeader) { ++ this.sendDateHeader = sendDateHeader; ++ } ++ + public boolean isEnableMultipartFilter() { + return enableMultipartFilter; + } http://git-wip-us.apache.org/repos/asf/camel/blob/b8b0c37e/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java index 6dc0581..7e48d2e 100644 --- a/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java +++ b/components/camel-jetty/src/main/java/org/apache/camel/component/jetty/CamelContinuationServlet.java @@ -103,6 +103,7 @@ public class CamelContinuationServlet extends CamelServlet { if (consumer.getEndpoint().isBridgeEndpoint()) { exchange.setProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.TRUE); + exchange.setProperty(Exchange.SKIP_WWW_FORM_URLENCODED, Boolean.TRUE); } if (consumer.getEndpoint().isDisableStreamCache()) { exchange.setProperty(Exchange.DISABLE_HTTP_STREAM_CACHE, Boolean.TRUE); http://git-wip-us.apache.org/repos/asf/camel/blob/b8b0c37e/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java index da93bce..e0188f6 100644 --- a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java +++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpProxyRouteTest.java @@ -17,6 +17,8 @@ package org.apache.camel.component.jetty; import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.util.StopWatch; import org.apache.camel.util.TimeUtils; @@ -53,6 +55,12 @@ public class HttpProxyRouteTest extends BaseJettyTest { String out = template.requestBody("http://localhost:{{port}}/proxyServer", null, String.class); assertEquals("Get a wrong host header", "localhost:" + getPort2(), out); } + + @Test + public void testHttpProxyFormHeader() throws Exception { + String out = template.requestBodyAndHeader("http://localhost:{{port}}/form", "username=abc&pass=password", Exchange.CONTENT_TYPE, "application/x-www-form-urlencoded", String.class); + assertEquals("Get a wrong response message", "username=abc&pass=password", out); + } protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @@ -71,6 +79,19 @@ public class HttpProxyRouteTest extends BaseJettyTest { .to("http://localhost:{{port2}}/host?bridgeEndpoint=true"); from("jetty://http://localhost:{{port2}}/host").transform(header("host")); + + // check the from request + from("jetty://http://localhost:{{port}}/form?bridgeEndpoint=true") + .process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + // just take out the message body and send it back + Message in = exchange.getIn(); + String request = in.getBody(String.class); + exchange.getOut().setBody(request); + } + + }); } }; }