Comparing version 2.11.4 to 2.12.0
73
aws.js
@@ -13,3 +13,4 @@ | ||
var crypto = require('crypto') | ||
, parse = require('url').parse; | ||
, parse = require('url').parse | ||
; | ||
@@ -20,4 +21,4 @@ /** | ||
var keys = [ | ||
'acl' | ||
var keys = | ||
[ 'acl' | ||
, 'location' | ||
@@ -36,3 +37,3 @@ , 'logging' | ||
, 'website' | ||
]; | ||
] | ||
@@ -49,4 +50,4 @@ /** | ||
exports.authorization = function(options){ | ||
return 'AWS ' + options.key + ':' + exports.sign(options); | ||
}; | ||
return 'AWS ' + options.key + ':' + exports.sign(options) | ||
} | ||
@@ -62,4 +63,4 @@ /** | ||
exports.hmacSha1 = function(options){ | ||
return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64'); | ||
}; | ||
return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') | ||
} | ||
@@ -75,5 +76,5 @@ /** | ||
exports.sign = function(options){ | ||
options.message = exports.stringToSign(options); | ||
return exports.hmacSha1(options); | ||
}; | ||
options.message = exports.stringToSign(options) | ||
return exports.hmacSha1(options) | ||
} | ||
@@ -91,5 +92,5 @@ /** | ||
exports.signQuery = function(options){ | ||
options.message = exports.queryStringToSign(options); | ||
return exports.hmacSha1(options); | ||
}; | ||
options.message = exports.queryStringToSign(options) | ||
return exports.hmacSha1(options) | ||
} | ||
@@ -114,6 +115,6 @@ /** | ||
exports.stringToSign = function(options){ | ||
var headers = options.amazonHeaders || ''; | ||
if (headers) headers += '\n'; | ||
return [ | ||
options.verb | ||
var headers = options.amazonHeaders || '' | ||
if (headers) headers += '\n' | ||
var r = | ||
[ options.verb | ||
, options.md5 | ||
@@ -123,4 +124,5 @@ , options.contentType | ||
, headers + options.resource | ||
].join('\n'); | ||
}; | ||
] | ||
return r.join('\n') | ||
} | ||
@@ -142,5 +144,3 @@ /** | ||
exports.queryStringToSign = function(options){ | ||
return 'GET\n\n\n' + | ||
options.date + '\n' + | ||
options.resource; | ||
return 'GET\n\n\n' + options.date + '\n' + options.resource | ||
}; | ||
@@ -164,11 +164,13 @@ | ||
var buf = [] | ||
, fields = Object.keys(headers); | ||
, fields = Object.keys(headers) | ||
; | ||
for (var i = 0, len = fields.length; i < len; ++i) { | ||
var field = fields[i] | ||
, val = headers[field] | ||
, field = field.toLowerCase(); | ||
if (0 !== field.indexOf('x-amz')) continue; | ||
buf.push(field + ':' + val); | ||
, field = field.toLowerCase() | ||
; | ||
if (0 !== field.indexOf('x-amz')) continue | ||
buf.push(field + ':' + val) | ||
} | ||
return buf.sort().join('\n'); | ||
return buf.sort().join('\n') | ||
}; | ||
@@ -190,13 +192,12 @@ | ||
, path = url.pathname | ||
, buf = []; | ||
, buf = [] | ||
; | ||
Object.keys(url.query).forEach(function(key){ | ||
if (!~keys.indexOf(key)) return; | ||
var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]); | ||
buf.push(key + val); | ||
}); | ||
if (!~keys.indexOf(key)) return | ||
var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) | ||
buf.push(key + val) | ||
}) | ||
return path + (buf.length | ||
? '?' + buf.sort().join('&') | ||
: ''); | ||
return path + (buf.length ? '?' + buf.sort().join('&') : '') | ||
}; |
@@ -37,3 +37,3 @@ module.exports = ForeverAgent | ||
// default to Connection:keep-alive. | ||
socket.destroy(); | ||
socket.destroy() | ||
} | ||
@@ -65,10 +65,10 @@ }) | ||
if (this.sockets[name]) { | ||
var index = this.sockets[name].indexOf(s); | ||
var index = this.sockets[name].indexOf(s) | ||
if (index !== -1) { | ||
this.sockets[name].splice(index, 1); | ||
this.sockets[name].splice(index, 1) | ||
} | ||
} else if (this.sockets[name] && this.sockets[name].length === 0) { | ||
// don't leak | ||
delete this.sockets[name]; | ||
delete this.requests[name]; | ||
delete this.sockets[name] | ||
delete this.requests[name] | ||
} | ||
@@ -89,3 +89,3 @@ | ||
// needs to be created to take over in the pool for the one that closed. | ||
this.createSocket(name, host, port).emit('free'); | ||
this.createSocket(name, host, port).emit('free') | ||
} | ||
@@ -92,0 +92,0 @@ } |
121
main.js
@@ -136,3 +136,4 @@ // Copyright 2010-2012 Mikeal Rogers | ||
if (!self.uri) { | ||
throw new Error("options.uri is a required argument") | ||
// this will throw if unhandled but is handleable when in a redirect | ||
return self.emit('error', new Error("options.uri is a required argument")) | ||
} else { | ||
@@ -177,3 +178,3 @@ if (typeof self.uri == "string") self.uri = url.parse(self.uri) | ||
self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true | ||
self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false; | ||
self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false | ||
if (self.followRedirect || self.followAllRedirects) | ||
@@ -294,2 +295,3 @@ self.redirects = self.redirects || [] | ||
if (length) { | ||
if(!self.headers['content-length'] && !self.headers['Content-Length']) | ||
self.headers['content-length'] = length | ||
@@ -307,3 +309,3 @@ } else { | ||
if (!self.httpModule) throw new Error("Invalid protocol") | ||
if (!self.httpModule) return this.emit('error', new Error("Invalid protocol")) | ||
@@ -352,2 +354,4 @@ if (options.ca) self.ca = options.ca | ||
} | ||
if (self._json && !self.headers['content-type'] && !self.headers['Content-Type']) | ||
self.headers['content-type'] = 'application/json' | ||
if (src.method && !self.method) { | ||
@@ -384,5 +388,5 @@ self.method = src.method | ||
if (self.method !== 'GET' && typeof self.method !== 'undefined') { | ||
self.headers['content-length'] = 0; | ||
self.headers['content-length'] = 0 | ||
} | ||
self.end(); | ||
self.end() | ||
} | ||
@@ -515,3 +519,3 @@ self.ntick = true | ||
if (self.src && self.src.stat && self.src.stat.size) { | ||
if (self.src && self.src.stat && self.src.stat.size && !self.headers['content-length'] && !self.headers['Content-Length']) { | ||
self.headers['content-length'] = self.src.stat.size | ||
@@ -522,3 +526,2 @@ } | ||
} | ||
self.req = self.httpModule.request(self, function (response) { | ||
@@ -587,3 +590,3 @@ if (response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) { | ||
if (self.followAllRedirects) self.method = 'GET' | ||
// self.method = 'GET'; // Force all redirects to use GET || commented out fixes #215 | ||
// self.method = 'GET' // Force all redirects to use GET || commented out fixes #215 | ||
delete self.src | ||
@@ -594,4 +597,7 @@ delete self.req | ||
delete self.body | ||
delete self._form | ||
if (self.headers) { | ||
delete self.headers.host | ||
delete self.headers['content-type'] | ||
delete self.headers['content-length'] | ||
} | ||
@@ -704,3 +710,3 @@ if (log) log('Redirect to %uri', self) | ||
Request.prototype.abort = function () { | ||
this._aborted = true; | ||
this._aborted = true | ||
@@ -775,5 +781,5 @@ if (this.req) { | ||
if (!self.headers['content-type']) { | ||
self.headers['content-type'] = 'multipart/related; boundary=' + self.boundary; | ||
self.headers['content-type'] = 'multipart/related; boundary=' + self.boundary | ||
} else { | ||
self.headers['content-type'] = self.headers['content-type'].split(';')[0] + '; boundary=' + self.boundary; | ||
self.headers['content-type'] = self.headers['content-type'].split(';')[0] + '; boundary=' + self.boundary | ||
} | ||
@@ -804,8 +810,11 @@ | ||
Request.prototype.json = function (val) { | ||
this.setHeader('content-type', 'application/json') | ||
this.setHeader('accept', 'application/json') | ||
this._json = true | ||
if (typeof val === 'boolean') { | ||
if (typeof this.body === 'object') this.body = JSON.stringify(this.body) | ||
if (typeof this.body === 'object') { | ||
this.setHeader('content-type', 'application/json') | ||
this.body = JSON.stringify(this.body) | ||
} | ||
} else { | ||
this.setHeader('content-type', 'application/json') | ||
this.body = JSON.stringify(val) | ||
@@ -815,2 +824,11 @@ } | ||
} | ||
function getHeader(name, headers) { | ||
var result, re, match | ||
Object.keys(headers).forEach(function (key) { | ||
re = new RegExp(name, 'i') | ||
match = key.match(re) | ||
if (match) result = headers[key] | ||
}) | ||
return result | ||
} | ||
Request.prototype.aws = function (opts, now) { | ||
@@ -823,13 +841,22 @@ if (!now) { | ||
this.setHeader('date', date.toUTCString()) | ||
this.setHeader('authorization', aws.authorization( | ||
var auth = | ||
{ key: opts.key | ||
, secret: opts.secret | ||
, verb: this.method | ||
, verb: this.method.toUpperCase() | ||
, date: date | ||
, resource: aws.canonicalizeResource('/' + opts.bucket + this.path) | ||
, contentType: this.headers['content-type'] || '' | ||
, md5: this.headers['content-md5'] || '' | ||
, contentType: getHeader('content-type', this.headers) || '' | ||
, md5: getHeader('content-md5', this.headers) || '' | ||
, amazonHeaders: aws.canonicalizeHeaders(this.headers) | ||
} | ||
)) | ||
if (opts.bucket && this.path) { | ||
auth.resource = '/' + opts.bucket + this.path | ||
} else if (opts.bucket && !this.path) { | ||
auth.resource = '/' + opts.bucket | ||
} else if (!opts.bucket && this.path) { | ||
auth.resource = this.path | ||
} else if (!opts.bucket && !this.path) { | ||
auth.resource = '/' | ||
} | ||
auth.resource = aws.canonicalizeResource(auth.resource) | ||
this.setHeader('authorization', aws.authorization(auth)) | ||
@@ -874,3 +901,3 @@ return this | ||
delete oa['oauth_'+i] | ||
delete oa[i] | ||
if (i !== 'x_auth_mode') delete oa[i] | ||
} | ||
@@ -880,3 +907,3 @@ } | ||
'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') | ||
this.headers.Authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"' | ||
this.headers.Authorization += ',oauth_signature="' + oauth.rfc3986(signature) + '"' | ||
return this | ||
@@ -893,4 +920,4 @@ } | ||
// disable cookies | ||
cookies = false; | ||
this._disableCookies = true; | ||
cookies = false | ||
this._disableCookies = true | ||
} else if (jar) { | ||
@@ -962,12 +989,12 @@ // fetch cookie from the user defined cookie jar | ||
function initParams(uri, options, callback) { | ||
if ((typeof options === 'function') && !callback) callback = options; | ||
if ((typeof options === 'function') && !callback) callback = options | ||
if (options && typeof options === 'object') { | ||
options.uri = uri; | ||
options.uri = uri | ||
} else if (typeof uri === 'string') { | ||
options = {uri:uri}; | ||
options = {uri:uri} | ||
} else { | ||
options = uri; | ||
uri = options.uri; | ||
options = uri | ||
uri = options.uri | ||
} | ||
return { uri: uri, options: options, callback: callback }; | ||
return { uri: uri, options: options, callback: callback } | ||
} | ||
@@ -977,12 +1004,12 @@ | ||
if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.') | ||
if ((typeof options === 'function') && !callback) callback = options; | ||
if ((typeof options === 'function') && !callback) callback = options | ||
if (options && typeof options === 'object') { | ||
options.uri = uri; | ||
options.uri = uri | ||
} else if (typeof uri === 'string') { | ||
options = {uri:uri}; | ||
options = {uri:uri} | ||
} else { | ||
options = uri; | ||
options = uri | ||
} | ||
if (callback) options.callback = callback; | ||
if (callback) options.callback = callback | ||
var r = new Request(options) | ||
@@ -994,3 +1021,3 @@ return r | ||
request.initParams = initParams; | ||
request.initParams = initParams | ||
@@ -1000,3 +1027,3 @@ request.defaults = function (options, requester) { | ||
var d = function (uri, opts, callback) { | ||
var params = initParams(uri, opts, callback); | ||
var params = initParams(uri, opts, callback) | ||
for (var i in options) { | ||
@@ -1007,10 +1034,10 @@ if (params.options[i] === undefined) params.options[i] = options[i] | ||
if(method === request) { | ||
method = requester; | ||
method = requester | ||
} else { | ||
params.options._requester = requester; | ||
params.options._requester = requester | ||
} | ||
} | ||
return method(params.options, params.callback); | ||
return method(params.options, params.callback) | ||
} | ||
return d; | ||
return d | ||
} | ||
@@ -1024,3 +1051,3 @@ var de = def(request) | ||
de.cookie = def(request.cookie) | ||
de.jar = def(request.jar) | ||
de.jar = request.jar | ||
return de | ||
@@ -1043,8 +1070,8 @@ } | ||
request.post = function (uri, options, callback) { | ||
var params = initParams(uri, options, callback); | ||
params.options.method = 'POST'; | ||
var params = initParams(uri, options, callback) | ||
params.options.method = 'POST' | ||
return request(params.uri || null, params.options, params.callback) | ||
} | ||
request.put = function (uri, options, callback) { | ||
var params = initParams(uri, options, callback); | ||
var params = initParams(uri, options, callback) | ||
params.options.method = 'PUT' | ||
@@ -1054,3 +1081,3 @@ return request(params.uri || null, params.options, params.callback) | ||
request.head = function (uri, options, callback) { | ||
var params = initParams(uri, options, callback); | ||
var params = initParams(uri, options, callback) | ||
params.options.method = 'HEAD' | ||
@@ -1066,6 +1093,6 @@ if (params.options.body || | ||
request.del = function (uri, options, callback) { | ||
var params = initParams(uri, options, callback); | ||
var params = initParams(uri, options, callback) | ||
params.options.method = 'DELETE' | ||
if(typeof params.options._requester === 'function') { | ||
request = params.options._requester; | ||
request = params.options._requester | ||
} | ||
@@ -1072,0 +1099,0 @@ return request(params.uri || null, params.options, params.callback) |
33
oauth.js
@@ -19,13 +19,22 @@ var crypto = require('crypto') | ||
function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret, body) { | ||
// adapted from https://dev.twitter.com/docs/auth/oauth | ||
var base = | ||
(httpMethod || 'GET') + "&" + | ||
encodeURIComponent( base_uri ) + "&" + | ||
Object.keys(params).sort().map(function (i) { | ||
// big WTF here with the escape + encoding but it's what twitter wants | ||
return escape(rfc3986(i)) + "%3D" + escape(rfc3986(params[i])) | ||
}).join("%26") | ||
var key = encodeURIComponent(consumer_secret) + '&' | ||
if (token_secret) key += encodeURIComponent(token_secret) | ||
function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { | ||
// adapted from https://dev.twitter.com/docs/auth/oauth and | ||
// https://dev.twitter.com/docs/auth/creating-signature | ||
var querystring = Object.keys(params).sort().map(function(key){ | ||
// big WTF here with the escape + encoding but it's what twitter wants | ||
return escape(rfc3986(key)) + "%3D" + escape(rfc3986(params[key])) | ||
}).join('%26') | ||
var base = [ | ||
httpMethod ? httpMethod.toUpperCase() : 'GET', | ||
rfc3986(base_uri), | ||
querystring | ||
].join('&') | ||
var key = [ | ||
consumer_secret, | ||
token_secret || '' | ||
].map(rfc3986).join('&') | ||
return sha1(key, base) | ||
@@ -35,2 +44,2 @@ } | ||
exports.hmacsign = hmacsign | ||
exports.rfc3986 = rfc3986 | ||
exports.rfc3986 = rfc3986 |
{ "name" : "request" | ||
, "description" : "Simplified HTTP request client." | ||
, "tags" : ["http", "simple", "util", "utility"] | ||
, "version" : "2.11.4" | ||
, "version" : "2.12.0" | ||
, "author" : "Mikeal Rogers <mikeal.rogers@gmail.com>" | ||
@@ -6,0 +6,0 @@ , "repository" : |
@@ -189,2 +189,3 @@ # Request -- Simplified HTTP request method | ||
* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) | ||
* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services) | ||
@@ -191,0 +192,0 @@ |
@@ -49,3 +49,3 @@ var fs = require('fs') | ||
} | ||
exports.createPostValidator = function (text) { | ||
exports.createPostValidator = function (text, reqContentType) { | ||
var l = function (req, resp) { | ||
@@ -61,2 +61,6 @@ var r = ''; | ||
assert.equal(r, text) | ||
if (reqContentType) { | ||
assert.ok(req.headers['content-type']) | ||
assert.ok(~req.headers['content-type'].indexOf(reqContentType)) | ||
} | ||
resp.writeHead(200, {'content-type':'text/plain'}) | ||
@@ -63,0 +67,0 @@ resp.write('OK') |
@@ -26,3 +26,3 @@ var server = require('./server') | ||
assert.equal(req.headers.foo, 'bar'); | ||
assert.equal(req.headers['content-type'], 'application/json'); | ||
assert.equal(req.headers['content-type'], null); | ||
assert.equal(req.method, 'POST') | ||
@@ -40,2 +40,17 @@ resp.writeHead(200, {'Content-Type': 'application/json'}); | ||
s.on('/post-body', function (req, resp) { | ||
assert.equal(req.headers.foo, 'bar'); | ||
assert.equal(req.headers['content-type'], 'application/json'); | ||
assert.equal(req.method, 'POST') | ||
resp.writeHead(200, {'Content-Type': 'application/json'}); | ||
resp.end(JSON.stringify({foo:'bar'})); | ||
}); | ||
// test post(string, object, function) with body | ||
request.defaults({headers:{foo:"bar"}}).post(s.url + '/post-body', {json: true, body:{bar:"baz"}}, function (e, r, b){ | ||
if (e) throw e; | ||
assert.deepEqual('bar', b.foo); | ||
counter += 1; | ||
}); | ||
s.on('/del', function (req, resp) { | ||
@@ -42,0 +57,0 @@ assert.equal(req.headers.foo, 'bar'); |
@@ -61,3 +61,17 @@ var server = require('./server') | ||
// Test pipeing to a request object with a json body | ||
s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json")); | ||
var mybodydata = new stream.Stream(); | ||
mybodydata.readable = true | ||
counter++ | ||
var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () { | ||
check(); | ||
}) | ||
mybodydata.pipe(r2) | ||
mybodydata.emit('data', JSON.stringify({foo:"bar"})); | ||
mybodydata.emit('end'); | ||
// Test pipeing from a request object. | ||
@@ -64,0 +78,0 @@ s.once('/pull', server.createGetResponse("mypulldata")); |
247
tunnel.js
@@ -1,42 +0,42 @@ | ||
'use strict'; | ||
'use strict' | ||
var net = require('net'); | ||
var tls = require('tls'); | ||
var http = require('http'); | ||
var https = require('https'); | ||
var events = require('events'); | ||
var assert = require('assert'); | ||
var util = require('util'); | ||
var net = require('net') | ||
, tls = require('tls') | ||
, http = require('http') | ||
, https = require('https') | ||
, events = require('events') | ||
, assert = require('assert') | ||
, util = require('util') | ||
; | ||
exports.httpOverHttp = httpOverHttp | ||
exports.httpsOverHttp = httpsOverHttp | ||
exports.httpOverHttps = httpOverHttps | ||
exports.httpsOverHttps = httpsOverHttps | ||
exports.httpOverHttp = httpOverHttp; | ||
exports.httpsOverHttp = httpsOverHttp; | ||
exports.httpOverHttps = httpOverHttps; | ||
exports.httpsOverHttps = httpsOverHttps; | ||
function httpOverHttp(options) { | ||
var agent = new TunnelingAgent(options); | ||
agent.request = http.request; | ||
return agent; | ||
var agent = new TunnelingAgent(options) | ||
agent.request = http.request | ||
return agent | ||
} | ||
function httpsOverHttp(options) { | ||
var agent = new TunnelingAgent(options); | ||
agent.request = http.request; | ||
agent.createSocket = createSecureSocket; | ||
return agent; | ||
var agent = new TunnelingAgent(options) | ||
agent.request = http.request | ||
agent.createSocket = createSecureSocket | ||
return agent | ||
} | ||
function httpOverHttps(options) { | ||
var agent = new TunnelingAgent(options); | ||
agent.request = https.request; | ||
return agent; | ||
var agent = new TunnelingAgent(options) | ||
agent.request = https.request | ||
return agent | ||
} | ||
function httpsOverHttps(options) { | ||
var agent = new TunnelingAgent(options); | ||
agent.request = https.request; | ||
agent.createSocket = createSecureSocket; | ||
return agent; | ||
var agent = new TunnelingAgent(options) | ||
agent.request = https.request | ||
agent.createSocket = createSecureSocket | ||
return agent | ||
} | ||
@@ -46,33 +46,33 @@ | ||
function TunnelingAgent(options) { | ||
var self = this; | ||
self.options = options || {}; | ||
self.proxyOptions = self.options.proxy || {}; | ||
self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; | ||
self.requests = []; | ||
self.sockets = []; | ||
var self = this | ||
self.options = options || {} | ||
self.proxyOptions = self.options.proxy || {} | ||
self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets | ||
self.requests = [] | ||
self.sockets = [] | ||
self.on('free', function onFree(socket, host, port) { | ||
for (var i = 0, len = self.requests.length; i < len; ++i) { | ||
var pending = self.requests[i]; | ||
var pending = self.requests[i] | ||
if (pending.host === host && pending.port === port) { | ||
// Detect the request to connect same origin server, | ||
// reuse the connection. | ||
self.requests.splice(i, 1); | ||
pending.request.onSocket(socket); | ||
return; | ||
self.requests.splice(i, 1) | ||
pending.request.onSocket(socket) | ||
return | ||
} | ||
} | ||
socket.destroy(); | ||
self.removeSocket(socket); | ||
}); | ||
socket.destroy() | ||
self.removeSocket(socket) | ||
}) | ||
} | ||
util.inherits(TunnelingAgent, events.EventEmitter); | ||
util.inherits(TunnelingAgent, events.EventEmitter) | ||
TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) { | ||
var self = this; | ||
var self = this | ||
if (self.sockets.length >= this.maxSockets) { | ||
// We are over limit so we'll add it to the queue. | ||
self.requests.push({host: host, port: port, request: req}); | ||
return; | ||
self.requests.push({host: host, port: port, request: req}) | ||
return | ||
} | ||
@@ -82,48 +82,49 @@ | ||
self.createSocket({host: host, port: port, request: req}, function(socket) { | ||
socket.on('free', onFree); | ||
socket.on('close', onCloseOrRemove); | ||
socket.on('agentRemove', onCloseOrRemove); | ||
req.onSocket(socket); | ||
socket.on('free', onFree) | ||
socket.on('close', onCloseOrRemove) | ||
socket.on('agentRemove', onCloseOrRemove) | ||
req.onSocket(socket) | ||
function onFree() { | ||
self.emit('free', socket, host, port); | ||
self.emit('free', socket, host, port) | ||
} | ||
function onCloseOrRemove(err) { | ||
self.removeSocket(); | ||
socket.removeListener('free', onFree); | ||
socket.removeListener('close', onCloseOrRemove); | ||
socket.removeListener('agentRemove', onCloseOrRemove); | ||
self.removeSocket() | ||
socket.removeListener('free', onFree) | ||
socket.removeListener('close', onCloseOrRemove) | ||
socket.removeListener('agentRemove', onCloseOrRemove) | ||
} | ||
}); | ||
}; | ||
}) | ||
} | ||
TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { | ||
var self = this; | ||
var placeholder = {}; | ||
self.sockets.push(placeholder); | ||
var self = this | ||
var placeholder = {} | ||
self.sockets.push(placeholder) | ||
var connectOptions = mergeOptions({}, self.proxyOptions, { | ||
method: 'CONNECT', | ||
path: options.host + ':' + options.port, | ||
agent: false | ||
}); | ||
var connectOptions = mergeOptions({}, self.proxyOptions, | ||
{ method: 'CONNECT' | ||
, path: options.host + ':' + options.port | ||
, agent: false | ||
} | ||
) | ||
if (connectOptions.proxyAuth) { | ||
connectOptions.headers = connectOptions.headers || {}; | ||
connectOptions.headers = connectOptions.headers || {} | ||
connectOptions.headers['Proxy-Authorization'] = 'Basic ' + | ||
new Buffer(connectOptions.proxyAuth).toString('base64'); | ||
new Buffer(connectOptions.proxyAuth).toString('base64') | ||
} | ||
debug('making CONNECT request'); | ||
var connectReq = self.request(connectOptions); | ||
connectReq.useChunkedEncodingByDefault = false; // for v0.6 | ||
connectReq.once('response', onResponse); // for v0.6 | ||
connectReq.once('upgrade', onUpgrade); // for v0.6 | ||
connectReq.once('connect', onConnect); // for v0.7 or later | ||
connectReq.once('error', onError); | ||
connectReq.end(); | ||
debug('making CONNECT request') | ||
var connectReq = self.request(connectOptions) | ||
connectReq.useChunkedEncodingByDefault = false // for v0.6 | ||
connectReq.once('response', onResponse) // for v0.6 | ||
connectReq.once('upgrade', onUpgrade) // for v0.6 | ||
connectReq.once('connect', onConnect) // for v0.7 or later | ||
connectReq.once('error', onError) | ||
connectReq.end() | ||
function onResponse(res) { | ||
// Very hacky. This is necessary to avoid http-parser leaks. | ||
res.upgrade = true; | ||
res.upgrade = true | ||
} | ||
@@ -134,23 +135,21 @@ | ||
process.nextTick(function() { | ||
onConnect(res, socket, head); | ||
}); | ||
onConnect(res, socket, head) | ||
}) | ||
} | ||
function onConnect(res, socket, head) { | ||
connectReq.removeAllListeners(); | ||
socket.removeAllListeners(); | ||
connectReq.removeAllListeners() | ||
socket.removeAllListeners() | ||
if (res.statusCode === 200) { | ||
assert.equal(head.length, 0); | ||
debug('tunneling connection has established'); | ||
self.sockets[self.sockets.indexOf(placeholder)] = socket; | ||
cb(socket); | ||
assert.equal(head.length, 0) | ||
debug('tunneling connection has established') | ||
self.sockets[self.sockets.indexOf(placeholder)] = socket | ||
cb(socket) | ||
} else { | ||
debug('tunneling socket could not be established, statusCode=%d', | ||
res.statusCode); | ||
var error = new Error('tunneling socket could not be established, ' + | ||
'sutatusCode=' + res.statusCode); | ||
error.code = 'ECONNRESET'; | ||
options.request.emit('error', error); | ||
self.removeSocket(placeholder); | ||
debug('tunneling socket could not be established, statusCode=%d', res.statusCode) | ||
var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) | ||
error.code = 'ECONNRESET' | ||
options.request.emit('error', error) | ||
self.removeSocket(placeholder) | ||
} | ||
@@ -160,22 +159,19 @@ } | ||
function onError(cause) { | ||
connectReq.removeAllListeners(); | ||
connectReq.removeAllListeners() | ||
debug('tunneling socket could not be established, cause=%s\n', | ||
cause.message, cause.stack); | ||
var error = new Error('tunneling socket could not be established, ' + | ||
'cause=' + cause.message); | ||
error.code = 'ECONNRESET'; | ||
options.request.emit('error', error); | ||
self.removeSocket(placeholder); | ||
debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) | ||
var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) | ||
error.code = 'ECONNRESET' | ||
options.request.emit('error', error) | ||
self.removeSocket(placeholder) | ||
} | ||
}; | ||
} | ||
TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { | ||
var pos = this.sockets.indexOf(socket) | ||
if (pos === -1) { | ||
return; | ||
} | ||
this.sockets.splice(pos, 1); | ||
if (pos === -1) return | ||
this.sockets.splice(pos, 1) | ||
var pending = this.requests.shift(); | ||
var pending = this.requests.shift() | ||
if (pending) { | ||
@@ -185,17 +181,18 @@ // If we have pending requests and a socket gets closed a new one | ||
this.createSocket(pending, function(socket) { | ||
pending.request.onSocket(socket); | ||
}); | ||
pending.request.onSocket(socket) | ||
}) | ||
} | ||
}; | ||
} | ||
function createSecureSocket(options, cb) { | ||
var self = this; | ||
var self = this | ||
TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { | ||
// 0 is dummy port for v0.6 | ||
var secureSocket = tls.connect(0, mergeOptions({}, self.options, { | ||
servername: options.host, | ||
socket: socket | ||
})); | ||
cb(secureSocket); | ||
}); | ||
var secureSocket = tls.connect(0, mergeOptions({}, self.options, | ||
{ servername: options.host | ||
, socket: socket | ||
} | ||
)) | ||
cb(secureSocket) | ||
}) | ||
} | ||
@@ -206,9 +203,9 @@ | ||
for (var i = 1, len = arguments.length; i < len; ++i) { | ||
var overrides = arguments[i]; | ||
var overrides = arguments[i] | ||
if (typeof overrides === 'object') { | ||
var keys = Object.keys(overrides); | ||
var keys = Object.keys(overrides) | ||
for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { | ||
var k = keys[j]; | ||
var k = keys[j] | ||
if (overrides[k] !== undefined) { | ||
target[k] = overrides[k]; | ||
target[k] = overrides[k] | ||
} | ||
@@ -218,20 +215,20 @@ } | ||
} | ||
return target; | ||
return target | ||
} | ||
var debug; | ||
var debug | ||
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { | ||
debug = function() { | ||
var args = Array.prototype.slice.call(arguments); | ||
var args = Array.prototype.slice.call(arguments) | ||
if (typeof args[0] === 'string') { | ||
args[0] = 'TUNNEL: ' + args[0]; | ||
args[0] = 'TUNNEL: ' + args[0] | ||
} else { | ||
args.unshift('TUNNEL:'); | ||
args.unshift('TUNNEL:') | ||
} | ||
console.error.apply(console, args); | ||
console.error.apply(console, args) | ||
} | ||
} else { | ||
debug = function() {}; | ||
debug = function() {} | ||
} | ||
exports.debug = debug; // for test | ||
exports.debug = debug // for test |
12
uuid.js
module.exports = function () { | ||
var s = [], itoh = '0123456789ABCDEF'; | ||
var s = [], itoh = '0123456789ABCDEF' | ||
// Make array of random hex digits. The UUID only has 32 digits in it, but we | ||
// allocate an extra items to make room for the '-'s we'll be inserting. | ||
for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10); | ||
for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10) | ||
// Conform to RFC-4122, section 4.4 | ||
s[14] = 4; // Set 4 high bits of time_high field to version | ||
s[19] = (s[19] & 0x3) | 0x8; // Specify 2 high bits of clock sequence | ||
s[19] = (s[19] & 0x3) | 0x8 // Specify 2 high bits of clock sequence | ||
// Convert to hex chars | ||
for (var i = 0; i <36; i++) s[i] = itoh[s[i]]; | ||
for (var i = 0; i <36; i++) s[i] = itoh[s[i]] | ||
// Insert '-'s | ||
s[8] = s[13] = s[18] = s[23] = '-'; | ||
s[8] = s[13] = s[18] = s[23] = '-' | ||
return s.join(''); | ||
return s.join('') | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
553728
8161
311