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] [Created] (HTTPCORE-449) IdentityInputStream.available() erroneously returns 0
Date Mon, 27 Feb 2017 18:42:45 GMT
John Flavin created HTTPCORE-449:
------------------------------------

             Summary: IdentityInputStream.available() erroneously returns 0
                 Key: HTTPCORE-449
                 URL: https://issues.apache.org/jira/browse/HTTPCORE-449
             Project: HttpComponents HttpCore
          Issue Type: Bug
          Components: HttpCore
    Affects Versions: 4.4.6, 4.4.5
            Reporter: John Flavin


h5. BACKGROUND
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.

h5. PROBLEM
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. 

h5. INVESTIGATION INTO PROBLEM
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}

h5. QUESTION
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
(v6.3.15#6346)

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


Mime
View raw message