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

Petr Miko updated CXF-6427:
---------------------------
    Description: 
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)

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

  was:
In current implementation of 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)

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


> 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
>
> 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)
> 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)

Reply via email to