Closed Bug 300889 Opened 19 years ago Closed 19 years ago

Does nsIHttpChannel.open() method work asynchronous?

Categories

(Core :: Networking, defect)

x86
Windows 2000
defect
Not set
normal

Tracking

()

VERIFIED INVALID

People

(Reporter: surkov, Assigned: darin.moz)

Details

User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 5.0; ru-RU; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 (ax)
Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.0; ru-RU; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 (ax)

I get xml file by httpchannel.open() method. When I read returned istream then
isream contains a part of xml file. When I show alert message before reading of
istream then istream contains xml file wholly.

//gets a part of xml file
var istream=nsIHttpChannel.open();
var
iistream=Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
iistream.init(istream);
var rep=iistream.read(iistream.available());
alert(rep);

//gets xml file wholly.
var istream=nsIHttpChannel.open();
alert('hello'); //note
var
iistream=Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
iistream.init(istream);
var rep=iistream.read(iistream.available());
alert(rep);

Reproducible: Always
there is no guarantee that the entire file can be read in a single call to
read(). call it multiple times, until it returns no data (0 bytes).
Status: UNCONFIRMED → RESOLVED
Closed: 19 years ago
Resolution: --- → INVALID
v.
Status: RESOLVED → VERIFIED
If stream.available() is less then requested file length then stream doesn't
contain file content a wholly. Does it mean channel.open() works asynchronous?
If no then how it can be expained?

Note if I show alert message before reading stream then stream.available()
equals file length. If I read file without any messages then stream.available()
returns a number lesser than file length.
Status: VERIFIED → UNCONFIRMED
Resolution: INVALID → ---
> Does it mean channel.open() works asynchronous?

the stream is filled from a background thread, if that's what you mean.
(actually, I think for some channels that's not true, but the effect is almost
the same)

this behaves a lot like the C read() function, except that it doesn't really
have an available() equivalent.

> Note if I show alert message before reading stream then stream.available()
> equals file length.

yeah, presumably that gives necko enough time to load the entire file...
Status: UNCONFIRMED → RESOLVED
Closed: 19 years ago19 years ago
Resolution: --- → FIXED
Status: RESOLVED → VERIFIED
I'm sorry if bug was fixed then where can I find a patch?
This bug should be marked INVALID.  No patch was applied to the source.  The
initial report is invalid.  Write code like this:

  var n, data = "";
  while ((n = iistream.available()) != 0) {
    data += iistream.read(n);
  }

reopening so i can mark this bug invalid.
Status: VERIFIED → UNCONFIRMED
Resolution: FIXED → ---
INVALID
Status: UNCONFIRMED → RESOLVED
Closed: 19 years ago19 years ago
Resolution: --- → INVALID
Why intitial report is invalid?

From the point of view of xul programmer open() method works asynchronous
because istream.available() returns number lesser then length of file content.
When I use file channel I can't get the such problem. 

While stream is filled from a background thread, I can't use DOMParser object
(parseFromStream() method) since stream doesn't contain file a wholly. Maybe
parseFromSteam() should use code like you proposed in comment#6?
Status: RESOLVED → UNCONFIRMED
Resolution: INVALID → ---
I have in view when open() method returns stream then stream must contain a file
entirely. Why do you think it's not obligatory request?
The bug is invalid.  Read the documentation for nsIInputStream.  Also, consider
a file that is larger than 4 gigabytes in length.  nsIInputStream::available()
returns a 32-bit integer, which cannot represent the full length of a file
larger than 4 GB.  So, it is important to anticipate available() returning only
part of the file.  The behavior of a local file stream (from a file:// URL) is
consistent with this prescribed behavior.

It sounds like you may have discovered a bug with the DOMParser, so I would
recommend filing a bug against that component.  This bug as described in comment
#0 is invalid.  Please do not reopen this bug.
Status: UNCONFIRMED → RESOLVED
Closed: 19 years ago19 years ago
Resolution: --- → INVALID
Status: RESOLVED → VERIFIED
(In reply to comment #5)
> I'm sorry if bug was fixed then where can I find a patch?

sorry, I accidentally clicked FIXED, I meant to mark it invalid.

(In reply to comment #6)
>   var n, data = "";
>   while ((n = iistream.available()) != 0) {
>     data += iistream.read(n);
>   }

Does this work? What if the server doesn't send data for a few seconds, and only
then continues sending? Wouldn't available() return 0 during that time?
No, available will block until there is data.  The nsIInputStream returned from
nsIChannel::open has blocking semantics.  (The implementation for HTTP actually
calls nsIEventQueue::WaitForEvent and HandleEvent in a loop until data arrives.)
You need to log in before you can comment on or make changes to this bug.