[
https://issues.apache.org/jira/browse/HTTPCORE-449?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Oleg Kalnichevski resolved HTTPCORE-449.
----------------------------------------
Resolution: Fixed
Fix Version/s: (was: 4.4.7)
John,
I found no reasonable way to implement this change in 4.5.x, which would not
involve violation of the BufferInfo contract or introduction of yet another
optional interface. I ended up implementing the change in 5.x only.
Please review and close.
Oleg
> 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
>
>
> 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: [email protected]
For additional commands, e-mail: [email protected]