hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hirthwork <...@git.apache.org>
Subject [GitHub] httpcore pull request: Set EmptyInputStream in entity instead of C...
Date Wed, 12 Nov 2014 17:21:55 GMT
GitHub user hirthwork opened a pull request:

    https://github.com/apache/httpcore/pull/8

    Set EmptyInputStream in entity instead of ContentLengthInputStream(in, 0)

    # Problem description
    1. If HttpClient receives response with `Content-Length: 0` the connection won't be returned
to connection pool until `entity.getContent().close()` is called (it is usually done by `EntityUtils.consume()`)
or any read operation performed on `entity.getContent()`.
    2. If CloseableHttpResponse.close() is called on such response without entity consuming,
the connection will be closed, despite of any keep-alive strategies.
    
    Here the [sample](https://gist.github.com/hirthwork/6f4ebb047e77a61f644e) illustrating
first problem. Trying to execute two sequential requests with maxPerRoute set to 1 we will
hit TimeoutException because connection from first response (which has empty body) won't be
returned to pool.
    
    # Problem analysis
    Current BHttpConnectionBase contract is to set input stream regardless of `Content-Length:`
header value. The only way to distinct empty response entities from regular ones is to set
entity content to some pre-defined value which can indicate that entity is not streaming,
so `MainClientExec.execute()` can return connection to pool immediately.
    
    # Solution
    Introduce `EmptyInputStream` singleton which will be set as BasicHttpEntity content on
zero length responses. `isStreaming()` will check content for nullness and equality with `EmptyInputStream.INSTANCE`.
    As alternative, suggested solution can be applied to 4.4.x branch, while for 5.0 branch
contract can be broken and `prepareInput()` will return null for zero-length responses.
    
    # Test
    Aforementioned sample can be used for this solution testing.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/hirthwork/httpcore trunk

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/httpcore/pull/8.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #8
    
----
commit f52e25482c1b4d5b518656122188c9cab99ac5ed
Author: Dmitry Potapov <dpotapov@yandex-team.ru>
Date:   2014-11-12T16:58:45Z

    Set EmptyInputStream in entity instead of ContentLengthInputStream(inbuffer, 0)

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org


Mime
View raw message