diff options
author | Forrest L Norvell <forrest@npmjs.com> | 2014-10-31 12:14:19 +0300 |
---|---|---|
committer | Forrest L Norvell <forrest@npmjs.com> | 2014-10-31 12:27:12 +0300 |
commit | 73ee2aa4f1a47e43fe7cf4317a5446875f7521fa (patch) | |
tree | 2fd46ceb9ef67fef4d3624c195b7fdb80edf1354 /node_modules/request/request.js | |
parent | 254f0e4adaf2c56e9df25c7343c43b0b0804a3b5 (diff) |
request@2.47.0
Diffstat (limited to 'node_modules/request/request.js')
-rw-r--r-- | node_modules/request/request.js | 141 |
1 files changed, 68 insertions, 73 deletions
diff --git a/node_modules/request/request.js b/node_modules/request/request.js index 466d91655..862e3ac0b 100644 --- a/node_modules/request/request.js +++ b/node_modules/request/request.js @@ -25,6 +25,7 @@ var http = require('http') , copy = require('./lib/copy') , debug = require('./lib/debug') , net = require('net') + , CombinedStream = require('combined-stream') var safeStringify = helpers.safeStringify , md5 = helpers.md5 @@ -56,7 +57,6 @@ var defaultProxyHeaderWhiteList = [ 'expect', 'max-forwards', 'pragma', - 'proxy-authorization', 'referer', 'te', 'transfer-encoding', @@ -64,6 +64,10 @@ var defaultProxyHeaderWhiteList = [ 'via' ] +var defaultProxyHeaderExclusiveList = [ + 'proxy-authorization' +] + function filterForNonReserved(reserved, options) { // Filter out properties that are not reserved. // Reserved values are passed in at call site. @@ -111,9 +115,15 @@ function constructProxyHost(uriObject) { } function constructProxyHeaderWhiteList(headers, proxyHeaderWhiteList) { + var whiteList = proxyHeaderWhiteList + .reduce(function (set, header) { + set[header] = true + return set + }, {}) + return Object.keys(headers) .filter(function (header) { - return proxyHeaderWhiteList.indexOf(header.toLowerCase()) !== -1 + return whiteList[header.toLowerCase()] }) .reduce(function (set, header) { set[header] = headers[header] @@ -123,23 +133,13 @@ function constructProxyHeaderWhiteList(headers, proxyHeaderWhiteList) { function construcTunnelOptions(request) { var proxy = request.proxy - var proxyHeaders = request.proxyHeaders - var proxyAuth - - if (proxy.auth) { - proxyAuth = proxy.auth - } - - if (!proxy.auth && request.proxyAuthorization) { - proxyHeaders['Proxy-Authorization'] = request.proxyAuthorization - } var tunnelOptions = { proxy: { host: proxy.hostname, port: +proxy.port, - proxyAuth: proxyAuth, - headers: proxyHeaders + proxyAuth: proxy.auth, + headers: request.proxyHeaders }, rejectUnauthorized: request.rejectUnauthorized, headers: request.headers, @@ -303,14 +303,28 @@ Request.prototype.setupTunnel = function () { return false } + // Always include `defaultProxyHeaderExclusiveList` + + if (!self.proxyHeaderExclusiveList) { + self.proxyHeaderExclusiveList = [] + } + + var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList) + + // Treat `proxyHeaderExclusiveList` as part of `proxyHeaderWhiteList` + if (!self.proxyHeaderWhiteList) { self.proxyHeaderWhiteList = defaultProxyHeaderWhiteList } + var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList) + var proxyHost = constructProxyHost(self.uri) - self.proxyHeaders = constructProxyHeaderWhiteList(self.headers, self.proxyHeaderWhiteList) + self.proxyHeaders = constructProxyHeaderWhiteList(self.headers, proxyHeaderWhiteList) self.proxyHeaders.host = proxyHost + proxyHeaderExclusiveList.forEach(self.removeHeader, self) + var tunnelFn = getTunnelFn(self) var tunnelOptions = construcTunnelOptions(self) @@ -331,12 +345,6 @@ Request.prototype.init = function (options) { caseless.httpify(self, self.headers) - // Never send proxy-auth to the endpoint! - if (self.hasHeader('proxy-authorization')) { - self.proxyAuthorization = self.getHeader('proxy-authorization') - self.removeHeader('proxy-authorization') - } - if (!self.method) { self.method = options.method || 'GET' } @@ -447,11 +455,12 @@ Request.prototype.init = function (options) { self.setHost = false if (!self.hasHeader('host')) { - self.setHeader('host', self.uri.hostname) + var hostHeaderName = self.originalHostHeaderName || 'host' + self.setHeader(hostHeaderName, self.uri.hostname) if (self.uri.port) { if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && !(self.uri.port === 443 && self.uri.protocol === 'https:') ) { - self.setHeader('host', self.getHeader('host') + (':' + self.uri.port) ) + self.setHeader(hostHeaderName, self.getHeader('host') + (':' + self.uri.port) ) } } self.setHost = true @@ -556,17 +565,12 @@ Request.prototype.init = function (options) { self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true) } - if (self.proxy && !self.tunnel) { - if (self.proxy.auth && !self.proxyAuthorization) { - var proxyAuthPieces = self.proxy.auth.split(':').map(function(item){ - return querystring.unescape(item) - }) - var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) - self.proxyAuthorization = authHeader - } - if (self.proxyAuthorization) { - self.setHeader('proxy-authorization', self.proxyAuthorization) - } + if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) { + var proxyAuthPieces = self.proxy.auth.split(':').map(function(item){ + return querystring.unescape(item) + }) + var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) + self.setHeader('proxy-authorization', authHeader) } if (self.proxy && !self.tunnel) { @@ -634,15 +638,7 @@ Request.prototype.init = function (options) { if (self.pool === false) { self.agent = false } else { - self.agent = self.agent || self.getAgent() - if (self.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.maxSockets - } - if (self.pool.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.pool.maxSockets - } + self.agent = self.agent || self.getNewAgent() } self.on('pipe', function (src) { @@ -684,14 +680,11 @@ Request.prototype.init = function (options) { if (self._form) { self._form.pipe(self) } + if (self._multipart) { + self._multipart.pipe(self) + } if (self.body) { - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } + self.write(self.body) self.end() } else if (self.requestBodyStream) { console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.') @@ -753,7 +746,7 @@ Request.prototype._updateProtocol = function () { // if there's an agent, we need to get a new one. if (self.agent) { - self.agent = self.getAgent() + self.agent = self.getNewAgent() } } else { @@ -774,12 +767,12 @@ Request.prototype._updateProtocol = function () { // if there's an agent, then get a new one. if (self.agent) { self.agent = null - self.agent = self.getAgent() + self.agent = self.getNewAgent() } } } -Request.prototype.getAgent = function () { +Request.prototype.getNewAgent = function () { var self = this var Agent = self.agentClass var options = {} @@ -816,16 +809,6 @@ Request.prototype.getAgent = function () { poolKey += Agent.name } - if (!self.httpModule.globalAgent) { - // node 0.4.x - options.host = self.host - options.port = self.port - if (poolKey) { - poolKey += ':' - } - poolKey += self.host + ':' + self.port - } - // ca option is only relevant if proxy or destination are https var proxy = self.proxy if (typeof proxy === 'string') { @@ -885,6 +868,10 @@ Request.prototype.getAgent = function () { // generate a new agent for this setting if none yet exists if (!self.pool[poolKey]) { self.pool[poolKey] = new Agent(options) + // properly set maxSockets on new agents + if (self.pool.maxSockets) { + self.pool[poolKey].maxSockets = self.pool.maxSockets + } } return self.pool[poolKey] @@ -1015,8 +1002,13 @@ Request.prototype.onRequestResponse = function (response) { } // Save the original host before any redirect (if it changes, we need to - // remove any authorization headers) - self.originalHost = self.headers.host + // remove any authorization headers). Also remember the case of the header + // name because lots of broken servers expect Host instead of host and we + // want the caller to be able to specify this. + self.originalHost = self.getHeader('host') + if (!self.originalHostHeaderName) { + self.originalHostHeaderName = self.hasHeader('host') + } if (self.setHost) { self.removeHeader('host') } @@ -1421,7 +1413,7 @@ Request.prototype.form = function (form) { } Request.prototype.multipart = function (multipart) { var self = this - self.body = [] + self._multipart = new CombinedStream() if (!self.hasHeader('content-type')) { self.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) @@ -1435,7 +1427,7 @@ Request.prototype.multipart = function (multipart) { } if (self.preambleCRLF) { - self.body.push(new Buffer('\r\n')) + self._multipart.append('\r\n') } multipart.forEach(function (part) { @@ -1443,20 +1435,20 @@ Request.prototype.multipart = function (multipart) { if(typeof body === 'undefined') { throw new Error('Body attribute missing in multipart.') } - delete part.body var preamble = '--' + self.boundary + '\r\n' Object.keys(part).forEach(function (key) { + if (key === 'body') { return } preamble += key + ': ' + part[key] + '\r\n' }) preamble += '\r\n' - self.body.push(new Buffer(preamble)) - self.body.push(new Buffer(body)) - self.body.push(new Buffer('\r\n')) + self._multipart.append(preamble) + self._multipart.append(body) + self._multipart.append('\r\n') }) - self.body.push(new Buffer('--' + self.boundary + '--')) + self._multipart.append('--' + self.boundary + '--') if (self.postambleCRLF) { - self.body.push(new Buffer('\r\n')) + self._multipart.append('\r\n') } return self @@ -1736,6 +1728,9 @@ Request.prototype.destroy = function () { Request.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList.slice() +Request.defaultProxyHeaderExclusiveList = + defaultProxyHeaderExclusiveList.slice() + // Exports Request.prototype.toJSON = requestToJSON |