xmlhttprequest
Advanced tools
Comparing version 1.6.0 to 1.7.0
@@ -14,7 +14,9 @@ /** | ||
var Url = require("url") | ||
, spawn = require("child_process").spawn | ||
, fs = require('fs'); | ||
var Url = require("url"); | ||
var spawn = require("child_process").spawn; | ||
var fs = require("fs"); | ||
exports.XMLHttpRequest = function() { | ||
"use strict"; | ||
/** | ||
@@ -24,4 +26,4 @@ * Private variables | ||
var self = this; | ||
var http = require('http'); | ||
var https = require('https'); | ||
var http = require("http"); | ||
var https = require("https"); | ||
@@ -188,7 +190,7 @@ // Holds http.js objects | ||
this.setRequestHeader = function(header, value) { | ||
if (this.readyState != this.OPENED) { | ||
if (this.readyState !== this.OPENED) { | ||
throw "INVALID_STATE_ERR: setRequestHeader can only be called when state is OPEN"; | ||
} | ||
if (!isAllowedHttpHeader(header)) { | ||
console.warn('Refused to set unsafe header "' + header + '"'); | ||
console.warn("Refused to set unsafe header \"" + header + "\""); | ||
return; | ||
@@ -211,2 +213,4 @@ } | ||
&& this.readyState > this.OPENED | ||
&& response | ||
&& response.headers | ||
&& response.headers[header.toLowerCase()] | ||
@@ -262,3 +266,3 @@ && !errorFlag | ||
this.send = function(data) { | ||
if (this.readyState != this.OPENED) { | ||
if (this.readyState !== this.OPENED) { | ||
throw "INVALID_STATE_ERR: connection must be opened before send() is called"; | ||
@@ -276,10 +280,10 @@ } | ||
switch (url.protocol) { | ||
case 'https:': | ||
case "https:": | ||
ssl = true; | ||
// SSL & non-SSL both need host, no break here. | ||
case 'http:': | ||
case "http:": | ||
host = url.hostname; | ||
break; | ||
case 'file:': | ||
case "file:": | ||
local = true; | ||
@@ -289,3 +293,3 @@ break; | ||
case undefined: | ||
case '': | ||
case "": | ||
host = "localhost"; | ||
@@ -305,3 +309,3 @@ break; | ||
if (settings.async) { | ||
fs.readFile(url.pathname, 'utf8', function(error, data) { | ||
fs.readFile(url.pathname, "utf8", function(error, data) { | ||
if (error) { | ||
@@ -317,3 +321,3 @@ self.handleError(error); | ||
try { | ||
this.responseText = fs.readFileSync(url.pathname, 'utf8'); | ||
this.responseText = fs.readFileSync(url.pathname, "utf8"); | ||
this.status = 200; | ||
@@ -333,8 +337,8 @@ setState(self.DONE); | ||
// Add query string if one is used | ||
var uri = url.pathname + (url.search ? url.search : ''); | ||
var uri = url.pathname + (url.search ? url.search : ""); | ||
// Set the Host header or the server may reject the request | ||
headers["Host"] = host; | ||
headers.Host = host; | ||
if (!((ssl && port === 443) || port === 80)) { | ||
headers["Host"] += ':' + url.port; | ||
headers.Host += ":" + url.port; | ||
} | ||
@@ -344,7 +348,7 @@ | ||
if (settings.user) { | ||
if (typeof settings.password == "undefined") { | ||
if (typeof settings.password === "undefined") { | ||
settings.password = ""; | ||
} | ||
var authBuf = new Buffer(settings.user + ":" + settings.password); | ||
headers["Authorization"] = "Basic " + authBuf.toString("base64"); | ||
headers.Authorization = "Basic " + authBuf.toString("base64"); | ||
} | ||
@@ -391,3 +395,3 @@ | ||
// Handler for the response | ||
function responseHandler(resp) { | ||
var responseHandler = function responseHandler(resp) { | ||
// Set response var to the response we got back | ||
@@ -398,3 +402,3 @@ // This is so it remains accessable outside this scope | ||
// @TODO Prevent looped redirects | ||
if (response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) { | ||
if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) { | ||
// Change URL to the redirect location | ||
@@ -410,3 +414,3 @@ settings.url = response.headers.location; | ||
path: url.path, | ||
method: response.statusCode === 303 ? 'GET' : settings.method, | ||
method: response.statusCode === 303 ? "GET" : settings.method, | ||
headers: headers | ||
@@ -416,3 +420,3 @@ }; | ||
// Issue the new request | ||
request = doRequest(newOptions, responseHandler).on('error', errorHandler); | ||
request = doRequest(newOptions, responseHandler).on("error", errorHandler); | ||
request.end(); | ||
@@ -428,3 +432,3 @@ // @TODO Check if an XHR event needs to be fired here | ||
response.on('data', function(chunk) { | ||
response.on("data", function(chunk) { | ||
// Make sure there's some data | ||
@@ -440,5 +444,5 @@ if (chunk) { | ||
response.on('end', function() { | ||
response.on("end", function() { | ||
if (sendFlag) { | ||
// Discard the 'end' event if the connection has been aborted | ||
// Discard the end event if the connection has been aborted | ||
setState(self.DONE); | ||
@@ -449,14 +453,14 @@ sendFlag = false; | ||
response.on('error', function(error) { | ||
response.on("error", function(error) { | ||
self.handleError(error); | ||
}); | ||
} | ||
}; | ||
// Error handler for the request | ||
function errorHandler(error) { | ||
var errorHandler = function errorHandler(error) { | ||
self.handleError(error); | ||
} | ||
}; | ||
// Create the request | ||
request = doRequest(options, responseHandler).on('error', errorHandler); | ||
request = doRequest(options, responseHandler).on("error", errorHandler); | ||
@@ -487,22 +491,21 @@ // Node 0.4 and later won't accept empty data. Make sure it's needed. | ||
+ "response.on('end', function() {" | ||
+ "fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-STATUS:' + response.statusCode + ',' + responseText, 'utf8');" | ||
+ "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText}}), 'utf8');" | ||
+ "fs.unlinkSync('" + syncFile + "');" | ||
+ "});" | ||
+ "response.on('error', function(error) {" | ||
+ "fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');" | ||
+ "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: error}), 'utf8');" | ||
+ "fs.unlinkSync('" + syncFile + "');" | ||
+ "});" | ||
+ "}).on('error', function(error) {" | ||
+ "fs.writeFileSync('" + contentFile + "', 'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error), 'utf8');" | ||
+ "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: error}), 'utf8');" | ||
+ "fs.unlinkSync('" + syncFile + "');" | ||
+ "});" | ||
+ (data ? "req.write('" + data.replace(/'/g, "\\'") + "');":"") | ||
+ (data ? "req.write('" + JSON.stringify(data).slice(1,-1).replace(/'/g, "\\'") + "');":"") | ||
+ "req.end();"; | ||
// Start the other Node Process, executing this string | ||
var syncProc = spawn(process.argv[0], ["-e", execString]); | ||
var statusText; | ||
while(fs.existsSync(syncFile)) { | ||
// Wait while the sync file is empty | ||
} | ||
self.responseText = fs.readFileSync(contentFile, 'utf8'); | ||
var resp = JSON.parse(fs.readFileSync(contentFile, 'utf8')); | ||
// Kill the child process once the file has data | ||
@@ -512,10 +515,9 @@ syncProc.stdin.end(); | ||
fs.unlinkSync(contentFile); | ||
if (self.responseText.match(/^NODE-XMLHTTPREQUEST-ERROR:/)) { | ||
// If the file returned an error, handle it | ||
var errorObj = self.responseText.replace(/^NODE-XMLHTTPREQUEST-ERROR:/, ""); | ||
self.handleError(errorObj); | ||
if (resp.err) { | ||
self.handleError(resp.err); | ||
} else { | ||
// If the file returned okay, parse its data and move to the DONE state | ||
self.status = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:([0-9]*),.*/, "$1"); | ||
self.responseText = self.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:[0-9]*,(.*)/, "$1"); | ||
response = resp.data; | ||
self.status = resp.data.statusCode; | ||
self.responseText = resp.data.text; | ||
setState(self.DONE); | ||
@@ -605,3 +607,3 @@ } | ||
var setState = function(state) { | ||
if (self.readyState !== state) { | ||
if (state == self.LOADING || self.readyState !== state) { | ||
self.readyState = state; | ||
@@ -608,0 +610,0 @@ |
{ | ||
"name": "xmlhttprequest" | ||
, "description": "XMLHttpRequest for Node" | ||
, "version": "1.6.0" | ||
, "author": { | ||
"name": "Dan DeFelippi" | ||
, "url": "http://driverdan.com" | ||
} | ||
, "keywords": ["xhr", "ajax"] | ||
, "licenses": [{ | ||
"type": "MIT" | ||
, "url": "http://creativecommons.org/licenses/MIT/" | ||
}] | ||
, "repository": { | ||
"type": "git" | ||
, "url": "git://github.com/driverdan/node-XMLHttpRequest.git" | ||
} | ||
, "bugs": "http://github.com/driverdan/node-XMLHttpRequest/issues" | ||
, "engines": { | ||
"name": "xmlhttprequest", | ||
"description": "XMLHttpRequest for Node", | ||
"version": "1.7.0", | ||
"author": { | ||
"name": "Dan DeFelippi", | ||
"url": "http://driverdan.com" | ||
}, | ||
"keywords": ["xhr", "ajax"], | ||
"licenses": [{ | ||
"type": "MIT", | ||
"url": "http://creativecommons.org/licenses/MIT/" | ||
}], | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/driverdan/node-XMLHttpRequest.git" | ||
}, | ||
"bugs": "http://github.com/driverdan/node-XMLHttpRequest/issues", | ||
"engines": { | ||
"node": ">=0.4.0" | ||
} | ||
, "directories": { | ||
"lib": "./lib" | ||
, "example": "./example" | ||
} | ||
, "main": "./lib/XMLHttpRequest.js" | ||
}, | ||
"directories": { | ||
"lib": "./lib", | ||
"example": "./example" | ||
}, | ||
"main": "./lib/XMLHttpRequest.js" | ||
} |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
3
20963
6
524