You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Petr Miko (JIRA)" <ji...@apache.org> on 2015/06/02 08:02:18 UTC

[jira] [Comment Edited] (CXF-6427) Incorrect Response InputStream closing in AbstractClient

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

Petr Miko edited comment on CXF-6427 at 6/2/15 6:01 AM:
--------------------------------------------------------

But this is not the case as far as I am aware - this is about serialized object, whose inputStream is not being closed in mentioned method due to, IMO incorrect condition. *InputStream inputStream = (InputStream)r.getEntity();* this stream from *AbstractClient.readBody(Response,Messge, Class, Type, Annotation[])* method. The point of this issue is, that if received message IS NOT InputStream, please do close the stream used to read the message in AbstractClient.


was (Author: petrmiko):
But this is not the case as far as I am aware - this is about serialized object, whose inputStream is not being closed in mentioned method due to, IMO incorrect condition. *InputStream inputStream = (InputStream)r.getEntity();* this stream. The point of this issue is, that if received message IS NOT InputStream, please do close the stream used to read the message in AbstractClient.

> Incorrect Response InputStream closing in AbstractClient
> --------------------------------------------------------
>
>                 Key: CXF-6427
>                 URL: https://issues.apache.org/jira/browse/CXF-6427
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 2.7.16
>            Reporter: Petr Miko
>            Assignee: Sergey Beryozkin
>             Fix For: Invalid
>
>
> In current implementation of _org.apache.cxf.jaxrs.client.AbstractClient_ is response body input stream closed in following method
> {noformat}
>     protected boolean responseStreamCanBeClosed(Message outMessage, Class<?> cls) {
>         return cls != InputStream.class
>             && MessageUtils.isTrue(outMessage.getContextualProperty("response.stream.auto.close"));
>     } 
> {noformat}
> That means, that in case that if the _response.stream.auto.close_ is not set to true, the input stream stays opened -> Socket is not free for reusing. 
> In my opinion the proper implementation should be:
> {noformat}
>   protected boolean responseStreamCanBeClosed(Message outMessage, Class<?> cls) {
>     return !cls.isAssignableFrom(InputStream.class) || MessageUtils.isTrue(outMessage.getContextualProperty("response.stream.auto.close"));
>   }
> {noformat}  
> This way is the response body input stream:
> * is closed even when the auto close property is not set (= default?) and cls is not a child of InputStream
> * the input stream is not closed, if cls is child of InputStream class (do not know if there might be cases of its subclasses) and the auto close property is not set to true
> * the auto close property still can over-rule the fact that the cls is assignable from InputStream
> The current implementation is in my opinion incorrect, because in case of a lot quick/parallel requests over proxy clients we faced running out of Sockets - similarly to what is described in CXF-5144



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