You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ts...@apache.org on 2019/09/13 02:28:44 UTC

[camel] branch master updated: CAMEL-13886: camel-servlet + camel-http4 with null body causes "Stream closed" IOException

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

tsato pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 1db32cb  CAMEL-13886: camel-servlet + camel-http4 with null body causes "Stream closed" IOException
1db32cb is described below

commit 1db32cb51c0a4f28d603003f9a4aeec5dc5a30cf
Author: Tadayoshi Sato <sa...@gmail.com>
AuthorDate: Thu Sep 12 18:19:06 2019 +0900

    CAMEL-13886: camel-servlet + camel-http4 with null body causes "Stream closed" IOException
    
    Normally servlet request can be read only once, but when
    Exchange#getOut() is invoked HttpMessage may be copied for the out
    message with the original request that has been already read.
    This fix protects it from being read again.
---
 .../java/org/apache/camel/http/common/HttpMessage.java    | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpMessage.java b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpMessage.java
index 213566c..de79734 100644
--- a/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpMessage.java
+++ b/components/camel-http-common/src/main/java/org/apache/camel/http/common/HttpMessage.java
@@ -30,9 +30,11 @@ public class HttpMessage extends DefaultMessage {
     private final HttpServletRequest request;
     private final HttpServletResponse response;
     private final HttpCommonEndpoint endpoint;
+    private boolean requestRead;
 
     public HttpMessage(Exchange exchange, HttpCommonEndpoint endpoint, HttpServletRequest request, HttpServletResponse response) {
         super(exchange);
+        this.requestRead = false;
         this.endpoint = endpoint;
 
         this.request = request;
@@ -52,11 +54,13 @@ public class HttpMessage extends DefaultMessage {
         endpoint.getHttpBinding().readRequest(request, this);
     }
 
-    private HttpMessage(HttpServletRequest request, HttpServletResponse response, Exchange exchange, HttpCommonEndpoint endpoint) {
+    private HttpMessage(HttpServletRequest request, HttpServletResponse response, Exchange exchange, HttpCommonEndpoint endpoint,
+                        boolean requestRead) {
         super(exchange);
         this.request = request;
         this.response = response;
         this.endpoint = endpoint;
+        this.requestRead = requestRead;
     }
 
     public HttpServletRequest getRequest() {
@@ -69,16 +73,23 @@ public class HttpMessage extends DefaultMessage {
 
     @Override
     protected Object createBody() {
+        // HTTP request may be read only once
+        if (requestRead) {
+            return null;
+        }
+
         try {
             return endpoint.getHttpBinding().parseBody(this);
         } catch (IOException e) {
             throw new RuntimeCamelException(e);
+        } finally {
+            requestRead = true;
         }
     }
 
     @Override
     public HttpMessage newInstance() {
-        return new HttpMessage(request, response, getExchange(), endpoint);
+        return new HttpMessage(request, response, getExchange(), endpoint, requestRead);
     }
 
     @Override