Skip to content

Commit a18c126

Browse files
committed
Merge pull request #59 from mone/master
introduce support for http-streaming by not filtering multiple LOADING e...
2 parents c739db7 + 55a0108 commit a18c126

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

lib/XMLHttpRequest.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ exports.XMLHttpRequest = function() {
582582
* @param int state New state
583583
*/
584584
var setState = function(state) {
585-
if (self.readyState !== state) {
585+
if (state == self.LOADING || self.readyState !== state) {
586586
self.readyState = state;
587587

588588
if (settings.async || self.readyState < self.OPENED || self.readyState === self.DONE) {

tests/test-streaming.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
var sys = require("util")
2+
, assert = require("assert")
3+
, http = require("http")
4+
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
5+
, xhr;
6+
7+
// Test server
8+
9+
function completeResponse(res,server,body) {
10+
res.end();
11+
assert.equal(onreadystatechange, true);
12+
assert.equal(readystatechange, true);
13+
assert.equal(removed, true);
14+
assert.equal(loadCount, body.length);
15+
sys.puts("done");
16+
server.close();
17+
}
18+
function push(res,piece) {
19+
res.write(piece);
20+
}
21+
22+
var server = http.createServer(function (req, res) {
23+
var body = (req.method != "HEAD" ? ["Hello","World","Stream"] : []);
24+
25+
res.writeHead(200, {
26+
"Content-Type": "text/plain",
27+
"Content-Length": Buffer.byteLength(body.join(""))
28+
});
29+
30+
var nextPiece = 0;
31+
var self = this;
32+
var interval = setInterval(function() {
33+
if (nextPiece < body.length) {
34+
res.write(body[nextPiece]);
35+
nextPiece++;
36+
} else {
37+
completeResponse(res,self,body);
38+
clearInterval(interval);
39+
}
40+
},100); //nagle may put writes together, if it happens rise the interval time
41+
42+
}).listen(8000);
43+
44+
xhr = new XMLHttpRequest();
45+
46+
// Track event calls
47+
var onreadystatechange = false;
48+
var readystatechange = false;
49+
var removed = true;
50+
var loadCount = 0;
51+
var removedEvent = function() {
52+
removed = false;
53+
};
54+
55+
xhr.onreadystatechange = function() {
56+
onreadystatechange = true;
57+
};
58+
59+
xhr.addEventListener("readystatechange", function() {
60+
readystatechange = true;
61+
if (xhr.readyState == xhr.LOADING) {
62+
loadCount++;
63+
}
64+
});
65+
66+
// This isn't perfect, won't guarantee it was added in the first place
67+
xhr.addEventListener("readystatechange", removedEvent);
68+
xhr.removeEventListener("readystatechange", removedEvent);
69+
70+
xhr.open("GET", "http://localhost:8000");
71+
xhr.send();

0 commit comments

Comments
 (0)