This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch camel-2.22.x
in repository https://gitbox.apache.org/repos/asf/camel.git

commit f3057d75b7548e09eb62892b503c4abc8544b1b7
Author: Bob Paulin <b...@bobpaulin.com>
AuthorDate: Wed Aug 29 22:24:43 2018 -0500

    CAMEL-12751 - Default http4 producer to ignore content-length header.
---
 .../src/main/java/org/apache/camel/Exchange.java   |  1 +
 .../apache/camel/component/http4/HttpEndpoint.java | 13 ++++++
 .../camel/component/http4/HttpEntityConverter.java |  3 +-
 .../apache/camel/component/http4/HttpProducer.java |  7 +++-
 .../http4/HttpProducerContentLengthTest.java       | 49 ++++++++++++++++++----
 5 files changed, 64 insertions(+), 9 deletions(-)

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 6ca2ac6..ded516f 100644
--- a/camel-core/src/main/java/org/apache/camel/Exchange.java
+++ b/camel-core/src/main/java/org/apache/camel/Exchange.java
@@ -160,6 +160,7 @@ public interface Exchange {
     String HTTP_SERVLET_REQUEST    = "CamelHttpServletRequest";
     String HTTP_SERVLET_RESPONSE   = "CamelHttpServletResponse";
 
+    String IGNORE_CONTENT_LENGTH_HEADER   = "CamelIgnoreContentLengthHeader";
     String INTERCEPTED_ENDPOINT = "CamelInterceptedEndpoint";
     String INTERCEPT_SEND_TO_ENDPOINT_WHEN_MATCHED = 
"CamelInterceptSendToEndpointWhenMatched";
     String INTERRUPTED = "CamelInterrupted";
diff --git 
a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
 
b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
index 3c8f875..be54d54 100644
--- 
a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
+++ 
b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
@@ -108,6 +108,8 @@ public class HttpEndpoint extends HttpCommonEndpoint {
     private int connectionsPerRoute;
     @UriParam(label = "security", description = "To use a custom 
X509HostnameVerifier such as DefaultHostnameVerifier or NoopHostnameVerifier")
     private HostnameVerifier x509HostnameVerifier;
+    @UriParam(label = "producer,proxy", description = "Ignore Content-Length 
Header")
+    private boolean ignoreContentLengthHeader = true;
 
     public HttpEndpoint() {
     }
@@ -454,5 +456,16 @@ public class HttpEndpoint extends HttpCommonEndpoint {
     public void setSocketTimeout(int socketTimeout) {
         this.socketTimeout = socketTimeout;
     }
+    
+    /**
+     * Ignore Content-Length Header
+     */
+    public boolean isIgnoreContentLengthHeader() {
+        return ignoreContentLengthHeader;
+    }
+    
+    public void setIgnoreContentLengthHeader(boolean 
ignoreContentLengthHeader) {
+        this.ignoreContentLengthHeader = ignoreContentLengthHeader;
+    }
 
 }
diff --git 
a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEntityConverter.java
 
b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEntityConverter.java
index bcbe502..f827112 100644
--- 
a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEntityConverter.java
+++ 
b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEntityConverter.java
@@ -72,7 +72,8 @@ public final class HttpEntityConverter {
             Message inMessage = exchange.getIn();
             String length = inMessage.getHeader(Exchange.CONTENT_LENGTH, 
String.class);
             
-            if (ObjectHelper.isEmpty(length)) {
+            if (exchange.getProperty(Exchange.IGNORE_CONTENT_LENGTH_HEADER, 
Boolean.FALSE, Boolean.class) || 
+                    ObjectHelper.isEmpty(length)) {
                 entity = new InputStreamEntity(in, -1);
             } else {
                 entity = new InputStreamEntity(in, Long.parseLong(length));
diff --git 
a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
 
b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
index 36f49ff..6654a26 100644
--- 
a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
+++ 
b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
@@ -111,6 +111,10 @@ public class HttpProducer extends DefaultProducer {
                 skipRequestHeaders = URISupport.parseQuery(queryString, false, 
true);
             }
         }
+        
+        if(getEndpoint().isIgnoreContentLengthHeader()) {
+            exchange.setProperty(Exchange.IGNORE_CONTENT_LENGTH_HEADER, 
Boolean.TRUE);
+        }
         HttpRequestBase httpRequest = createMethod(exchange);
         Message in = exchange.getIn();
         String httpProtocolVersion = 
in.getHeader(Exchange.HTTP_PROTOCOL_VERSION, String.class);
@@ -560,7 +564,8 @@ public class HttpProducer extends DefaultProducer {
                         InputStream is = 
in.getMandatoryBody(InputStream.class);
                         String length = in.getHeader(Exchange.CONTENT_LENGTH, 
String.class);
                         InputStreamEntity entity = null;
-                        if (ObjectHelper.isEmpty(length)) {
+                        if 
(exchange.getProperty(Exchange.IGNORE_CONTENT_LENGTH_HEADER, Boolean.FALSE, 
Boolean.class) ||
+                                ObjectHelper.isEmpty(length)) {
                             entity = new InputStreamEntity(is, -1);
                         } else {
                             entity = new InputStreamEntity(is, 
Long.parseLong(length));
diff --git 
a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProducerContentLengthTest.java
 
b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProducerContentLengthTest.java
index 462f62b..fc28b86 100644
--- 
a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProducerContentLengthTest.java
+++ 
b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProducerContentLengthTest.java
@@ -52,17 +52,35 @@ public class HttpProducerContentLengthTest extends 
BaseHttpTest {
                 setResponseFactory(getHttpResponseFactory()).
                 setExpectationVerifier(getHttpExpectationVerifier()).
                 setSslContext(getSSLContext()).
-                registerHandler("/content", new HttpRequestHandler() {
+                registerHandler("/content-ignore", new HttpRequestHandler() {
                     @Override
                     public void handle(HttpRequest request, HttpResponse 
response, HttpContext context) throws HttpException, IOException {
                         Header contentLengthHeader = 
request.getFirstHeader(Exchange.CONTENT_LENGTH);
                         String contentLength = contentLengthHeader != null ? 
contentLengthHeader.getValue() : "";
+                        Header transferEncodingHeader = 
request.getFirstHeader(Exchange.TRANSFER_ENCODING);
+                        String transferEncoding = transferEncodingHeader != 
null ? transferEncodingHeader.getValue() : "";
                         
-                        //Should we expect the length in the case that we 
remove the header or should the header be empty?
-                        assertEquals(Integer.toString(bodyContent.length()), 
contentLength);
+                        //Request Body Chunked if no Content-Length set.
+                        assertEquals("", contentLength);
+                        assertEquals("chunked", transferEncoding);
                         response.setStatusCode(HttpStatus.SC_OK);
                     }
-                }).create();
+                }).registerHandler("/content-no-ignore", new 
HttpRequestHandler() {
+                    @Override
+                    public void handle(HttpRequest request, HttpResponse 
response, HttpContext context) throws HttpException, IOException {
+                        Header contentLengthHeader = 
request.getFirstHeader(Exchange.CONTENT_LENGTH);
+                        String contentLength = contentLengthHeader != null ? 
contentLengthHeader.getValue() : "";
+                        Header transferEncodingHeader = 
request.getFirstHeader(Exchange.TRANSFER_ENCODING);
+                        String transferEncoding = transferEncodingHeader != 
null ? transferEncodingHeader.getValue() : "";
+                        
+                        //Content-Length was overridden to 10
+                        assertEquals("10", contentLength);
+                        assertEquals("", transferEncoding);
+                        response.setStatusCode(HttpStatus.SC_OK);
+                    }
+                })
+                .create();
+            
         localServer.start();
 
         super.setUp();
@@ -79,14 +97,31 @@ public class HttpProducerContentLengthTest extends 
BaseHttpTest {
     }
     
     @Test
-    public void testContentLengthIncorrect() throws Exception {
-        Exchange out = template.request("http4://" + 
localServer.getInetAddress().getHostName() + ":" + localServer.getLocalPort() + 
"/content", new Processor() {
+    public void testContentLengthIgnore() throws Exception {
+        Exchange out = template.request("http4://" + 
localServer.getInetAddress().getHostName() + ":" + localServer.getLocalPort() + 
"/content-ignore?bridgeEndpoint=true", new Processor() {
 
             @Override
             public void process(Exchange exchange) throws Exception {
                 exchange.getIn().setHeader(Exchange.CONTENT_LENGTH, "1000");
                 exchange.getIn().setHeader(Exchange.CONTENT_TYPE, 
"application/json");
-                exchange.setProperty(Exchange.SKIP_GZIP_ENCODING, 
Boolean.TRUE);
+                exchange.getIn().setBody(new ByteArrayInputStreamCache(new 
ByteArrayInputStream(bodyContent.getBytes())));
+            }
+            
+        });
+
+        assertNotNull(out);
+        assertFalse("Should not fail", out.isFailed());
+        
+    }
+    
+    @Test
+    public void testContentLengthNoIgnore() throws Exception {
+        Exchange out = template.request("http4://" + 
localServer.getInetAddress().getHostName() + ":" + localServer.getLocalPort() + 
"/content-no-ignore?bridgeEndpoint=true&ignoreContentLengthHeader=false", new 
Processor() {
+
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Exchange.CONTENT_LENGTH, "10");
+                exchange.getIn().setHeader(Exchange.CONTENT_TYPE, 
"application/json");
                 exchange.getIn().setBody(new ByteArrayInputStreamCache(new 
ByteArrayInputStream(bodyContent.getBytes())));
             }
             

Reply via email to