[ 
https://issues.apache.org/jira/browse/CAMEL-13886?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tadayoshi Sato updated CAMEL-13886:
-----------------------------------
    Description: 
A Rest DSL route like the following causes {{java.io.IOException: Stream 
closed}} when invoked at http://localhost:8000/test/proxy:
{code:java}
        rest("/test")
                .get("/proxy")
                .to("direct:callInternalRestService");

        from("direct:callInternalRestService")
                .setHeader(Exchange.HTTP_METHOD, constant("DELETE"))
                //.setBody(constant("")) // workaround for null body and http4 
component
                .to("http4://localhost:9000/test?bridgeEndpoint=true")
                .log("${body}");
{code}

The error stacktrace:
{code}
Caused by: java.io.IOException: Stream closed
        at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:372)
        at 
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:156)
        at org.apache.camel.util.IOHelper.copy(IOHelper.java:202)
        at org.apache.camel.util.IOHelper.copy(IOHelper.java:174)
        at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:234)
        at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:230)
        at 
org.apache.camel.http.common.HttpHelper.readResponseBodyFromInputStream(HttpHelper.java:245)
        at 
org.apache.camel.http.common.HttpHelper.readRequestBodyFromServletRequest(HttpHelper.java:196)
        at 
org.apache.camel.http.common.DefaultHttpBinding.parseBody(DefaultHttpBinding.java:577)
        at 
org.apache.camel.http.common.HttpMessage.createBody(HttpMessage.java:78)
        ... 54 common frames omitted
{code}

-This seems to happen only when Tomcat is used as the container with Spring 
Boot. Undertow doesn't cause such an issue.-

The real root cause is that when an exchange has an {{HttpMessage}} with 
{{null}} body as its out message, then the next time {{Exchange.getMessage()}} 
is invoked the {{HttpMessage}} is tricked by the {{null}} body and tries to 
create body again with the already closed request input stream.

  was:
A Rest DSL route like the following causes {{java.io.IOException: Stream 
closed}} when invoked at http://localhost:8000/test/proxy:
{code:java}
        rest("/test")
                .get("/proxy")
                .to("direct:callInternalRestService");

        from("direct:callInternalRestService")
                .setHeader(Exchange.HTTP_METHOD, constant("DELETE"))
                //.setBody(constant("")) // workaround for null body and http4 
component
                .to("http4://localhost:9000/test?bridgeEndpoint=true")
                .log("${body}");
{code}

The error stacktrace:
{code}
Caused by: java.io.IOException: Stream closed
        at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:372)
        at 
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:156)
        at org.apache.camel.util.IOHelper.copy(IOHelper.java:202)
        at org.apache.camel.util.IOHelper.copy(IOHelper.java:174)
        at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:234)
        at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:230)
        at 
org.apache.camel.http.common.HttpHelper.readResponseBodyFromInputStream(HttpHelper.java:245)
        at 
org.apache.camel.http.common.HttpHelper.readRequestBodyFromServletRequest(HttpHelper.java:196)
        at 
org.apache.camel.http.common.DefaultHttpBinding.parseBody(DefaultHttpBinding.java:577)
        at 
org.apache.camel.http.common.HttpMessage.createBody(HttpMessage.java:78)
        ... 54 common frames omitted
{code}

-This seems to happen only when Tomcat is used as the container with Spring 
Boot. Undertow doesn't cause such an issue.-


> camel-servlet + camel-http4 with null body causes "Stream closed" IOException
> -----------------------------------------------------------------------------
>
>                 Key: CAMEL-13886
>                 URL: https://issues.apache.org/jira/browse/CAMEL-13886
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-http-common, camel-http4, camel-servlet
>    Affects Versions: 2.25.0, 3.0.0.M4
>            Reporter: Tadayoshi Sato
>            Assignee: Tadayoshi Sato
>            Priority: Major
>
> A Rest DSL route like the following causes {{java.io.IOException: Stream 
> closed}} when invoked at http://localhost:8000/test/proxy:
> {code:java}
>         rest("/test")
>                 .get("/proxy")
>                 .to("direct:callInternalRestService");
>         from("direct:callInternalRestService")
>                 .setHeader(Exchange.HTTP_METHOD, constant("DELETE"))
>                 //.setBody(constant("")) // workaround for null body and 
> http4 component
>                 .to("http4://localhost:9000/test?bridgeEndpoint=true")
>                 .log("${body}");
> {code}
> The error stacktrace:
> {code}
> Caused by: java.io.IOException: Stream closed
>       at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:372)
>       at 
> org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:156)
>       at org.apache.camel.util.IOHelper.copy(IOHelper.java:202)
>       at org.apache.camel.util.IOHelper.copy(IOHelper.java:174)
>       at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:234)
>       at org.apache.camel.util.IOHelper.copyAndCloseInput(IOHelper.java:230)
>       at 
> org.apache.camel.http.common.HttpHelper.readResponseBodyFromInputStream(HttpHelper.java:245)
>       at 
> org.apache.camel.http.common.HttpHelper.readRequestBodyFromServletRequest(HttpHelper.java:196)
>       at 
> org.apache.camel.http.common.DefaultHttpBinding.parseBody(DefaultHttpBinding.java:577)
>       at 
> org.apache.camel.http.common.HttpMessage.createBody(HttpMessage.java:78)
>       ... 54 common frames omitted
> {code}
> -This seems to happen only when Tomcat is used as the container with Spring 
> Boot. Undertow doesn't cause such an issue.-
> The real root cause is that when an exchange has an {{HttpMessage}} with 
> {{null}} body as its out message, then the next time 
> {{Exchange.getMessage()}} is invoked the {{HttpMessage}} is tricked by the 
> {{null}} body and tries to create body again with the already closed request 
> input stream.



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to