diff --git a/README.md b/README.md index 7e09b94..c6c7912 100644 --- a/README.md +++ b/README.md @@ -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 ## diff --git a/lib/XMLHttpRequest.js b/lib/XMLHttpRequest.js index 73eb896..8bbc904 100644 --- a/lib/XMLHttpRequest.js +++ b/lib/XMLHttpRequest.js @@ -47,7 +47,6 @@ function XMLHttpRequest(opts) { rejectUnauthorized: true, autoUnref: false, agent: undefined, - max_redirects: 20, allowFileSystemResources: true, maxRedirects: 20, // Chrome standard origin: undefined @@ -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; @@ -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; } @@ -777,7 +776,7 @@ 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);" @@ -785,7 +784,7 @@ function XMLHttpRequest(opts) { + " 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;" diff --git a/package.json b/package.json index 2b796fd..8db9dfb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "xmlhttprequest-ssl", "description": "XMLHttpRequest for Node", - "version": "3.0.0", + "version": "3.1.0", "author": { "name": "Michael de Wit" }, diff --git a/tests/test-constants.js b/tests/test-constants.js index 4c697e2..57e1780 100644 --- a/tests/test-constants.js +++ b/tests/test-constants.js @@ -1,5 +1,4 @@ -var sys = require("util") - , assert = require("assert") +var assert = require("assert") , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest , xhr = new XMLHttpRequest(); diff --git a/tests/test-data-uri.js b/tests/test-data-uri.js index 3344008..c94dd23 100644 --- a/tests/test-data-uri.js +++ b/tests/test-data-uri.js @@ -1,5 +1,4 @@ -var sys = require("util") - , assert = require("assert") +var assert = require("assert") , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest , xhr; @@ -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; } @@ -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(); diff --git a/tests/test-disallow-fs-resources.js b/tests/test-disallow-fs-resources.js index 47a8696..a244849 100644 --- a/tests/test-disallow-fs-resources.js +++ b/tests/test-disallow-fs-resources.js @@ -1,5 +1,4 @@ -var sys = require("util") - , assert = require("assert") +var assert = require("assert") , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest , xhr; @@ -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; + } } } }; diff --git a/tests/test-events.js b/tests/test-events.js index 3296f8b..0d07fd7 100644 --- a/tests/test-events.js +++ b/tests/test-events.js @@ -1,5 +1,4 @@ -var sys = require("util") - , assert = require("assert") +var assert = require("assert") , http = require("http") , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest , xhr; diff --git a/tests/test-exceptions.js b/tests/test-exceptions.js index 10eaea2..721ef72 100644 --- a/tests/test-exceptions.js +++ b/tests/test-exceptions.js @@ -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 @@ -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 @@ -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"); } } diff --git a/tests/test-headers.js b/tests/test-headers.js index 90a0576..e22e5f9 100644 --- a/tests/test-headers.js +++ b/tests/test-headers.js @@ -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"); @@ -77,5 +76,6 @@ try { xhr.send(body); } catch(e) { - console.log("ERROR: Exception raised", e); + console.error("ERROR: Exception raised", e); + throw e; } diff --git a/tests/test-keepalive.js b/tests/test-keepalive.js index 59f4d28..a5b09e7 100644 --- a/tests/test-keepalive.js +++ b/tests/test-keepalive.js @@ -1,3 +1,4 @@ +var assert = require("assert"); var http = require('http'); var { XMLHttpRequest } = require("../lib/XMLHttpRequest"); @@ -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.'); diff --git a/tests/test-max-redirects.js b/tests/test-max-redirects.js index d221001..9938528 100644 --- a/tests/test-max-redirects.js +++ b/tests/test-max-redirects.js @@ -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; @@ -20,6 +19,7 @@ var runTest = function () { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } try { @@ -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'); } } diff --git a/tests/test-perf.js b/tests/test-perf.js index 488b12a..b93fd97 100644 --- a/tests/test-perf.js +++ b/tests/test-perf.js @@ -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"); diff --git a/tests/test-redirect-301.js b/tests/test-redirect-301.js index 0b3efe3..91ec4cf 100644 --- a/tests/test-redirect-301.js +++ b/tests/test-redirect-301.js @@ -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"); @@ -38,4 +37,5 @@ try { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } diff --git a/tests/test-redirect-302.js b/tests/test-redirect-302.js index ca69e0f..802e948 100644 --- a/tests/test-redirect-302.js +++ b/tests/test-redirect-302.js @@ -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"); @@ -38,4 +37,5 @@ try { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } diff --git a/tests/test-redirect-303.js b/tests/test-redirect-303.js index c6ce0cf..4d51962 100644 --- a/tests/test-redirect-303.js +++ b/tests/test-redirect-303.js @@ -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"); @@ -38,4 +37,5 @@ try { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } diff --git a/tests/test-redirect-307.js b/tests/test-redirect-307.js index 4eb4a2f..6e8cb9f 100644 --- a/tests/test-redirect-307.js +++ b/tests/test-redirect-307.js @@ -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"); @@ -40,4 +39,5 @@ try { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } diff --git a/tests/test-redirect-308.js b/tests/test-redirect-308.js index 71543e0..d517f68 100644 --- a/tests/test-redirect-308.js +++ b/tests/test-redirect-308.js @@ -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"); @@ -38,4 +37,5 @@ try { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } diff --git a/tests/test-request-methods.js b/tests/test-request-methods.js index f8d66d8..275a5d7 100644 --- a/tests/test-request-methods.js +++ b/tests/test-request-methods.js @@ -1,5 +1,4 @@ -var sys = require("util") - , assert = require("assert") +var assert = require("assert") , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest , http = require("http") , xhr; diff --git a/tests/test-request-protocols-binary-data.js b/tests/test-request-protocols-binary-data.js index de14087..1a10344 100644 --- a/tests/test-request-protocols-binary-data.js +++ b/tests/test-request-protocols-binary-data.js @@ -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); } @@ -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); } diff --git a/tests/test-request-protocols-txt-data.js b/tests/test-request-protocols-txt-data.js index f745cb8..8164333 100644 --- a/tests/test-request-protocols-txt-data.js +++ b/tests/test-request-protocols-txt-data.js @@ -1,5 +1,4 @@ -var sys = require("util") - , assert = require("assert") +var assert = require("assert") , XMLHttpRequest = require("../lib/XMLHttpRequest").XMLHttpRequest , xhr; diff --git a/tests/test-response-type.js b/tests/test-response-type.js index fe262da..6b4f39f 100644 --- a/tests/test-response-type.js +++ b/tests/test-response-type.js @@ -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"); diff --git a/tests/test-unsafe-redirect.js b/tests/test-unsafe-redirect.js index 54fff68..065d808 100644 --- a/tests/test-unsafe-redirect.js +++ b/tests/test-unsafe-redirect.js @@ -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"); @@ -38,4 +37,5 @@ try { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } diff --git a/tests/test-url-origin.js b/tests/test-url-origin.js index c86abb7..ff89b2c 100644 --- a/tests/test-url-origin.js +++ b/tests/test-url-origin.js @@ -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; @@ -35,6 +34,7 @@ var runTest = function () { xhr.send(); } catch(e) { console.log("ERROR: Exception raised", e); + throw e; } } diff --git a/tests/test-utf8-tearing.js b/tests/test-utf8-tearing.js index 8c801be..79a6d46 100644 --- a/tests/test-utf8-tearing.js +++ b/tests/test-utf8-tearing.js @@ -13,7 +13,6 @@ * // Construct responseText from response * self.responseText = self.response.toString('utf8'); */ -// @ts-check 'use strict'; var assert = require("assert");