hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "John Flavin (JIRA)" <j...@apache.org>
Subject [jira] [Closed] (HTTPCORE-449) IdentityInputStream.available() erroneously returns 0
Date Tue, 21 Mar 2017 17:30:42 GMT

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

John Flavin closed HTTPCORE-449.

Reviewed commit here: https://github.com/apache/httpcore/commit/a5dbd14bc8ea64ff529c4651aaad9bd2d89b9f53

Looks perfect to me. {{IdentityInputStream#available}} checks if there is anything in the
buffer, if so it returns the buffer length, if not it returns the underlying {{InputStream#available}}.
That's exactly what I was asking for.

There is one improvement you could make to the test {{testAvailableInStream}}. Rather than
calling {{in.read(tmp)}} before {{in.available()}}, you could call {{in.available()}} first
and assert that it gives a non-zero value even before you have called {{read}}. It's certainly
not necessary to do, but that test change would assure me that the code is doing what it should.

> IdentityInputStream.available() erroneously returns 0
> -----------------------------------------------------
>                 Key: HTTPCORE-449
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-449
>             Project: HttpComponents HttpCore
>          Issue Type: Improvement
>          Components: HttpCore
>    Affects Versions: 4.4.5, 4.4.6
>            Reporter: John Flavin
>            Priority: Minor
>             Fix For: 5.0-alpha3
> I have an application that reads data from a stream. When data is available, I can read
from the stream perfectly fine. However, sometimes the stream will remain open with no data,
in which case reading from the stream blocks. I would like to use the {{available()}} method
on the stream to first check whether anything can be read before attempting to read.
> When I attempt to use the {{available()}} method on my {{InputStream}} instance it returns
{{0}}, i.e. no data available, even when I can successfully call {{read(...)}} and read data
off the stream. 
> I have traced the {{available()}} method on my {{InputStream}} instance through several
layers of wrapper classes around more {{InputStream}} instances. Each layer's {{available()}}
method simply calls into its wrapped {{InputStream}}'s {{available()}} method. That is, until
I reach the {{IdentityInputStream.available()}} method. The latter does this:
> {code:java}
>     @Override
>     public int available() throws IOException {
>         if (this.in instanceof BufferInfo) {
>             return ((BufferInfo) this.in).length();
>         } else {
>             return 0;
>         }
>     }
> {code}
> The {{in}} in the above code is a {{SessionInputBufferImpl}}, which has a few methods
that are seemingly relevant to this:
> {code:java}
>     @Override
>     public int capacity() {
>         return this.buffer.length;
>     }
>     @Override
>     public int length() {
>         return this.bufferlen - this.bufferpos;
>     }
>     @Override
>     public int available() {
>         return capacity() - length();
>     }
> {code}
> Why does {{IdentityInputStream.available()}} call {{((BufferInfo) this.in).length()}}
instead of {{((BufferInfo) this.in).available()}}? The former returns {{0}} when I call it
on a stream that has data which can be read, but has not been; the latter returns a number
greater than {{0}}.

This message was sent by Atlassian JIRA

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

View raw message