Skip to content

Commit 7fc6402

Browse files
committed
Merge branch 'master' of github.com:driverdan/node-XMLHttpRequest
Conflicts: package.json
2 parents 86c18b7 + 0bda0ae commit 7fc6402

File tree

5 files changed

+120
-7
lines changed

5 files changed

+120
-7
lines changed

lib/XMLHttpRequest.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ exports.XMLHttpRequest = function() {
207207
this.getResponseHeader = function(header) {
208208
if (typeof header === "string"
209209
&& this.readyState > this.OPENED
210+
&& response
211+
&& response.headers
210212
&& response.headers[header.toLowerCase()]
211213
&& !errorFlag
212214
) {
@@ -385,7 +387,7 @@ exports.XMLHttpRequest = function() {
385387
response = resp;
386388
// Check for redirect
387389
// @TODO Prevent looped redirects
388-
if (response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {
390+
if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {
389391
// Change URL to the redirect location
390392
settings.url = response.headers.location;
391393
var url = Url.parse(settings.url);
@@ -479,7 +481,7 @@ exports.XMLHttpRequest = function() {
479481
+ "fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');"
480482
+ "fs.unlinkSync('" + syncFile + "');"
481483
+ "});"
482-
+ (data ? "req.write('" + data.replace(/'/g, "\\'") + "');":"")
484+
+ (data ? "req.write('" + JSON.stringify(data).slice(1,-1).replace(/'/g, "\\'") + "');":"")
483485
+ "req.end();";
484486
// Start the other Node Process, executing this string
485487
var syncProc = spawn(process.argv[0], ["-e", execString]);
@@ -498,7 +500,7 @@ exports.XMLHttpRequest = function() {
498500
self.handleError(errorObj);
499501
} else {
500502
// If the file returned okay, parse its data and move to the DONE state
501-
self.status = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:([0-9]*),.*/, "$1");
503+
self.status = parseInt(self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:([0-9]*),.*/, "$1"), 10);
502504
self.responseText = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:[0-9]*,(.*)/, "$1");
503505
setState(self.DONE);
504506
}
@@ -584,7 +586,7 @@ exports.XMLHttpRequest = function() {
584586
* @param int state New state
585587
*/
586588
var setState = function(state) {
587-
if (self.readyState !== state) {
589+
if (state == self.LOADING || self.readyState !== state) {
588590
self.readyState = state;
589591

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

tests/test-redirect-301.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
var sys = require("util")
2+
, assert = require("assert")
3+
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
4+
, xhr = new XMLHttpRequest()
5+
, http = require("http");
6+
7+
// Test server
8+
var server = http.createServer(function (req, res) {
9+
if (req.url === '/redirectingResource') {
10+
res.writeHead(301, {'Location': 'http://localhost:8000/'});
11+
res.end();
12+
return;
13+
}
14+
15+
var body = "Hello World";
16+
res.writeHead(200, {
17+
"Content-Type": "text/plain",
18+
"Content-Length": Buffer.byteLength(body),
19+
"Date": "Thu, 30 Aug 2012 18:17:53 GMT",
20+
"Connection": "close"
21+
});
22+
res.write("Hello World");
23+
res.end();
24+
25+
this.close();
26+
}).listen(8000);
27+
28+
xhr.onreadystatechange = function() {
29+
if (this.readyState == 4) {
30+
assert.equal(xhr.status, 200);
31+
assert.equal(xhr.getRequestHeader('Location'), '');
32+
assert.equal(xhr.responseText, "Hello World");
33+
sys.puts("done");
34+
}
35+
};
36+
37+
try {
38+
xhr.open("GET", "http://localhost:8000/redirectingResource");
39+
xhr.send();
40+
} catch(e) {
41+
console.log("ERROR: Exception raised", e);
42+
}

tests/test-request-protocols.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ xhr = new XMLHttpRequest();
88
xhr.onreadystatechange = function() {
99
if (this.readyState == 4) {
1010
assert.equal("Hello World", this.responseText);
11-
this.close();
1211
runSync();
1312
}
1413
};
@@ -25,7 +24,6 @@ var runSync = function() {
2524
xhr.onreadystatechange = function() {
2625
if (this.readyState == 4) {
2726
assert.equal("Hello World", this.responseText);
28-
this.close();
2927
sys.puts("done");
3028
}
3129
};

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();

tests/testdata.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Hello World
1+
Hello World

0 commit comments

Comments
 (0)