summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/request
diff options
context:
space:
mode:
authorisaacs <i@izs.me>2012-05-04 15:12:47 -0700
committerisaacs <i@izs.me>2012-05-04 15:12:47 -0700
commit01d146c29f318fb3dce485e49c2541f53dc4a952 (patch)
treec659dc29764875d840e8cf6d9c194fac513a91c5 /deps/npm/node_modules/request
parent1de43149bbb8c42b80cef4c25509390f3b4000cc (diff)
parent992e3464b8997210ea7f40f03f0386f8dd4f4f86 (diff)
downloadnode-new-01d146c29f318fb3dce485e49c2541f53dc4a952.tar.gz
Merge remote-tracking branch 'ry/v0.6' into v0.6-merge
Conflicts: ChangeLog Makefile deps/npm/AUTHORS deps/npm/html/api/bin.html deps/npm/html/api/bugs.html deps/npm/html/api/commands.html deps/npm/html/api/config.html deps/npm/html/api/deprecate.html deps/npm/html/api/docs.html deps/npm/html/api/edit.html deps/npm/html/api/explore.html deps/npm/html/api/help-search.html deps/npm/html/api/init.html deps/npm/html/api/install.html deps/npm/html/api/link.html deps/npm/html/api/load.html deps/npm/html/api/ls.html deps/npm/html/api/npm.html deps/npm/html/api/outdated.html deps/npm/html/api/owner.html deps/npm/html/api/pack.html deps/npm/html/api/prefix.html deps/npm/html/api/prune.html deps/npm/html/api/publish.html deps/npm/html/api/rebuild.html deps/npm/html/api/restart.html deps/npm/html/api/root.html deps/npm/html/api/run-script.html deps/npm/html/api/search.html deps/npm/html/api/shrinkwrap.html deps/npm/html/api/start.html deps/npm/html/api/stop.html deps/npm/html/api/submodule.html deps/npm/html/api/tag.html deps/npm/html/api/test.html deps/npm/html/api/uninstall.html deps/npm/html/api/unpublish.html deps/npm/html/api/update.html deps/npm/html/api/version.html deps/npm/html/api/view.html deps/npm/html/api/whoami.html deps/npm/html/doc/README.html deps/npm/html/doc/adduser.html deps/npm/html/doc/bin.html deps/npm/html/doc/bugs.html deps/npm/html/doc/build.html deps/npm/html/doc/bundle.html deps/npm/html/doc/cache.html deps/npm/html/doc/changelog.html deps/npm/html/doc/coding-style.html deps/npm/html/doc/completion.html deps/npm/html/doc/config.html deps/npm/html/doc/deprecate.html deps/npm/html/doc/developers.html deps/npm/html/doc/disputes.html deps/npm/html/doc/docs.html deps/npm/html/doc/edit.html deps/npm/html/doc/explore.html deps/npm/html/doc/faq.html deps/npm/html/doc/folders.html deps/npm/html/doc/help-search.html deps/npm/html/doc/help.html deps/npm/html/doc/index.html deps/npm/html/doc/init.html deps/npm/html/doc/install.html deps/npm/html/doc/json.html deps/npm/html/doc/link.html deps/npm/html/doc/list.html deps/npm/html/doc/npm.html deps/npm/html/doc/outdated.html deps/npm/html/doc/owner.html deps/npm/html/doc/pack.html deps/npm/html/doc/prefix.html deps/npm/html/doc/prune.html deps/npm/html/doc/publish.html deps/npm/html/doc/rebuild.html deps/npm/html/doc/registry.html deps/npm/html/doc/removing-npm.html deps/npm/html/doc/restart.html deps/npm/html/doc/root.html deps/npm/html/doc/run-script.html deps/npm/html/doc/scripts.html deps/npm/html/doc/search.html deps/npm/html/doc/semver.html deps/npm/html/doc/shrinkwrap.html deps/npm/html/doc/star.html deps/npm/html/doc/start.html deps/npm/html/doc/stop.html deps/npm/html/doc/submodule.html deps/npm/html/doc/tag.html deps/npm/html/doc/test.html deps/npm/html/doc/uninstall.html deps/npm/html/doc/unpublish.html deps/npm/html/doc/update.html deps/npm/html/doc/version.html deps/npm/html/doc/view.html deps/npm/html/doc/whoami.html deps/npm/man/man1/npm.1 deps/npm/man/man3/npm.3 deps/npm/package.json doc/api/url.markdown lib/http.js src/node_version.h test/simple/test-fs-sync-fd-leak.js
Diffstat (limited to 'deps/npm/node_modules/request')
-rw-r--r--deps/npm/node_modules/request/README.md4
-rw-r--r--deps/npm/node_modules/request/forever.js21
-rw-r--r--deps/npm/node_modules/request/main.js947
-rw-r--r--deps/npm/node_modules/request/mimetypes.js10
-rw-r--r--deps/npm/node_modules/request/oauth.js2
-rw-r--r--deps/npm/node_modules/request/package.json58
-rw-r--r--deps/npm/node_modules/request/vendor/cookie/index.js25
7 files changed, 351 insertions, 716 deletions
diff --git a/deps/npm/node_modules/request/README.md b/deps/npm/node_modules/request/README.md
index e5839b50e6..4ea89f794a 100644
--- a/deps/npm/node_modules/request/README.md
+++ b/deps/npm/node_modules/request/README.md
@@ -38,7 +38,7 @@ request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))
You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.
```javascript
-fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))
+fs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json'))
```
Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.
@@ -146,7 +146,6 @@ request.post({url:url, oauth:oauth}, function (e, r, body) {
The first argument can be either a url or an options object. The only required option is uri, all others are optional.
* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()
-* `qs` - object containing querystring values to be appended to the uri
* `method` - http method, defaults to GET
* `headers` - http headers, defaults to {}
* `body` - entity body for POST and PUT requests. Must be buffer or string.
@@ -154,7 +153,6 @@ The first argument can be either a url or an options object. The only required o
* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.
* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.
* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.
-* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.
* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.
* `onResponse` - If true the callback will be fired on the "response" event instead of "end". If a function it will be called on "response" and not effect the regular semantics of the main callback on "end".
* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.
diff --git a/deps/npm/node_modules/request/forever.js b/deps/npm/node_modules/request/forever.js
index ac853c0d28..e6531a21b3 100644
--- a/deps/npm/node_modules/request/forever.js
+++ b/deps/npm/node_modules/request/forever.js
@@ -1,11 +1,8 @@
module.exports = ForeverAgent
-ForeverAgent.SSL = ForeverAgentSSL
var util = require('util')
, Agent = require('http').Agent
, net = require('net')
- , tls = require('tls')
- , AgentSSL = require('https').Agent
function ForeverAgent(options) {
var self = this
@@ -37,14 +34,12 @@ function ForeverAgent(options) {
socket.destroy();
}
})
-
+ self.createConnection = net.createConnection
}
util.inherits(ForeverAgent, Agent)
ForeverAgent.defaultMinSockets = 5
-
-ForeverAgent.prototype.createConnection = net.createConnection
ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest
ForeverAgent.prototype.addRequest = function(req, host, port) {
var name = host + ':' + port
@@ -87,17 +82,3 @@ ForeverAgent.prototype.removeSocket = function(s, name, host, port) {
this.createSocket(name, host, port).emit('free');
}
}
-
-function ForeverAgentSSL (options) {
- ForeverAgent.call(this, options)
-}
-util.inherits(ForeverAgentSSL, ForeverAgent)
-
-ForeverAgentSSL.prototype.createConnection = createConnectionSSL
-ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest
-
-function createConnectionSSL (port, host, options) {
- options.port = port
- options.host = host
- return tls.connect(options)
-}
diff --git a/deps/npm/node_modules/request/main.js b/deps/npm/node_modules/request/main.js
index 5a6bd9eb04..a25393ec3e 100644
--- a/deps/npm/node_modules/request/main.js
+++ b/deps/npm/node_modules/request/main.js
@@ -1,4 +1,4 @@
-// Copyright 2010-2012 Mikeal Rogers
+// Copyright 2010-2011 Mikeal Rogers
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -26,7 +26,6 @@ var http = require('http')
, Cookie = require('./vendor/cookie')
, CookieJar = require('./vendor/cookie/jar')
, cookieJar = new CookieJar
- , tunnel = require('./tunnel')
;
if (process.logging) {
@@ -68,9 +67,7 @@ function isReadStream (rs) {
function copy (obj) {
var o = {}
- Object.keys(obj).forEach(function (i) {
- o[i] = obj[i]
- })
+ for (var i in obj) o[i] = obj[i]
return o
}
@@ -86,31 +83,24 @@ function Request (options) {
if (typeof options === 'string') {
options = {uri:options}
}
-
- var reserved = Object.keys(Request.prototype)
+
for (var i in options) {
- if (reserved.indexOf(i) === -1) {
- this[i] = options[i]
- } else {
- if (typeof options[i] === 'function') {
- delete options[i]
- }
- }
+ this[i] = options[i]
}
- options = copy(options)
-
- this.init(options)
+ if (!this.pool) this.pool = globalPool
+ this.dests = []
+ this.__isRequestRequest = true
}
util.inherits(Request, stream.Stream)
-Request.prototype.init = function (options) {
+Request.prototype.getAgent = function (host, port) {
+ if (!this.pool[host+':'+port]) {
+ this.pool[host+':'+port] = new this.httpModule.Agent({host:host, port:port})
+ }
+ return this.pool[host+':'+port]
+}
+Request.prototype.request = function () {
var self = this
-
- if (!options) options = {}
-
- if (!self.pool) self.pool = globalPool
- self.dests = []
- self.__isRequestRequest = true
-
+
// Protect against double callback
if (!self._callback && self.callback) {
self._callback = self.callback
@@ -134,32 +124,17 @@ Request.prototype.init = function (options) {
}
if (self.proxy) {
if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy)
-
- // do the HTTP CONNECT dance using koichik/node-tunnel
- if (http.globalAgent && self.uri.protocol === "https:") {
- var tunnelFn = self.proxy.protocol === "http:"
- ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
-
- var tunnelOptions = { proxy: { host: self.proxy.hostname
- , port: +self.proxy.port
- , proxyAuth: self.proxy.auth }
- , ca: this.ca }
-
- self.agent = tunnelFn(tunnelOptions)
- self.tunnel = true
- }
}
self._redirectsFollowed = self._redirectsFollowed || 0
self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10
self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true
- self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false;
- if (self.followRedirect || self.followAllRedirects)
+ if (self.followRedirect)
self.redirects = self.redirects || []
self.headers = self.headers ? copy(self.headers) : {}
- self.setHost = false
+ var setHost = false
if (!self.headers.host) {
self.headers.host = self.uri.hostname
if (self.uri.port) {
@@ -167,10 +142,27 @@ Request.prototype.init = function (options) {
!(self.uri.port === 443 && self.uri.protocol === 'https:') )
self.headers.host += (':'+self.uri.port)
}
- self.setHost = true
+ setHost = true
+ }
+
+ if (self.jar === false) {
+ // disable cookies
+ var cookies = false;
+ self._disableCookies = true;
+ } else if (self.jar) {
+ // fetch cookie from the user defined cookie jar
+ var cookies = self.jar.get({ url: self.uri.href })
+ } else {
+ // fetch cookie from the global cookie jar
+ var cookies = cookieJar.get({ url: self.uri.href })
+ }
+ if (cookies) {
+ var cookieString = cookies.map(function (c) {
+ return c.name + "=" + c.value;
+ }).join("; ");
+
+ self.headers.Cookie = cookieString;
}
-
- self.jar(self._jar || options.jar)
if (!self.uri.pathname) {self.uri.pathname = '/'}
if (!self.uri.port) {
@@ -178,7 +170,7 @@ Request.prototype.init = function (options) {
else if (self.uri.protocol == 'https:') {self.uri.port = 443}
}
- if (self.proxy && !self.tunnel) {
+ if (self.proxy) {
self.port = self.proxy.port
self.host = self.proxy.hostname
} else {
@@ -191,43 +183,74 @@ Request.prototype.init = function (options) {
delete self.callback
}
- self.clientErrorHandler = function (error) {
- if (self._aborted) return
-
- if (self.setHost) delete self.headers.host
- if (self.req._reusedSocket && error.code === 'ECONNRESET'
- && self.agent.addRequestNoreuse) {
- self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }
+ var clientErrorHandler = function (error) {
+ if (setHost) delete self.headers.host
+ if (self.req._reusedSocket && error.code === 'ECONNRESET') {
+ self.agent = {addRequest: ForeverAgent.prototype.addRequestNoreuse.bind(self.agent)}
self.start()
self.req.end()
return
}
- if (self.timeout && self.timeoutTimer) {
- clearTimeout(self.timeoutTimer);
- self.timeoutTimer = null;
- }
+ if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer)
self.emit('error', error)
}
if (self.onResponse) self.on('error', function (e) {self.onResponse(e)})
if (self.callback) self.on('error', function (e) {self.callback(e)})
- if (options.form) {
- self.form(options.form)
- }
-
- if (options.oauth) {
- self.oauth(options.oauth)
+ if (self.form) {
+ self.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8'
+ self.body = qs.stringify(self.form).toString('utf8')
+ }
+
+ if (self.oauth) {
+ var form
+ if (self.headers['content-type'] &&
+ self.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) ===
+ 'application/x-www-form-urlencoded'
+ ) {
+ form = qs.parse(self.body)
+ }
+ if (self.uri.query) {
+ form = qs.parse(self.uri.query)
+ }
+ if (!form) form = {}
+ var oa = {}
+ for (var i in form) oa[i] = form[i]
+ for (var i in self.oauth) oa['oauth_'+i] = self.oauth[i]
+ if (!oa.oauth_version) oa.oauth_version = '1.0'
+ if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString()
+ if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '')
+
+ oa.oauth_signature_method = 'HMAC-SHA1'
+
+ var consumer_secret = oa.oauth_consumer_secret
+ delete oa.oauth_consumer_secret
+ var token_secret = oa.oauth_token_secret
+ delete oa.oauth_token_secret
+
+ var baseurl = self.uri.protocol + '//' + self.uri.host + self.uri.pathname
+ var signature = oauth.hmacsign(self.method, baseurl, oa, consumer_secret, token_secret)
+
+ // oa.oauth_signature = signature
+ for (var i in form) {
+ if ( i.slice(0, 'oauth_') in self.oauth) {
+ // skip
+ } else {
+ delete oa['oauth_'+i]
+ }
+ }
+ self.headers.authorization =
+ 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',')
+ self.headers.authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"'
}
if (self.uri.auth && !self.headers.authorization) {
self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':'))
}
- if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization'] && !self.tunnel) {
+ if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization']) {
self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':'))
}
- if (options.qs) self.qs(options.qs)
-
if (self.uri.path) {
self.path = self.uri.path
} else {
@@ -236,12 +259,41 @@ Request.prototype.init = function (options) {
if (self.path.length === 0) self.path = '/'
- if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
+ if (self.proxy) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
+
+ if (self.json) {
+ self.headers['content-type'] = 'application/json'
+ if (typeof self.json === 'boolean') {
+ if (typeof self.body === 'object') self.body = JSON.stringify(self.body)
+ } else {
+ self.body = JSON.stringify(self.json)
+ }
+
+ } else if (self.multipart) {
+ self.body = []
+
+ if (!self.headers['content-type']) {
+ self.headers['content-type'] = 'multipart/related;boundary="frontier"';
+ } else {
+ self.headers['content-type'] = self.headers['content-type'].split(';')[0] + ';boundary="frontier"';
+ }
+
+ if (!self.multipart.forEach) throw new Error('Argument error, options.multipart.')
- if (options.json) {
- self.json(options.json)
- } else if (options.multipart) {
- self.multipart(options.multipart)
+ self.multipart.forEach(function (part) {
+ var body = part.body
+ if(!body) throw Error('Body attribute missing in multipart.')
+ delete part.body
+ var preamble = '--frontier\r\n'
+ Object.keys(part).forEach(function(key){
+ 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.body.push(new Buffer('--frontier--'))
}
if (self.body) {
@@ -265,7 +317,7 @@ Request.prototype.init = function (options) {
}
}
- var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
+ var protocol = self.proxy ? self.proxy.protocol : self.uri.protocol
, defaultModules = {'http:':http, 'https:':https}
, httpModules = self.httpModules || {}
;
@@ -273,34 +325,177 @@ Request.prototype.init = function (options) {
if (!self.httpModule) throw new Error("Invalid protocol")
- if (options.ca) self.ca = options.ca
-
- if (!self.agent) {
- if (options.agentOptions) self.agentOptions = options.agentOptions
-
- if (options.agentClass) {
- self.agentClass = options.agentClass
- } else if (options.forever) {
- self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL
- } else {
- self.agentClass = self.httpModule.Agent
- }
- }
-
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 = self.agent || self.httpModule.globalAgent || self.getAgent(self.host, self.port)
self.agent.maxSockets = self.maxSockets
}
if (self.pool.maxSockets) {
// Don't use our pooling if node has the refactored client
+ self.agent = self.agent || self.httpModule.globalAgent || self.getAgent(self.host, self.port)
self.agent.maxSockets = self.pool.maxSockets
}
}
+ self.start = function () {
+ self._started = true
+ self.method = self.method || 'GET'
+ self.href = self.uri.href
+ if (log) log('%method %href', self)
+ self.req = self.httpModule.request(self, function (response) {
+ self.response = response
+ response.request = self
+
+ if (self.httpModule === https &&
+ self.strictSSL &&
+ !response.client.authorized) {
+ var sslErr = response.client.authorizationError
+ self.emit('error', new Error('SSL Error: '+ sslErr))
+ return
+ }
+
+ if (setHost) delete self.headers.host
+ if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer)
+
+ if (response.headers['set-cookie'] && (!self._disableCookies)) {
+ response.headers['set-cookie'].forEach(function(cookie) {
+ if (self.jar) self.jar.add(new Cookie(cookie))
+ else cookieJar.add(new Cookie(cookie))
+ })
+ }
+
+ if (response.statusCode >= 300 &&
+ response.statusCode < 400 &&
+ self.followRedirect &&
+ self.method !== 'PUT' &&
+ self.method !== 'POST' &&
+ response.headers.location) {
+ if (self._redirectsFollowed >= self.maxRedirects) {
+ self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop."))
+ return
+ }
+ self._redirectsFollowed += 1
+
+ if (!isUrl.test(response.headers.location)) {
+ response.headers.location = url.resolve(self.uri.href, response.headers.location)
+ }
+ self.uri = response.headers.location
+ self.redirects.push(
+ { statusCode : response.statusCode
+ , redirectUri: response.headers.location
+ }
+ )
+ delete self.req
+ delete self.agent
+ delete self._started
+ if (self.headers) {
+ delete self.headers.host
+ }
+ if (log) log('Redirect to %uri', self)
+ request(self, self.callback)
+ return // Ignore the rest of the response
+ } else {
+ self._redirectsFollowed = self._redirectsFollowed || 0
+ // Be a good stream and emit end when the response is finished.
+ // Hack to emit end on close because of a core bug that never fires end
+ response.on('close', function () {
+ if (!self._ended) self.response.emit('end')
+ })
+
+ if (self.encoding) {
+ if (self.dests.length !== 0) {
+ console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.")
+ } else {
+ response.setEncoding(self.encoding)
+ }
+ }
+
+ self.pipeDest = function (dest) {
+ if (dest.headers) {
+ dest.headers['content-type'] = response.headers['content-type']
+ if (response.headers['content-length']) {
+ dest.headers['content-length'] = response.headers['content-length']
+ }
+ }
+ if (dest.setHeader) {
+ for (var i in response.headers) {
+ dest.setHeader(i, response.headers[i])
+ }
+ dest.statusCode = response.statusCode
+ }
+ if (self.pipefilter) self.pipefilter(response, dest)
+ }
+
+ self.dests.forEach(function (dest) {
+ self.pipeDest(dest)
+ })
+
+ response.on("data", function (chunk) {
+ self._destdata = true
+ self.emit("data", chunk)
+ })
+ response.on("end", function (chunk) {
+ self._ended = true
+ self.emit("end", chunk)
+ })
+ response.on("close", function () {self.emit("close")})
+
+ self.emit('response', response)
+
+ if (self.onResponse) {
+ self.onResponse(null, response)
+ }
+ if (self.callback) {
+ var buffer = []
+ var bodyLen = 0
+ self.on("data", function (chunk) {
+ buffer.push(chunk)
+ bodyLen += chunk.length
+ })
+ self.on("end", function () {
+ if (buffer.length && Buffer.isBuffer(buffer[0])) {
+ var body = new Buffer(bodyLen)
+ var i = 0
+ buffer.forEach(function (chunk) {
+ chunk.copy(body, i, 0, chunk.length)
+ i += chunk.length
+ })
+ if (self.encoding === null) {
+ response.body = body
+ } else {
+ response.body = body.toString()
+ }
+ } else if (buffer.length) {
+ response.body = buffer.join('')
+ }
+
+ if (self.json) {
+ try {
+ response.body = JSON.parse(response.body)
+ } catch (e) {}
+ }
+
+ self.callback(null, response, response.body)
+ })
+ }
+ }
+ })
+
+ if (self.timeout && !self.timeoutTimer) {
+ self.timeoutTimer = setTimeout(function() {
+ self.req.abort()
+ var e = new Error("ETIMEDOUT")
+ e.code = "ETIMEDOUT"
+ self.emit("error", e)
+ }, self.timeout)
+ }
+
+ self.req.on('error', clientErrorHandler)
+ }
+
self.once('pipe', function (src) {
if (self.ntick) throw new Error("You cannot pipe to this stream after the first nextTick() after creation of the request stream.")
self.src = src
@@ -326,8 +521,6 @@ Request.prototype.init = function (options) {
})
process.nextTick(function () {
- if (self._aborted) return
-
if (self.body) {
if (Array.isArray(self.body)) {
self.body.forEach(function(part) {
@@ -347,538 +540,47 @@ Request.prototype.init = function (options) {
self.ntick = true
})
}
-
-// Must call this when following a redirect from https to http or vice versa
-// Attempts to keep everything as identical as possible, but update the
-// httpModule, Tunneling agent, and/or Forever Agent in use.
-Request.prototype._updateProtocol = function () {
- var self = this
- var protocol = self.uri.protocol
-
- if (protocol === 'https:') {
- // previously was doing http, now doing https
- // if it's https, then we might need to tunnel now.
- if (self.proxy) {
- self.tunnel = true
- var tunnelFn = self.proxy.protocol === 'http:'
- ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
- var tunnelOptions = { proxy: { host: self.proxy.hostname
- , post: +self.proxy.port
- , proxyAuth: self.proxy.auth }
- , ca: self.ca }
- self.agent = tunnelFn(tunnelOptions)
- return
- }
-
- self.httpModule = https
- switch (self.agentClass) {
- case ForeverAgent:
- self.agentClass = ForeverAgent.SSL
- break
- case http.Agent:
- self.agentClass = https.Agent
- break
- default:
- // nothing we can do. Just hope for the best.
- return
- }
-
- // if there's an agent, we need to get a new one.
- if (self.agent) self.agent = self.getAgent()
-
- } else {
- if (log) log('previously https, now http')
- // previously was doing https, now doing http
- // stop any tunneling.
- if (self.tunnel) self.tunnel = false
- self.httpModule = http
- switch (self.agentClass) {
- case ForeverAgent.SSL:
- self.agentClass = ForeverAgent
- break
- case https.Agent:
- self.agentClass = http.Agent
- break
- default:
- // nothing we can do. just hope for the best
- return
- }
-
- // if there's an agent, then get a new one.
- if (self.agent) {
- self.agent = null
- self.agent = self.getAgent()
- }
- }
-}
-
-Request.prototype.getAgent = function () {
- var Agent = this.agentClass
- var options = {}
- if (this.agentOptions) {
- for (var i in this.agentOptions) {
- options[i] = this.agentOptions[i]
- }
- }
- if (this.ca) options.ca = this.ca
-
- var poolKey = ''
-
- // different types of agents are in different pools
- if (Agent !== this.httpModule.Agent) {
- poolKey += Agent.name
- }
-
- if (!this.httpModule.globalAgent) {
- // node 0.4.x
- options.host = this.host
- options.port = this.port
- if (poolKey) poolKey += ':'
- poolKey += this.host + ':' + this.port
- }
-
- // ca option is only relevant if proxy or destination are https
- var proxy = this.proxy
- if (typeof proxy === 'string') proxy = url.parse(proxy)
- var caRelevant = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:'
- if (options.ca && caRelevant) {
- if (poolKey) poolKey += ':'
- poolKey += options.ca
- }
-
- if (!poolKey && Agent === this.httpModule.Agent && this.httpModule.globalAgent) {
- // not doing anything special. Use the globalAgent
- return this.httpModule.globalAgent
- }
-
- // we're using a stored agent. Make sure it's protocol-specific
- poolKey = this.uri.protocol + poolKey
-
- // already generated an agent for this setting
- if (this.pool[poolKey]) return this.pool[poolKey]
-
- return this.pool[poolKey] = new Agent(options)
-}
-
-Request.prototype.start = function () {
- var self = this
-
- if (self._aborted) return
-
- self._started = true
- self.method = self.method || 'GET'
- self.href = self.uri.href
- if (log) log('%method %href', self)
- self.req = self.httpModule.request(self, function (response) {
- if (self._aborted) return
- if (self._paused) response.pause()
-
- self.response = response
- response.request = self
-
- if (self.httpModule === https &&
- self.strictSSL &&
- !response.client.authorized) {
- var sslErr = response.client.authorizationError
- self.emit('error', new Error('SSL Error: '+ sslErr))
- return
- }
-
- if (self.setHost) delete self.headers.host
- if (self.timeout && self.timeoutTimer) {
- clearTimeout(self.timeoutTimer);
- self.timeoutTimer = null;
- }
-
- if (response.headers['set-cookie'] && (!self._disableCookies)) {
- response.headers['set-cookie'].forEach(function(cookie) {
- if (self._jar) self._jar.add(new Cookie(cookie))
- else cookieJar.add(new Cookie(cookie))
- })
- }
-
- if (response.statusCode >= 300 && response.statusCode < 400 &&
- (self.followAllRedirects ||
- (self.followRedirect && (self.method !== 'PUT' && self.method !== 'POST' && self.method !== 'DELETE'))) &&
- response.headers.location) {
- if (self._redirectsFollowed >= self.maxRedirects) {
- self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop."))
- return
- }
- self._redirectsFollowed += 1
-
- if (!isUrl.test(response.headers.location)) {
- response.headers.location = url.resolve(self.uri.href, response.headers.location)
- }
-
- var uriPrev = self.uri
- self.uri = url.parse(response.headers.location)
-
- // handle the case where we change protocol from https to http or vice versa
- if (self.uri.protocol !== uriPrev.protocol) {
- self._updateProtocol()
- }
-
- self.redirects.push(
- { statusCode : response.statusCode
- , redirectUri: response.headers.location
- }
- )
- self.method = 'GET'; // Force all redirects to use GET
- delete self.req
- delete self.agent
- delete self._started
- delete self.body
- if (self.headers) {
- delete self.headers.host
- }
- if (log) log('Redirect to %uri', self)
- self.init()
- return // Ignore the rest of the response
- } else {
- self._redirectsFollowed = self._redirectsFollowed || 0
- // Be a good stream and emit end when the response is finished.
- // Hack to emit end on close because of a core bug that never fires end
- response.on('close', function () {
- if (!self._ended) self.response.emit('end')
- })
-
- if (self.encoding) {
- if (self.dests.length !== 0) {
- console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.")
- } else {
- response.setEncoding(self.encoding)
- }
- }
-
- self.dests.forEach(function (dest) {
- self.pipeDest(dest)
- })
-
- response.on("data", function (chunk) {
- self._destdata = true
- self.emit("data", chunk)
- })
- response.on("end", function (chunk) {
- self._ended = true
- self.emit("end", chunk)
- })
- response.on("close", function () {self.emit("close")})
-
- self.emit('response', response)
-
- if (self.onResponse) {
- self.onResponse(null, response)
- }
- if (self.callback) {
- var buffer = []
- var bodyLen = 0
- self.on("data", function (chunk) {
- buffer.push(chunk)
- bodyLen += chunk.length
- })
- self.on("end", function () {
- if (self._aborted) return
-
- if (buffer.length && Buffer.isBuffer(buffer[0])) {
- var body = new Buffer(bodyLen)
- var i = 0
- buffer.forEach(function (chunk) {
- chunk.copy(body, i, 0, chunk.length)
- i += chunk.length
- })
- if (self.encoding === null) {
- response.body = body
- } else {
- response.body = body.toString()
- }
- } else if (buffer.length) {
- response.body = buffer.join('')
- }
-
- if (self._json) {
- try {
- response.body = JSON.parse(response.body)
- } catch (e) {}
- }
-
- self.callback(null, response, response.body)
- })
- }
- }
- })
-
- if (self.timeout && !self.timeoutTimer) {
- self.timeoutTimer = setTimeout(function() {
- self.req.abort()
- var e = new Error("ETIMEDOUT")
- e.code = "ETIMEDOUT"
- self.emit("error", e)
- }, self.timeout)
-
- // Set additional timeout on socket - in case if remote
- // server freeze after sending headers
- if (self.req.setTimeout) { // only works on node 0.6+
- self.req.setTimeout(self.timeout, function(){
- if (self.req) {
- self.req.abort()
- var e = new Error("ESOCKETTIMEDOUT")
- e.code = "ESOCKETTIMEDOUT"
- self.emit("error", e)
- }
- })
- }
- }
-
- self.req.on('error', self.clientErrorHandler)
-
- self.emit('request', self.req)
-}
-
-Request.prototype.abort = function() {
- this._aborted = true;
-
- if (this.req) {
- this.req.abort()
- }
- else if (this.response) {
- this.response.abort()
- }
-
- this.emit("abort")
-}
-
-Request.prototype.pipeDest = function (dest) {
- var response = this.response
- // Called after the response is received
- if (dest.headers) {
- dest.headers['content-type'] = response.headers['content-type']
- if (response.headers['content-length']) {
- dest.headers['content-length'] = response.headers['content-length']
- }
- }
- if (dest.setHeader) {
- for (var i in response.headers) {
- dest.setHeader(i, response.headers[i])
- }
- dest.statusCode = response.statusCode
- }
- if (this.pipefilter) this.pipefilter(response, dest)
-}
-
-// Composable API
-Request.prototype.setHeader = function (name, value, clobber) {
- if (clobber === undefined) clobber = true
- if (clobber || !this.headers.hasOwnProperty(name)) this.headers[name] = value
- else this.headers[name] += ',' + value
- return this
-}
-Request.prototype.setHeaders = function (headers) {
- for (i in headers) {this.setHeader(i, headers[i])}
- return this
-}
-Request.prototype.qs = function (q, clobber) {
- var base
- if (!clobber && this.uri.query) base = qs.parse(this.uri.query)
- else base = {}
-
- for (var i in q) {
- base[i] = q[i]
- }
-
- this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base))
- this.url = this.uri
-
- return this
-}
-Request.prototype.form = function (form) {
- this.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8'
- this.body = qs.stringify(form).toString('utf8')
- return this
-}
-Request.prototype.multipart = function (multipart) {
- var self = this
- self.body = []
-
- if (!self.headers['content-type']) {
- self.headers['content-type'] = 'multipart/related;boundary="frontier"';
- } else {
- self.headers['content-type'] = self.headers['content-type'].split(';')[0] + ';boundary="frontier"';
- }
-
- if (!multipart.forEach) throw new Error('Argument error, options.multipart.')
-
- multipart.forEach(function (part) {
- var body = part.body
- if(!body) throw Error('Body attribute missing in multipart.')
- delete part.body
- var preamble = '--frontier\r\n'
- Object.keys(part).forEach(function(key){
- 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.body.push(new Buffer('--frontier--'))
- return self
-}
-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)
- } else {
- this.body = JSON.stringify(val)
- }
- return this
-}
-Request.prototype.oauth = function (_oauth) {
- var form
- if (this.headers['content-type'] &&
- this.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) ===
- 'application/x-www-form-urlencoded'
- ) {
- form = qs.parse(this.body)
- }
- if (this.uri.query) {
- form = qs.parse(this.uri.query)
- }
- if (!form) form = {}
- var oa = {}
- for (var i in form) oa[i] = form[i]
- for (var i in _oauth) oa['oauth_'+i] = _oauth[i]
- if (!oa.oauth_version) oa.oauth_version = '1.0'
- if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString()
- if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '')
-
- oa.oauth_signature_method = 'HMAC-SHA1'
-
- var consumer_secret = oa.oauth_consumer_secret
- delete oa.oauth_consumer_secret
- var token_secret = oa.oauth_token_secret
- delete oa.oauth_token_secret
-
- var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname
- var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret)
-
- // oa.oauth_signature = signature
- for (var i in form) {
- if ( i.slice(0, 'oauth_') in _oauth) {
- // skip
- } else {
- delete oa['oauth_'+i]
- }
- }
- this.headers.authorization =
- 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',')
- this.headers.authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"'
- return this
-}
-Request.prototype.jar = function (jar) {
- var cookies
-
- if (this._redirectsFollowed === 0) {
- this.originalCookieHeader = this.headers.cookie
- }
-
- if (jar === false) {
- // disable cookies
- cookies = false;
- this._disableCookies = true;
- } else if (jar) {
- // fetch cookie from the user defined cookie jar
- cookies = jar.get({ url: this.uri.href })
- } else {
- // fetch cookie from the global cookie jar
- cookies = cookieJar.get({ url: this.uri.href })
- }
-
- if (cookies && cookies.length) {
- var cookieString = cookies.map(function (c) {
- return c.name + "=" + c.value
- }).join("; ")
-
- if (this.originalCookieHeader) {
- // Don't overwrite existing Cookie header
- this.headers.cookie = this.originalCookieHeader + '; ' + cookieString
- } else {
- this.headers.cookie = cookieString
- }
- }
- this._jar = jar
- return this
-}
-
-
-// Stream API
-Request.prototype.pipe = function (dest, opts) {
+Request.prototype.pipe = function (dest) {
if (this.response) {
if (this._destdata) {
throw new Error("You cannot pipe after data has been emitted from the response.")
} else if (this._ended) {
throw new Error("You cannot pipe after the response has been ended.")
} else {
- stream.Stream.prototype.pipe.call(this, dest, opts)
+ stream.Stream.prototype.pipe.call(this, dest)
this.pipeDest(dest)
return dest
}
} else {
this.dests.push(dest)
- stream.Stream.prototype.pipe.call(this, dest, opts)
+ stream.Stream.prototype.pipe.call(this, dest)
return dest
}
}
Request.prototype.write = function () {
if (!this._started) this.start()
+ if (!this.req) throw new Error("This request has been piped before http.request() was called.")
this.req.write.apply(this.req, arguments)
}
-Request.prototype.end = function (chunk) {
- if (chunk) this.write(chunk)
+Request.prototype.end = function () {
if (!this._started) this.start()
- this.req.end()
+ if (!this.req) throw new Error("This request has been piped before http.request() was called.")
+ this.req.end.apply(this.req, arguments)
}
Request.prototype.pause = function () {
- if (!this.response) this._paused = true
- else this.response.pause.apply(this.response, arguments)
+ if (!this.response) throw new Error("This request has been piped before http.request() was called.")
+ this.response.pause.apply(this.response, arguments)
}
Request.prototype.resume = function () {
- if (!this.response) this._paused = false
- else this.response.resume.apply(this.response, arguments)
-}
-Request.prototype.destroy = function () {
- if (!this._ended) this.end()
+ if (!this.response) throw new Error("This request has been piped before http.request() was called.")
+ this.response.resume.apply(this.response, arguments)
}
-// organize params for post, put, head, del
-function initParams(uri, options, callback) {
- if ((typeof options === 'function') && !callback) callback = options;
- if (typeof options === 'object') {
- options.uri = uri;
- } else if (typeof uri === 'string') {
- options = {uri:uri};
- } else {
- options = uri;
- uri = options.uri;
- }
- return { uri: uri, options: options, callback: callback };
-}
-
-function request (uri, options, callback) {
- 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 === 'object') {
- options.uri = uri;
- } else if (typeof uri === 'string') {
- options = {uri:uri};
- } else {
- options = uri;
- }
-
- if (callback) options.callback = callback;
+function request (options, callback) {
+ if (typeof options === 'string') options = {uri:options}
+ if (callback) options.callback = callback
var r = new Request(options)
+ r.request()
return r
}
@@ -886,12 +588,12 @@ module.exports = request
request.defaults = function (options) {
var def = function (method) {
- var d = function (uri, opts, callback) {
- var params = initParams(uri, opts, callback);
+ var d = function (opts, callback) {
+ if (typeof opts === 'string') opts = {uri:opts}
for (var i in options) {
- if (params.options[i] === undefined) params.options[i] = options[i]
+ if (opts[i] === undefined) opts[i] = options[i]
}
- return method(params.uri, params.options, params.callback)
+ return method(opts, callback)
}
return d
}
@@ -908,48 +610,43 @@ request.defaults = function (options) {
request.forever = function (agentOptions, optionsArg) {
var options = {}
- if (optionsArg) {
+ if (agentOptions) {
for (option in optionsArg) {
options[option] = optionsArg[option]
}
}
- if (agentOptions) options.agentOptions = agentOptions
- options.forever = true
+ options.agent = new ForeverAgent(agentOptions)
return request.defaults(options)
}
request.get = request
-request.post = function (uri, options, callback) {
- 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);
- params.options.method = 'PUT'
- return request(params.uri || null, params.options, params.callback)
-}
-request.head = function (uri, options, callback) {
- var params = initParams(uri, options, callback);
- params.options.method = 'HEAD'
- if (params.options.body ||
- params.options.requestBodyStream ||
- (params.options.json && typeof params.options.json !== 'boolean') ||
- params.options.multipart) {
+request.post = function (options, callback) {
+ if (typeof options === 'string') options = {uri:options}
+ options.method = 'POST'
+ return request(options, callback)
+}
+request.put = function (options, callback) {
+ if (typeof options === 'string') options = {uri:options}
+ options.method = 'PUT'
+ return request(options, callback)
+}
+request.head = function (options, callback) {
+ if (typeof options === 'string') options = {uri:options}
+ options.method = 'HEAD'
+ if (options.body || options.requestBodyStream || options.json || options.multipart) {
throw new Error("HTTP HEAD requests MUST NOT include a request body.")
}
- return request(params.uri || null, params.options, params.callback)
+ return request(options, callback)
}
-request.del = function (uri, options, callback) {
- var params = initParams(uri, options, callback);
- params.options.method = 'DELETE'
- return request(params.uri || null, params.options, params.callback)
+request.del = function (options, callback) {
+ if (typeof options === 'string') options = {uri:options}
+ options.method = 'DELETE'
+ return request(options, callback)
}
request.jar = function () {
return new CookieJar
}
request.cookie = function (str) {
- if (str && str.uri) str = str.uri
if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param")
return new Cookie(str)
}
diff --git a/deps/npm/node_modules/request/mimetypes.js b/deps/npm/node_modules/request/mimetypes.js
index 59b21b419c..86910064c9 100644
--- a/deps/npm/node_modules/request/mimetypes.js
+++ b/deps/npm/node_modules/request/mimetypes.js
@@ -1,6 +1,5 @@
// from http://github.com/felixge/node-paperboy
exports.types = {
- "3gp":"video/3gpp",
"aiff":"audio/x-aiff",
"arj":"application/x-arj-compressed",
"asf":"video/x-ms-asf",
@@ -51,21 +50,17 @@ exports.types = {
"lzh":"application/octet-stream",
"m":"text/plain",
"m3u":"audio/x-mpegurl",
- "m4v":"video/mp4",
"man":"application/x-troff-man",
"me":"application/x-troff-me",
"midi":"audio/midi",
"mif":"application/x-mif",
"mime":"www/mime",
- "mkv":" video/x-matrosk",
"movie":"video/x-sgi-movie",
+ "mustache":"text/plain",
"mp4":"video/mp4",
- "mp41":"video/mp4",
- "mp42":"video/mp4",
"mpg":"video/mpeg",
"mpga":"audio/mpeg",
"ms":"application/x-troff-ms",
- "mustache":"text/plain",
"nc":"application/x-netcdf",
"oda":"application/oda",
"ogm":"application/ogg",
@@ -128,7 +123,6 @@ exports.types = {
"vrm":"x-world/x-vrml",
"wav":"audio/x-wav",
"wax":"audio/x-ms-wax",
- "webm":"video/webm",
"wma":"audio/x-ms-wma",
"wmv":"video/x-ms-wmv",
"wmx":"video/x-ms-wmx",
@@ -140,7 +134,7 @@ exports.types = {
"xpm":"image/x-xpixmap",
"xwd":"image/x-xwindowdump",
"xyz":"chemical/x-pdb",
- "zip":"application/zip"
+ "zip":"application/zip",
};
exports.lookup = function(ext, defaultType) {
diff --git a/deps/npm/node_modules/request/oauth.js b/deps/npm/node_modules/request/oauth.js
index 31b9dc65fe..25db669775 100644
--- a/deps/npm/node_modules/request/oauth.js
+++ b/deps/npm/node_modules/request/oauth.js
@@ -19,7 +19,7 @@ function rfc3986 (str) {
function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret, body) {
// adapted from https://dev.twitter.com/docs/auth/oauth
var base =
- (httpMethod || 'GET') + "&" +
+ httpMethod + "&" +
encodeURIComponent( base_uri ) + "&" +
Object.keys(params).sort().map(function (i) {
// big WTF here with the escape + encoding but it's what twitter wants
diff --git a/deps/npm/node_modules/request/package.json b/deps/npm/node_modules/request/package.json
index 0e6ddc5d85..e7b899a8b1 100644
--- a/deps/npm/node_modules/request/package.json
+++ b/deps/npm/node_modules/request/package.json
@@ -1,45 +1,15 @@
-{
- "name": "request",
- "description": "Simplified HTTP request client.",
- "tags": [
- "http",
- "simple",
- "util",
- "utility"
- ],
- "version": "2.9.153",
- "author": {
- "name": "Mikeal Rogers",
- "email": "mikeal.rogers@gmail.com"
- },
- "repository": {
- "type": "git",
- "url": "git://github.com/mikeal/request.git"
- },
- "bugs": {
- "url": "http://github.com/mikeal/request/issues"
- },
- "engines": [
- "node >= 0.3.6"
- ],
- "main": "./main",
- "scripts": {
- "test": "node tests/run.js"
- },
- "_npmUser": {
- "name": "isaacs",
- "email": "i@izs.me"
- },
- "_id": "request@2.9.153",
- "dependencies": {},
- "devDependencies": {},
- "optionalDependencies": {},
- "_engineSupported": true,
- "_npmVersion": "1.1.8",
- "_nodeVersion": "v0.6.12",
- "_defaultsLoaded": true,
- "dist": {
- "shasum": "6f07c2ba3acfbe0cfe941f43647102740f05ff73"
- },
- "_from": "../request"
+{ "name" : "request"
+, "description" : "Simplified HTTP request client."
+, "tags" : ["http", "simple", "util", "utility"]
+, "version" : "2.9.3"
+, "author" : "Mikeal Rogers <mikeal.rogers@gmail.com>"
+, "repository" :
+ { "type" : "git"
+ , "url" : "http://github.com/mikeal/request.git"
+ }
+, "bugs" :
+ { "url" : "http://github.com/mikeal/request/issues" }
+, "engines" : ["node >= 0.3.6"]
+, "main" : "./main"
+, "scripts": { "test": "bash tests/run.sh" }
}
diff --git a/deps/npm/node_modules/request/vendor/cookie/index.js b/deps/npm/node_modules/request/vendor/cookie/index.js
index ff44b3e629..1eb2eaa220 100644
--- a/deps/npm/node_modules/request/vendor/cookie/index.js
+++ b/deps/npm/node_modules/request/vendor/cookie/index.js
@@ -21,27 +21,22 @@ var url = require('url');
var Cookie = exports = module.exports = function Cookie(str, req) {
this.str = str;
+ // First key is the name
+ this.name = str.substr(0, str.indexOf('=')).trim();
+
// Map the key/val pairs
str.split(/ *; */).reduce(function(obj, pair){
var p = pair.indexOf('=');
- var key = p > 0 ? pair.substring(0, p).trim() : pair.trim();
- var lowerCasedKey = key.toLowerCase();
- var value = p > 0 ? pair.substring(p + 1).trim() : true;
-
- if (!obj.name) {
- // First key is the name
- obj.name = key;
- obj.value = value;
- }
- else if (lowerCasedKey === 'httponly') {
- obj.httpOnly = value;
- }
- else {
- obj[lowerCasedKey] = value;
- }
+ if(p > 0)
+ obj[pair.substring(0, p).trim()] = pair.substring(p + 1).trim();
+ else
+ obj[pair.trim()] = true;
return obj;
}, this);
+ // Assign value
+ this.value = this[this.name];
+
// Expires
this.expires = this.expires
? new Date(this.expires)