[
https://issues.apache.org/jira/browse/CAMEL-9768?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15218352#comment-15218352
]
Edward Welch commented on CAMEL-9768:
-------------------------------------
I've not done a PR before but willing to give it a try!
> 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
> Fix For: 2.18.0, 2.17.1
>
>
> 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)