Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorForrest L Norvell <forrest@npmjs.com>2014-10-31 12:14:19 +0300
committerForrest L Norvell <forrest@npmjs.com>2014-10-31 12:27:12 +0300
commit73ee2aa4f1a47e43fe7cf4317a5446875f7521fa (patch)
tree2fd46ceb9ef67fef4d3624c195b7fdb80edf1354 /node_modules/request/request.js
parent254f0e4adaf2c56e9df25c7343c43b0b0804a3b5 (diff)
request@2.47.0
Diffstat (limited to 'node_modules/request/request.js')
-rw-r--r--node_modules/request/request.js141
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