From aa3fbcfb240c03321b94fec95f532dc9a83041c5 Mon Sep 17 00:00:00 2001 From: Liam Doherty Date: Thu, 20 Sep 2012 15:39:41 -0700 Subject: [PATCH] added support for status code 303, tests for 302, 303, 307 --- lib/XMLHttpRequest.js | 4 ++-- tests/test-redirect-302.js | 42 ++++++++++++++++++++++++++++++++++++ tests/test-redirect-303.js | 42 ++++++++++++++++++++++++++++++++++++ tests/test-redirect-307.js | 44 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 tests/test-redirect-302.js create mode 100644 tests/test-redirect-303.js create mode 100644 tests/test-redirect-307.js diff --git a/lib/XMLHttpRequest.js b/lib/XMLHttpRequest.js index 9d672db..f8438fb 100644 --- a/lib/XMLHttpRequest.js +++ b/lib/XMLHttpRequest.js @@ -383,7 +383,7 @@ exports.XMLHttpRequest = function() { response = resp; - if(response.statusCode === 302){ + if(response.statusCode === 302 || response.statusCode === 307 || response.statusCode === 303){ settings.url = response.headers['location'] var url = Url.parse(settings.url); host = url.hostname @@ -391,7 +391,7 @@ exports.XMLHttpRequest = function() { hostname: url.hostname, port: url.port, path: url.path, - method: settings.method, + method: response.statusCode === 303 ? 'GET' : settings.method, headers: headers } diff --git a/tests/test-redirect-302.js b/tests/test-redirect-302.js new file mode 100644 index 0000000..84505fa --- /dev/null +++ b/tests/test-redirect-302.js @@ -0,0 +1,42 @@ +var sys = require("util") + , assert = require("assert") + , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest + , xhr = new XMLHttpRequest() + , http = require("http"); + +// Test server +var server = http.createServer(function (req, res) { + + if(req.url === '/redirectingResource'){ + res.writeHead(302, {'Location': 'http://localhost:8000/'}) + res.end() + return + } + + var body = "Hello World"; + res.writeHead(200, { + "Content-Type": "text/plain", + "Content-Length": Buffer.byteLength(body), + "Date": "Thu, 30 Aug 2012 18:17:53 GMT", + "Connection": "close" + }); + res.write("Hello World"); + res.end(); + + this.close(); +}).listen(8000); + +xhr.onreadystatechange = function() { + if (this.readyState == 4) { + assert.equal(xhr.getRequestHeader('Location'), '') + assert.equal(xhr.responseText, "Hello World") + sys.puts("done"); + } +}; + +try { + xhr.open("GET", "http://localhost:8000/redirectingResource"); + xhr.send(); +} catch(e) { + console.log("ERROR: Exception raised", e); +} diff --git a/tests/test-redirect-303.js b/tests/test-redirect-303.js new file mode 100644 index 0000000..036f12e --- /dev/null +++ b/tests/test-redirect-303.js @@ -0,0 +1,42 @@ +var sys = require("util") + , assert = require("assert") + , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest + , xhr = new XMLHttpRequest() + , http = require("http"); + +// Test server +var server = http.createServer(function (req, res) { + + if(req.url === '/redirectingResource'){ + res.writeHead(303, {'Location': 'http://localhost:8000/'}) + res.end() + return + } + + var body = "Hello World"; + res.writeHead(200, { + "Content-Type": "text/plain", + "Content-Length": Buffer.byteLength(body), + "Date": "Thu, 30 Aug 2012 18:17:53 GMT", + "Connection": "close" + }); + res.write("Hello World"); + res.end(); + + this.close(); +}).listen(8000); + +xhr.onreadystatechange = function() { + if (this.readyState == 4) { + assert.equal(xhr.getRequestHeader('Location'), '') + assert.equal(xhr.responseText, "Hello World") + sys.puts("done"); + } +}; + +try { + xhr.open("POST", "http://localhost:8000/redirectingResource"); + xhr.send(); +} catch(e) { + console.log("ERROR: Exception raised", e); +} diff --git a/tests/test-redirect-307.js b/tests/test-redirect-307.js new file mode 100644 index 0000000..8234b5a --- /dev/null +++ b/tests/test-redirect-307.js @@ -0,0 +1,44 @@ +var sys = require("util") + , assert = require("assert") + , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest + , xhr = new XMLHttpRequest() + , http = require("http"); + +// Test server +var server = http.createServer(function (req, res) { + + if(req.url === '/redirectingResource'){ + res.writeHead(307, {'Location': 'http://localhost:8000/'}) + res.end() + return + } + + assert.equal(req.method, 'POST') + + var body = "Hello World"; + res.writeHead(200, { + "Content-Type": "text/plain", + "Content-Length": Buffer.byteLength(body), + "Date": "Thu, 30 Aug 2012 18:17:53 GMT", + "Connection": "close" + }); + res.write("Hello World"); + res.end(); + + this.close(); +}).listen(8000); + +xhr.onreadystatechange = function() { + if (this.readyState == 4) { + assert.equal(xhr.getRequestHeader('Location'), '') + assert.equal(xhr.responseText, "Hello World") + sys.puts("done"); + } +}; + +try { + xhr.open("POST", "http://localhost:8000/redirectingResource"); + xhr.send(); +} catch(e) { + console.log("ERROR: Exception raised", e); +}