camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CAMEL-9768) HTTP[4] component disableStreamCache issue: java.io.IOException: Attempted read from closed stream.
Date Thu, 07 Apr 2016 08:43:25 GMT

    [ https://issues.apache.org/jira/browse/CAMEL-9768?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15229924#comment-15229924
] 

ASF GitHub Bot commented on CAMEL-9768:
---------------------------------------

Github user asfgit closed the pull request at:

    https://github.com/apache/camel/pull/932


> HTTP[4] component disableStreamCache issue: java.io.IOException: Attempted read from
closed stream.
> ---------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-9768
>                 URL: https://issues.apache.org/jira/browse/CAMEL-9768
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-http4
>    Affects Versions: 2.17.0
>            Reporter: Edward Welch
>            Assignee: Claus Ibsen
>             Fix For: 2.17.1, 2.18.0
>
>
> This issue is related to CAMEL-7638 which was recently fixed/released in 2.17.0
> I was doing some testing with disableStreamCache=true on a http4 producer and am getting
"java.io.IOException: Attempted read from closed stream"
> The stack trace shows the error occurring when trying to copy the input stream to an
output stream inside the DefaultHttpBinding copyStream methods (i am using camel as a proxy
from a sevlet component (consumer) to an http4 component (producer)).
> I think though, I see the root cause of this issue.  Inside the HttpProducer process
method.
> {code}
> // lets store the result in the output message.
>         HttpResponse httpResponse = null;
>         try {
>             if (LOG.isDebugEnabled()) {
>                 LOG.debug("Executing http {} method: {}", httpRequest.getMethod(), httpRequest.getURI().toString());
>             }
>             httpResponse = executeMethod(httpRequest);
>             int responseCode = httpResponse.getStatusLine().getStatusCode();
>             LOG.debug("Http responseCode: {}", responseCode);
>             if (!throwException) {
>                 // if we do not use failed exception then populate response for all response
codes
>                 populateResponse(exchange, httpRequest, httpResponse, in, strategy, responseCode);
>             } else {
>                 boolean ok = HttpHelper.isStatusCodeOk(responseCode, getEndpoint().getOkStatusCodeRange());
>                 if (ok) {
>                     // only populate response for OK response
>                     populateResponse(exchange, httpRequest, httpResponse, in, strategy,
responseCode);
>                 } else {
>                     // operation failed so populate exception to throw
>                     throw populateHttpOperationFailedException(exchange, httpRequest,
httpResponse, responseCode);
>                 }
>             }
>         } finally {
>             if (httpResponse != null) {
>                 try {
>                     EntityUtils.consume(httpResponse.getEntity());
>                 } catch (IOException e) {
>                     // nothing we could do
>                 }
>             }
>         }
> {code}
> Specifically, that finally block at the end.
> When disableStreamCache=true is set on the Producer, the raw input stream is put in the
exchange body, which was the change fixed by CAMEL-7638
> However, the finally block is consuming and closing that input stream making it unusable
later when we try to copy it to the servlet output stream to send back to the caller.
> I think the fix for this would be to check the endpoint to see if disableStreamCaching
is set prior to consuming the entity in the finally block, perhaps something like this:
> {code}
>     ...
>     } finally {
>             if (httpResponse != null && !getEndpoint().isDisableStreamCache())
{
>                 try {
>                     EntityUtils.consume(httpResponse.getEntity());
>                 } catch (IOException e) {
>                     // nothing we could do
>                 }
>             }
>         }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message