Skip to content

Commit

Permalink
fix: use maxRedirects instead of max_redirects, failing tests now res…
Browse files Browse the repository at this point in the history
…ult in non-zero exit-code, add docs for new options, bump version to 3.1.0
  • Loading branch information
mjwwit committed Dec 8, 2024
1 parent c5f1fc3 commit 76de70f
Show file tree
Hide file tree
Showing 24 changed files with 66 additions and 64 deletions.
20 changes: 12 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,22 @@ XHR object.

Note: use the lowercase string "xmlhttprequest-ssl" in your require(). On
case-sensitive systems (eg Linux) using uppercase letters won't work.
# Original README #

## Usage ##
### Non-standard features ###

Here's how to include the module in your project and use as the browser-based
XHR object.
Non-standard options for this module are passed through the `XMLHttpRequest` constructor. The following options control `https:` SSL requests: `ca`, `cert`, `ciphers`, `key`, `passphrase`, `pfx`, and `rejectUnauthorized`. You can find their functionality in the [Node.js docs](https://nodejs.org/api/https.html#httpsrequestoptions-callback).

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();
Additionally, the `agent` option allows you to specify a [Node.js Agent](https://nodejs.org/api/https.html#class-httpsagent) instance, allowing connection reuse.

Note: use the lowercase string "xmlhttprequest" in your require(). On
case-sensitive systems (eg Linux) using uppercase letters won't work.
To prevent a process from not exiting naturally because a request socket from this module is still open, you can set `autoUnref` to a truthy value.

This module allows control over the maximum number of redirects that are followed. You can set the `maxRedirects` option to do this. The default number is 20.

Using the `allowFileSystemResources` option allows you to control access to the local filesystem through the `file:` protocol.

The `origin` option allows you to set a base URL for the request. The resulting request URL will be constructed as follows `new URL(url, origin)`.

# Original README #

## Versions ##

Expand Down
17 changes: 8 additions & 9 deletions lib/XMLHttpRequest.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ function XMLHttpRequest(opts) {
rejectUnauthorized: true,
autoUnref: false,
agent: undefined,
max_redirects: 20,
allowFileSystemResources: true,
maxRedirects: 20, // Chrome standard
origin: undefined
Expand All @@ -72,11 +71,11 @@ function XMLHttpRequest(opts) {
var http = require('http');
var https = require('https');

var max_redirects = opts.maxRedirects;
if (typeof max_redirects !== 'number' || Number.isNaN(max_redirects)) max_redirects = 20;
else max_redirects = Math.max(max_redirects, 0);
var maxRedirects = opts.maxRedirects;
if (typeof maxRedirects !== 'number' || Number.isNaN(maxRedirects)) maxRedirects = 20;
else maxRedirects = Math.max(maxRedirects, 0);

var redirect_count = 0;
var redirectCount = 0;

// Holds http.js objects
var request;
Expand Down Expand Up @@ -611,10 +610,10 @@ function XMLHttpRequest(opts) {
resp.statusCode === 307 ||
resp.statusCode === 308
) {
++redirect_count;
++redirectCount;
// end the response
resp.destroy();
if (redirect_count > max_redirects) {
if (redirectCount > maxRedirects) {
self.handleError(new Error("Too many redirects"));
return;
}
Expand Down Expand Up @@ -777,15 +776,15 @@ function XMLHttpRequest(opts) {
+ "var responseData = Buffer.alloc(0);"
+ "var buffers = [];"
+ "var url = new URL(" + JSON.stringify(settings.url) + ");"
+ "var max_redirects = " + max_redirects + ", redirects_count = 0;"
+ "var maxRedirects = " + maxRedirects + ", redirects_count = 0;"
+ "var makeRequest = function () {"
+ " var opt = Object.assign({}, options);"
+ " if (isSsl) Object.assign(opt, sslOptions);"
+ " var req = doRequest(opt, function(response) {"
+ " if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307 || response.statusCode === 308) {"
+ " response.destroy();"
+ " ++redirects_count;"
+ " if (redirects_count > max_redirects) {"
+ " if (redirects_count > maxRedirects) {"
+ " fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR-REDIRECT: Too many redirects', 'utf8');"
+ " fs.unlinkSync('" + syncFile + "');"
+ " return;"
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "xmlhttprequest-ssl",
"description": "XMLHttpRequest for Node",
"version": "3.0.0",
"version": "3.1.0",
"author": {
"name": "Michael de Wit"
},
Expand Down
3 changes: 1 addition & 2 deletions tests/test-constants.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest();

Expand Down
10 changes: 6 additions & 4 deletions tests/test-data-uri.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr;

Expand Down Expand Up @@ -99,7 +98,7 @@ var runSyncTest = function (test) {
assert.equal(xhr.status, 0);
assert.equal(e.message, test.error);
}
console.log(" --> SUCESS");
console.log(" --> SUCCESS");
++tests_passed;
}

Expand All @@ -121,7 +120,10 @@ var startTest = function () {
try {
runSyncTest(test);
}
catch (e) { console.error(e) };
catch (e) {
console.error(e);
throw e;
};
console.log("");
++i;
startTest();
Expand Down
11 changes: 7 additions & 4 deletions tests/test-disallow-fs-resources.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr;

Expand All @@ -9,8 +8,12 @@ xhr.onreadystatechange = function() {
if (this.readyState === 4) {
assert.equal(this.statusText, "Not allowed to load local resource: " + url);
assert.equal(this.status, 0);
try { runSync(); } catch (e) {
if (e instanceof assert.AssertionError) console.error(e);
try {
runSync();
} catch (e) {
if (e instanceof assert.AssertionError) {
throw e;
}
}
}
};
Expand Down
3 changes: 1 addition & 2 deletions tests/test-events.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, http = require("http")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr;
Expand Down
9 changes: 4 additions & 5 deletions tests/test-exceptions.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
var sys = require("util")
, assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
var XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest();

// Test request methods that aren't allowed
Expand All @@ -20,7 +18,8 @@ try {
try {
xhr.open("GET", "http://localhost:8000/");
} catch(e) {
console.log("ERROR: Invalid exception for GET", e);
console.error(e);
throw new Error("ERROR: Invalid exception for GET");
}

// Test forbidden headers
Expand Down Expand Up @@ -49,7 +48,7 @@ var forbiddenRequestHeaders = [

for (var i in forbiddenRequestHeaders) {
if(xhr.setRequestHeader(forbiddenRequestHeaders[i], "Test") !== false) {
console.log("ERROR: " + forbiddenRequestHeaders[i] + " should have thrown exception");
throw new Error("ERROR: " + forbiddenRequestHeaders[i] + " should have thrown exception");
}
}

Expand Down
6 changes: 3 additions & 3 deletions tests/test-headers.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest()
, http = require("http");
Expand Down Expand Up @@ -77,5 +76,6 @@ try {

xhr.send(body);
} catch(e) {
console.log("ERROR: Exception raised", e);
console.error("ERROR: Exception raised", e);
throw e;
}
2 changes: 2 additions & 0 deletions tests/test-keepalive.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
var assert = require("assert");
var http = require('http');
var { XMLHttpRequest } = require("../lib/XMLHttpRequest");

Expand All @@ -23,6 +24,7 @@ var interval = setInterval(function sendRequest() {
clearInterval(interval);
agent.destroy();
server.close();
assert.equal(xhr.status, 200);
}
if (repeats++ > maxMessages) {
console.log('Done.');
Expand Down
6 changes: 3 additions & 3 deletions tests/test-max-redirects.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, spawn = require('child_process').spawn;

Expand All @@ -20,6 +19,7 @@ var runTest = function () {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}

try {
Expand All @@ -34,7 +34,7 @@ var runTest = function () {
};
xhr.send();
} catch(e) {
if (e.message !== 'Too many redirects') console.log("ERROR: Exception raised", e);
assert.equal(e.message, 'Too many redirects');
}
}

Expand Down
1 change: 0 additions & 1 deletion tests/test-perf.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
/******************************************************************************************
* This test measurs the elapsed time to download a Float32Array of length 100,000,000.
*/
// @ts-check
'use strict';

const http = require("http");
Expand Down
4 changes: 2 additions & 2 deletions tests/test-redirect-301.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest()
, http = require("http");
Expand Down Expand Up @@ -38,4 +37,5 @@ try {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}
4 changes: 2 additions & 2 deletions tests/test-redirect-302.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest()
, http = require("http");
Expand Down Expand Up @@ -38,4 +37,5 @@ try {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}
4 changes: 2 additions & 2 deletions tests/test-redirect-303.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest()
, http = require("http");
Expand Down Expand Up @@ -38,4 +37,5 @@ try {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}
4 changes: 2 additions & 2 deletions tests/test-redirect-307.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest()
, http = require("http");
Expand Down Expand Up @@ -40,4 +39,5 @@ try {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}
4 changes: 2 additions & 2 deletions tests/test-redirect-308.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest()
, http = require("http");
Expand Down Expand Up @@ -38,4 +37,5 @@ try {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}
3 changes: 1 addition & 2 deletions tests/test-request-methods.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, http = require("http")
, xhr;
Expand Down
4 changes: 2 additions & 2 deletions tests/test-request-protocols-binary-data.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ function download (url, isAsync) {

function runTest () {
// Async
var ab = download(url, /*isAsyn*/ true);
var ab = download(url, /*isAsync*/ true);
return ab.then(afterAsyncDownload);
}

Expand All @@ -51,7 +51,7 @@ function afterAsyncDownload(ab) {
log("done async phase");

// Sync
var abSync = download(url, /*isAsyn*/ false);
var abSync = download(url, /*isAsync*/ false);
return abSync.then(afterSyncDownload);
}

Expand Down
3 changes: 1 addition & 2 deletions tests/test-request-protocols-txt-data.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr;

Expand Down
1 change: 0 additions & 1 deletion tests/test-response-type.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
* [ "text", "", "arraybuffer", "blob", "json" ]
* and then various checks verify that the downloaded content is the same as that uploaded.
*/
// @ts-check
'use strict';

const http = require("http");
Expand Down
4 changes: 2 additions & 2 deletions tests/test-unsafe-redirect.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, xhr = new XMLHttpRequest()
, http = require("http");
Expand Down Expand Up @@ -38,4 +37,5 @@ try {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}
4 changes: 2 additions & 2 deletions tests/test-url-origin.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var sys = require("util")
, assert = require("assert")
var assert = require("assert")
, XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest
, spawn = require('child_process').spawn;

Expand Down Expand Up @@ -35,6 +34,7 @@ var runTest = function () {
xhr.send();
} catch(e) {
console.log("ERROR: Exception raised", e);
throw e;
}
}

Expand Down
1 change: 0 additions & 1 deletion tests/test-utf8-tearing.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
* // Construct responseText from response
* self.responseText = self.response.toString('utf8');
*/
// @ts-check
'use strict';

var assert = require("assert");
Expand Down

0 comments on commit 76de70f

Please sign in to comment.