1 line
145 KiB
JSON
1 line
145 KiB
JSON
{"ast":null,"code":"'use strict';\n\nvar http = require('http');\n\nvar https = require('https');\n\nvar url = require('url');\n\nvar util = require('util');\n\nvar stream = require('stream');\n\nvar zlib = require('zlib');\n\nvar aws2 = require('aws-sign2');\n\nvar aws4 = require('aws4');\n\nvar httpSignature = require('http-signature');\n\nvar mime = require('mime-types');\n\nvar caseless = require('caseless');\n\nvar ForeverAgent = require('forever-agent');\n\nvar FormData = require('form-data');\n\nvar extend = require('extend');\n\nvar isstream = require('isstream');\n\nvar isTypedArray = require('is-typedarray').strict;\n\nvar helpers = require('./lib/helpers');\n\nvar cookies = require('./lib/cookies');\n\nvar getProxyFromURI = require('./lib/getProxyFromURI');\n\nvar Querystring = require('./lib/querystring').Querystring;\n\nvar Har = require('./lib/har').Har;\n\nvar Auth = require('./lib/auth').Auth;\n\nvar OAuth = require('./lib/oauth').OAuth;\n\nvar hawk = require('./lib/hawk');\n\nvar Multipart = require('./lib/multipart').Multipart;\n\nvar Redirect = require('./lib/redirect').Redirect;\n\nvar Tunnel = require('./lib/tunnel').Tunnel;\n\nvar now = require('performance-now');\n\nvar Buffer = require('safe-buffer').Buffer;\n\nvar safeStringify = helpers.safeStringify;\nvar isReadStream = helpers.isReadStream;\nvar toBase64 = helpers.toBase64;\nvar defer = helpers.defer;\nvar copy = helpers.copy;\nvar version = helpers.version;\nvar globalCookieJar = cookies.jar();\nvar globalPool = {};\n\nfunction filterForNonReserved(reserved, options) {\n // Filter out properties that are not reserved.\n // Reserved values are passed in at call site.\n var object = {};\n\n for (var i in options) {\n var notReserved = reserved.indexOf(i) === -1;\n\n if (notReserved) {\n object[i] = options[i];\n }\n }\n\n return object;\n}\n\nfunction filterOutReservedFunctions(reserved, options) {\n // Filter out properties that are functions and are reserved.\n // Reserved values are passed in at call site.\n var object = {};\n\n for (var i in options) {\n var isReserved = !(reserved.indexOf(i) === -1);\n var isFunction = typeof options[i] === 'function';\n\n if (!(isReserved && isFunction)) {\n object[i] = options[i];\n }\n }\n\n return object;\n} // Return a simpler request object to allow serialization\n\n\nfunction requestToJSON() {\n var self = this;\n return {\n uri: self.uri,\n method: self.method,\n headers: self.headers\n };\n} // Return a simpler response object to allow serialization\n\n\nfunction responseToJSON() {\n var self = this;\n return {\n statusCode: self.statusCode,\n body: self.body,\n headers: self.headers,\n request: requestToJSON.call(self.request)\n };\n}\n\nfunction Request(options) {\n // if given the method property in options, set property explicitMethod to true\n // extend the Request instance with any non-reserved properties\n // remove any reserved functions from the options object\n // set Request instance to be readable and writable\n // call init\n var self = this; // start with HAR, then override with additional options\n\n if (options.har) {\n self._har = new Har(self);\n options = self._har.options(options);\n }\n\n stream.Stream.call(self);\n var reserved = Object.keys(Request.prototype);\n var nonReserved = filterForNonReserved(reserved, options);\n extend(self, nonReserved);\n options = filterOutReservedFunctions(reserved, options);\n self.readable = true;\n self.writable = true;\n\n if (options.method) {\n self.explicitMethod = true;\n }\n\n self._qs = new Querystring(self);\n self._auth = new Auth(self);\n self._oauth = new OAuth(self);\n self._multipart = new Multipart(self);\n self._redirect = new Redirect(self);\n self._tunnel = new Tunnel(self);\n self.init(options);\n}\n\nutil.inherits(Request, stream.Stream); // Debugging\n\nRequest.debug = process.env.NODE_DEBUG && /\\brequest\\b/.test(process.env.NODE_DEBUG);\n\nfunction debug() {\n if (Request.debug) {\n console.error('REQUEST %s', util.format.apply(util, arguments));\n }\n}\n\nRequest.prototype.debug = debug;\n\nRequest.prototype.init = function (options) {\n // init() contains all the code to setup the request object.\n // the actual outgoing request is not started until start() is called\n // this function is called from both the constructor and on redirect.\n var self = this;\n\n if (!options) {\n options = {};\n }\n\n self.headers = self.headers ? copy(self.headers) : {}; // Delete headers with value undefined since they break\n // ClientRequest.OutgoingMessage.setHeader in node 0.12\n\n for (var headerName in self.headers) {\n if (typeof self.headers[headerName] === 'undefined') {\n delete self.headers[headerName];\n }\n }\n\n caseless.httpify(self, self.headers);\n\n if (!self.method) {\n self.method = options.method || 'GET';\n }\n\n if (!self.localAddress) {\n self.localAddress = options.localAddress;\n }\n\n self._qs.init(options);\n\n debug(options);\n\n if (!self.pool && self.pool !== false) {\n self.pool = globalPool;\n }\n\n self.dests = self.dests || [];\n self.__isRequestRequest = true; // Protect against double callback\n\n if (!self._callback && self.callback) {\n self._callback = self.callback;\n\n self.callback = function () {\n if (self._callbackCalled) {\n return; // Print a warning maybe?\n }\n\n self._callbackCalled = true;\n\n self._callback.apply(self, arguments);\n };\n\n self.on('error', self.callback.bind());\n self.on('complete', self.callback.bind(self, null));\n } // People use this property instead all the time, so support it\n\n\n if (!self.uri && self.url) {\n self.uri = self.url;\n delete self.url;\n } // If there's a baseUrl, then use it as the base URL (i.e. uri must be\n // specified as a relative path and is appended to baseUrl).\n\n\n if (self.baseUrl) {\n if (typeof self.baseUrl !== 'string') {\n return self.emit('error', new Error('options.baseUrl must be a string'));\n }\n\n if (typeof self.uri !== 'string') {\n return self.emit('error', new Error('options.uri must be a string when using options.baseUrl'));\n }\n\n if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) {\n return self.emit('error', new Error('options.uri must be a path when using options.baseUrl'));\n } // Handle all cases to make sure that there's only one slash between\n // baseUrl and uri.\n\n\n var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1;\n var uriStartsWithSlash = self.uri.indexOf('/') === 0;\n\n if (baseUrlEndsWithSlash && uriStartsWithSlash) {\n self.uri = self.baseUrl + self.uri.slice(1);\n } else if (baseUrlEndsWithSlash || uriStartsWithSlash) {\n self.uri = self.baseUrl + self.uri;\n } else if (self.uri === '') {\n self.uri = self.baseUrl;\n } else {\n self.uri = self.baseUrl + '/' + self.uri;\n }\n\n delete self.baseUrl;\n } // A URI is needed by this point, emit error if we haven't been able to get one\n\n\n if (!self.uri) {\n return self.emit('error', new Error('options.uri is a required argument'));\n } // If a string URI/URL was given, parse it into a URL object\n\n\n if (typeof self.uri === 'string') {\n self.uri = url.parse(self.uri);\n } // Some URL objects are not from a URL parsed string and need href added\n\n\n if (!self.uri.href) {\n self.uri.href = url.format(self.uri);\n } // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme\n\n\n if (self.uri.protocol === 'unix:') {\n return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`'));\n } // Support Unix Sockets\n\n\n if (self.uri.host === 'unix') {\n self.enableUnixSocket();\n }\n\n if (self.strictSSL === false) {\n self.rejectUnauthorized = false;\n }\n\n if (!self.uri.pathname) {\n self.uri.pathname = '/';\n }\n\n if (!(self.uri.host || self.uri.hostname && self.uri.port) && !self.uri.isUnix) {\n // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar\n // Detect and reject it as soon as possible\n var faultyUri = url.format(self.uri);\n var message = 'Invalid URI \"' + faultyUri + '\"';\n\n if (Object.keys(options).length === 0) {\n // No option ? This can be the sign of a redirect\n // As this is a case where the user cannot do anything (they didn't call request directly with this URL)\n // they should be warned that it can be caused by a redirection (can save some hair)\n message += '. This can be caused by a crappy redirection.';\n } // This error was fatal\n\n\n self.abort();\n return self.emit('error', new Error(message));\n }\n\n if (!self.hasOwnProperty('proxy')) {\n self.proxy = getProxyFromURI(self.uri);\n }\n\n self.tunnel = self._tunnel.isEnabled();\n\n if (self.proxy) {\n self._tunnel.setup(options);\n }\n\n self._redirect.onRequest(options);\n\n self.setHost = false;\n\n if (!self.hasHeader('host')) {\n var hostHeaderName = self.originalHostHeaderName || 'host';\n self.setHeader(hostHeaderName, self.uri.host); // Drop :port suffix from Host header if known protocol.\n\n if (self.uri.port) {\n if (self.uri.port === '80' && self.uri.protocol === 'http:' || self.uri.port === '443' && self.uri.protocol === 'https:') {\n self.setHeader(hostHeaderName, self.uri.hostname);\n }\n }\n\n self.setHost = true;\n }\n\n self.jar(self._jar || options.jar);\n\n if (!self.uri.port) {\n if (self.uri.protocol === 'http:') {\n self.uri.port = 80;\n } else if (self.uri.protocol === 'https:') {\n self.uri.port = 443;\n }\n }\n\n if (self.proxy && !self.tunnel) {\n self.port = self.proxy.port;\n self.host = self.proxy.hostname;\n } else {\n self.port = self.uri.port;\n self.host = self.uri.hostname;\n }\n\n if (options.form) {\n self.form(options.form);\n }\n\n if (options.formData) {\n var formData = options.formData;\n var requestForm = self.form();\n\n var appendFormValue = function (key, value) {\n if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) {\n requestForm.append(key, value.value, value.options);\n } else {\n requestForm.append(key, value);\n }\n };\n\n for (var formKey in formData) {\n if (formData.hasOwnProperty(formKey)) {\n var formValue = formData[formKey];\n\n if (formValue instanceof Array) {\n for (var j = 0; j < formValue.length; j++) {\n appendFormValue(formKey, formValue[j]);\n }\n } else {\n appendFormValue(formKey, formValue);\n }\n }\n }\n }\n\n if (options.qs) {\n self.qs(options.qs);\n }\n\n if (self.uri.path) {\n self.path = self.uri.path;\n } else {\n self.path = self.uri.pathname + (self.uri.search || '');\n }\n\n if (self.path.length === 0) {\n self.path = '/';\n } // Auth must happen last in case signing is dependent on other headers\n\n\n if (options.aws) {\n self.aws(options.aws);\n }\n\n if (options.hawk) {\n self.hawk(options.hawk);\n }\n\n if (options.httpSignature) {\n self.httpSignature(options.httpSignature);\n }\n\n if (options.auth) {\n if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) {\n options.auth.user = options.auth.username;\n }\n\n if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) {\n options.auth.pass = options.auth.password;\n }\n\n self.auth(options.auth.user, options.auth.pass, options.auth.sendImmediately, options.auth.bearer);\n }\n\n if (self.gzip && !self.hasHeader('accept-encoding')) {\n self.setHeader('accept-encoding', 'gzip, deflate');\n }\n\n if (self.uri.auth && !self.hasHeader('authorization')) {\n var uriAuthPieces = self.uri.auth.split(':').map(function (item) {\n return self._qs.unescape(item);\n });\n self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true);\n }\n\n if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) {\n var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) {\n return self._qs.unescape(item);\n });\n var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':'));\n self.setHeader('proxy-authorization', authHeader);\n }\n\n if (self.proxy && !self.tunnel) {\n self.path = self.uri.protocol + '//' + self.uri.host + self.path;\n }\n\n if (options.json) {\n self.json(options.json);\n }\n\n if (options.multipart) {\n self.multipart(options.multipart);\n }\n\n if (options.time) {\n self.timing = true; // NOTE: elapsedTime is deprecated in favor of .timings\n\n self.elapsedTime = self.elapsedTime || 0;\n }\n\n function setContentLength() {\n if (isTypedArray(self.body)) {\n self.body = Buffer.from(self.body);\n }\n\n if (!self.hasHeader('content-length')) {\n var length;\n\n if (typeof self.body === 'string') {\n length = Buffer.byteLength(self.body);\n } else if (Array.isArray(self.body)) {\n length = self.body.reduce(function (a, b) {\n return a + b.length;\n }, 0);\n } else {\n length = self.body.length;\n }\n\n if (length) {\n self.setHeader('content-length', length);\n } else {\n self.emit('error', new Error('Argument error, options.body.'));\n }\n }\n }\n\n if (self.body && !isstream(self.body)) {\n setContentLength();\n }\n\n if (options.oauth) {\n self.oauth(options.oauth);\n } else if (self._oauth.params && self.hasHeader('authorization')) {\n self.oauth(self._oauth.params);\n }\n\n var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol;\n var defaultModules = {\n 'http:': http,\n 'https:': https\n };\n var httpModules = self.httpModules || {};\n self.httpModule = httpModules[protocol] || defaultModules[protocol];\n\n if (!self.httpModule) {\n return self.emit('error', new Error('Invalid protocol: ' + protocol));\n }\n\n if (options.ca) {\n self.ca = options.ca;\n }\n\n if (!self.agent) {\n if (options.agentOptions) {\n self.agentOptions = options.agentOptions;\n }\n\n if (options.agentClass) {\n self.agentClass = options.agentClass;\n } else if (options.forever) {\n var v = version(); // use ForeverAgent in node 0.10- only\n\n if (v.major === 0 && v.minor <= 10) {\n self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL;\n } else {\n self.agentClass = self.httpModule.Agent;\n self.agentOptions = self.agentOptions || {};\n self.agentOptions.keepAlive = true;\n }\n } else {\n self.agentClass = self.httpModule.Agent;\n }\n }\n\n if (self.pool === false) {\n self.agent = false;\n } else {\n self.agent = self.agent || self.getNewAgent();\n }\n\n self.on('pipe', function (src) {\n if (self.ntick && self._started) {\n self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.'));\n }\n\n self.src = src;\n\n if (isReadStream(src)) {\n if (!self.hasHeader('content-type')) {\n self.setHeader('content-type', mime.lookup(src.path));\n }\n } else {\n if (src.headers) {\n for (var i in src.headers) {\n if (!self.hasHeader(i)) {\n self.setHeader(i, src.headers[i]);\n }\n }\n }\n\n if (self._json && !self.hasHeader('content-type')) {\n self.setHeader('content-type', 'application/json');\n }\n\n if (src.method && !self.explicitMethod) {\n self.method = src.method;\n }\n } // self.on('pipe', function () {\n // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.')\n // })\n\n });\n defer(function () {\n if (self._aborted) {\n return;\n }\n\n var end = function () {\n if (self._form) {\n if (!self._auth.hasAuth) {\n self._form.pipe(self);\n } else if (self._auth.hasAuth && self._auth.sentAuth) {\n self._form.pipe(self);\n }\n }\n\n if (self._multipart && self._multipart.chunked) {\n self._multipart.body.pipe(self);\n }\n\n if (self.body) {\n if (isstream(self.body)) {\n self.body.pipe(self);\n } else {\n setContentLength();\n\n if (Array.isArray(self.body)) {\n self.body.forEach(function (part) {\n self.write(part);\n });\n } else {\n self.write(self.body);\n }\n\n self.end();\n }\n } else if (self.requestBodyStream) {\n console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.');\n self.requestBodyStream.pipe(self);\n } else if (!self.src) {\n if (self._auth.hasAuth && !self._auth.sentAuth) {\n self.end();\n return;\n }\n\n if (self.method !== 'GET' && typeof self.method !== 'undefined') {\n self.setHeader('content-length', 0);\n }\n\n self.end();\n }\n };\n\n if (self._form && !self.hasHeader('content-length')) {\n // Before ending the request, we had to compute the length of the whole form, asyncly\n self.setHeader(self._form.getHeaders(), true);\n\n self._form.getLength(function (err, length) {\n if (!err && !isNaN(length)) {\n self.setHeader('content-length', length);\n }\n\n end();\n });\n } else {\n end();\n }\n\n self.ntick = true;\n });\n};\n\nRequest.prototype.getNewAgent = function () {\n var self = this;\n var Agent = self.agentClass;\n var options = {};\n\n if (self.agentOptions) {\n for (var i in self.agentOptions) {\n options[i] = self.agentOptions[i];\n }\n }\n\n if (self.ca) {\n options.ca = self.ca;\n }\n\n if (self.ciphers) {\n options.ciphers = self.ciphers;\n }\n\n if (self.secureProtocol) {\n options.secureProtocol = self.secureProtocol;\n }\n\n if (self.secureOptions) {\n options.secureOptions = self.secureOptions;\n }\n\n if (typeof self.rejectUnauthorized !== 'undefined') {\n options.rejectUnauthorized = self.rejectUnauthorized;\n }\n\n if (self.cert && self.key) {\n options.key = self.key;\n options.cert = self.cert;\n }\n\n if (self.pfx) {\n options.pfx = self.pfx;\n }\n\n if (self.passphrase) {\n options.passphrase = self.passphrase;\n }\n\n var poolKey = ''; // different types of agents are in different pools\n\n if (Agent !== self.httpModule.Agent) {\n poolKey += Agent.name;\n } // ca option is only relevant if proxy or destination are https\n\n\n var proxy = self.proxy;\n\n if (typeof proxy === 'string') {\n proxy = url.parse(proxy);\n }\n\n var isHttps = proxy && proxy.protocol === 'https:' || this.uri.protocol === 'https:';\n\n if (isHttps) {\n if (options.ca) {\n if (poolKey) {\n poolKey += ':';\n }\n\n poolKey += options.ca;\n }\n\n if (typeof options.rejectUnauthorized !== 'undefined') {\n if (poolKey) {\n poolKey += ':';\n }\n\n poolKey += options.rejectUnauthorized;\n }\n\n if (options.cert) {\n if (poolKey) {\n poolKey += ':';\n }\n\n poolKey += options.cert.toString('ascii') + options.key.toString('ascii');\n }\n\n if (options.pfx) {\n if (poolKey) {\n poolKey += ':';\n }\n\n poolKey += options.pfx.toString('ascii');\n }\n\n if (options.ciphers) {\n if (poolKey) {\n poolKey += ':';\n }\n\n poolKey += options.ciphers;\n }\n\n if (options.secureProtocol) {\n if (poolKey) {\n poolKey += ':';\n }\n\n poolKey += options.secureProtocol;\n }\n\n if (options.secureOptions) {\n if (poolKey) {\n poolKey += ':';\n }\n\n poolKey += options.secureOptions;\n }\n }\n\n if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) {\n // not doing anything special. Use the globalAgent\n return self.httpModule.globalAgent;\n } // we're using a stored agent. Make sure it's protocol-specific\n\n\n poolKey = self.uri.protocol + poolKey; // generate a new agent for this setting if none yet exists\n\n if (!self.pool[poolKey]) {\n self.pool[poolKey] = new Agent(options); // properly set maxSockets on new agents\n\n if (self.pool.maxSockets) {\n self.pool[poolKey].maxSockets = self.pool.maxSockets;\n }\n }\n\n return self.pool[poolKey];\n};\n\nRequest.prototype.start = function () {\n // start() is called once we are ready to send the outgoing HTTP request.\n // this is usually called on the first write(), end() or on nextTick()\n var self = this;\n\n if (self.timing) {\n // All timings will be relative to this request's startTime. In order to do this,\n // we need to capture the wall-clock start time (via Date), immediately followed\n // by the high-resolution timer (via now()). While these two won't be set\n // at the _exact_ same time, they should be close enough to be able to calculate\n // high-resolution, monotonically non-decreasing timestamps relative to startTime.\n var startTime = new Date().getTime();\n var startTimeNow = now();\n }\n\n if (self._aborted) {\n return;\n }\n\n self._started = true;\n self.method = self.method || 'GET';\n self.href = self.uri.href;\n\n if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) {\n self.setHeader('content-length', self.src.stat.size);\n }\n\n if (self._aws) {\n self.aws(self._aws, true);\n } // We have a method named auth, which is completely different from the http.request\n // auth option. If we don't remove it, we're gonna have a bad time.\n\n\n var reqOptions = copy(self);\n delete reqOptions.auth;\n debug('make request', self.uri.href); // node v6.8.0 now supports a `timeout` value in `http.request()`, but we\n // should delete it for now since we handle timeouts manually for better\n // consistency with node versions before v6.8.0\n\n delete reqOptions.timeout;\n\n try {\n self.req = self.httpModule.request(reqOptions);\n } catch (err) {\n self.emit('error', err);\n return;\n }\n\n if (self.timing) {\n self.startTime = startTime;\n self.startTimeNow = startTimeNow; // Timing values will all be relative to startTime (by comparing to startTimeNow\n // so we have an accurate clock)\n\n self.timings = {};\n }\n\n var timeout;\n\n if (self.timeout && !self.timeoutTimer) {\n if (self.timeout < 0) {\n timeout = 0;\n } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) {\n timeout = self.timeout;\n }\n }\n\n self.req.on('response', self.onRequestResponse.bind(self));\n self.req.on('error', self.onRequestError.bind(self));\n self.req.on('drain', function () {\n self.emit('drain');\n });\n self.req.on('socket', function (socket) {\n // `._connecting` was the old property which was made public in node v6.1.0\n var isConnecting = socket._connecting || socket.connecting;\n\n if (self.timing) {\n self.timings.socket = now() - self.startTimeNow;\n\n if (isConnecting) {\n var onLookupTiming = function () {\n self.timings.lookup = now() - self.startTimeNow;\n };\n\n var onConnectTiming = function () {\n self.timings.connect = now() - self.startTimeNow;\n };\n\n socket.once('lookup', onLookupTiming);\n socket.once('connect', onConnectTiming); // clean up timing event listeners if needed on error\n\n self.req.once('error', function () {\n socket.removeListener('lookup', onLookupTiming);\n socket.removeListener('connect', onConnectTiming);\n });\n }\n }\n\n var setReqTimeout = function () {\n // This timeout sets the amount of time to wait *between* bytes sent\n // from the server once connected.\n //\n // In particular, it's useful for erroring if the server fails to send\n // data halfway through streaming a response.\n self.req.setTimeout(timeout, function () {\n if (self.req) {\n self.abort();\n var e = new Error('ESOCKETTIMEDOUT');\n e.code = 'ESOCKETTIMEDOUT';\n e.connect = false;\n self.emit('error', e);\n }\n });\n };\n\n if (timeout !== undefined) {\n // Only start the connection timer if we're actually connecting a new\n // socket, otherwise if we're already connected (because this is a\n // keep-alive connection) do not bother. This is important since we won't\n // get a 'connect' event for an already connected socket.\n if (isConnecting) {\n var onReqSockConnect = function () {\n socket.removeListener('connect', onReqSockConnect);\n self.clearTimeout();\n setReqTimeout();\n };\n\n socket.on('connect', onReqSockConnect);\n self.req.on('error', function (err) {\n // eslint-disable-line handle-callback-err\n socket.removeListener('connect', onReqSockConnect);\n }); // Set a timeout in memory - this block will throw if the server takes more\n // than `timeout` to write the HTTP status and headers (corresponding to\n // the on('response') event on the client). NB: this measures wall-clock\n // time, not the time between bytes sent by the server.\n\n self.timeoutTimer = setTimeout(function () {\n socket.removeListener('connect', onReqSockConnect);\n self.abort();\n var e = new Error('ETIMEDOUT');\n e.code = 'ETIMEDOUT';\n e.connect = true;\n self.emit('error', e);\n }, timeout);\n } else {\n // We're already connected\n setReqTimeout();\n }\n }\n\n self.emit('socket', socket);\n });\n self.emit('request', self.req);\n};\n\nRequest.prototype.onRequestError = function (error) {\n var self = this;\n\n if (self._aborted) {\n return;\n }\n\n if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' && self.agent.addRequestNoreuse) {\n self.agent = {\n addRequest: self.agent.addRequestNoreuse.bind(self.agent)\n };\n self.start();\n self.req.end();\n return;\n }\n\n self.clearTimeout();\n self.emit('error', error);\n};\n\nRequest.prototype.onRequestResponse = function (response) {\n var self = this;\n\n if (self.timing) {\n self.timings.response = now() - self.startTimeNow;\n }\n\n debug('onRequestResponse', self.uri.href, response.statusCode, response.headers);\n response.on('end', function () {\n if (self.timing) {\n self.timings.end = now() - self.startTimeNow;\n response.timingStart = self.startTime; // fill in the blanks for any periods that didn't trigger, such as\n // no lookup or connect due to keep alive\n\n if (!self.timings.socket) {\n self.timings.socket = 0;\n }\n\n if (!self.timings.lookup) {\n self.timings.lookup = self.timings.socket;\n }\n\n if (!self.timings.connect) {\n self.timings.connect = self.timings.lookup;\n }\n\n if (!self.timings.response) {\n self.timings.response = self.timings.connect;\n }\n\n debug('elapsed time', self.timings.end); // elapsedTime includes all redirects\n\n self.elapsedTime += Math.round(self.timings.end); // NOTE: elapsedTime is deprecated in favor of .timings\n\n response.elapsedTime = self.elapsedTime; // timings is just for the final fetch\n\n response.timings = self.timings; // pre-calculate phase timings as well\n\n response.timingPhases = {\n wait: self.timings.socket,\n dns: self.timings.lookup - self.timings.socket,\n tcp: self.timings.connect - self.timings.lookup,\n firstByte: self.timings.response - self.timings.connect,\n download: self.timings.end - self.timings.response,\n total: self.timings.end\n };\n }\n\n debug('response end', self.uri.href, response.statusCode, response.headers);\n });\n\n if (self._aborted) {\n debug('aborted', self.uri.href);\n response.resume();\n return;\n }\n\n self.response = response;\n response.request = self;\n response.toJSON = responseToJSON; // XXX This is different on 0.10, because SSL is strict by default\n\n if (self.httpModule === https && self.strictSSL && (!response.hasOwnProperty('socket') || !response.socket.authorized)) {\n debug('strict ssl error', self.uri.href);\n var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL';\n self.emit('error', new Error('SSL Error: ' + sslErr));\n return;\n } // Save the original host before any redirect (if it changes, we need to\n // remove any authorization headers). Also remember the case of the header\n // name because lots of broken servers expect Host instead of host and we\n // want the caller to be able to specify this.\n\n\n self.originalHost = self.getHeader('host');\n\n if (!self.originalHostHeaderName) {\n self.originalHostHeaderName = self.hasHeader('host');\n }\n\n if (self.setHost) {\n self.removeHeader('host');\n }\n\n self.clearTimeout();\n var targetCookieJar = self._jar && self._jar.setCookie ? self._jar : globalCookieJar;\n\n var addCookie = function (cookie) {\n // set the cookie if it's domain in the href's domain.\n try {\n targetCookieJar.setCookie(cookie, self.uri.href, {\n ignoreError: true\n });\n } catch (e) {\n self.emit('error', e);\n }\n };\n\n response.caseless = caseless(response.headers);\n\n if (response.caseless.has('set-cookie') && !self._disableCookies) {\n var headerName = response.caseless.has('set-cookie');\n\n if (Array.isArray(response.headers[headerName])) {\n response.headers[headerName].forEach(addCookie);\n } else {\n addCookie(response.headers[headerName]);\n }\n }\n\n if (self._redirect.onResponse(response)) {\n return; // Ignore the rest of the response\n } else {\n // Be a good stream and emit end when the response is finished.\n // Hack to emit end on close because of a core bug that never fires end\n response.on('close', function () {\n if (!self._ended) {\n self.response.emit('end');\n }\n });\n response.once('end', function () {\n self._ended = true;\n });\n\n var noBody = function (code) {\n return self.method === 'HEAD' || code >= 100 && code < 200 || // No Content\n code === 204 || // Not Modified\n code === 304;\n };\n\n var responseContent;\n\n if (self.gzip && !noBody(response.statusCode)) {\n var contentEncoding = response.headers['content-encoding'] || 'identity';\n contentEncoding = contentEncoding.trim().toLowerCase(); // Be more lenient with decoding compressed responses, since (very rarely)\n // servers send slightly invalid gzip responses that are still accepted\n // by common browsers.\n // Always using Z_SYNC_FLUSH is what cURL does.\n\n var zlibOptions = {\n flush: zlib.Z_SYNC_FLUSH,\n finishFlush: zlib.Z_SYNC_FLUSH\n };\n\n if (contentEncoding === 'gzip') {\n responseContent = zlib.createGunzip(zlibOptions);\n response.pipe(responseContent);\n } else if (contentEncoding === 'deflate') {\n responseContent = zlib.createInflate(zlibOptions);\n response.pipe(responseContent);\n } else {\n // Since previous versions didn't check for Content-Encoding header,\n // ignore any invalid values to preserve backwards-compatibility\n if (contentEncoding !== 'identity') {\n debug('ignoring unrecognized Content-Encoding ' + contentEncoding);\n }\n\n responseContent = response;\n }\n } else {\n responseContent = response;\n }\n\n if (self.encoding) {\n if (self.dests.length !== 0) {\n console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.');\n } else {\n responseContent.setEncoding(self.encoding);\n }\n }\n\n if (self._paused) {\n responseContent.pause();\n }\n\n self.responseContent = responseContent;\n self.emit('response', response);\n self.dests.forEach(function (dest) {\n self.pipeDest(dest);\n });\n responseContent.on('data', function (chunk) {\n if (self.timing && !self.responseStarted) {\n self.responseStartTime = new Date().getTime(); // NOTE: responseStartTime is deprecated in favor of .timings\n\n response.responseStartTime = self.responseStartTime;\n }\n\n self._destdata = true;\n self.emit('data', chunk);\n });\n responseContent.once('end', function (chunk) {\n self.emit('end', chunk);\n });\n responseContent.on('error', function (error) {\n self.emit('error', error);\n });\n responseContent.on('close', function () {\n self.emit('close');\n });\n\n if (self.callback) {\n self.readResponseBody(response);\n } else {\n // if no callback\n self.on('end', function () {\n if (self._aborted) {\n debug('aborted', self.uri.href);\n return;\n }\n\n self.emit('complete', response);\n });\n }\n }\n\n debug('finish init function', self.uri.href);\n};\n\nRequest.prototype.readResponseBody = function (response) {\n var self = this;\n debug(\"reading response's body\");\n var buffers = [];\n var bufferLength = 0;\n var strings = [];\n self.on('data', function (chunk) {\n if (!Buffer.isBuffer(chunk)) {\n strings.push(chunk);\n } else if (chunk.length) {\n bufferLength += chunk.length;\n buffers.push(chunk);\n }\n });\n self.on('end', function () {\n debug('end event', self.uri.href);\n\n if (self._aborted) {\n debug('aborted', self.uri.href); // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request.\n // This can lead to leaky behavior if the user retains a reference to the request object.\n\n buffers = [];\n bufferLength = 0;\n return;\n }\n\n if (bufferLength) {\n debug('has body', self.uri.href, bufferLength);\n response.body = Buffer.concat(buffers, bufferLength);\n\n if (self.encoding !== null) {\n response.body = response.body.toString(self.encoding);\n } // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request.\n // This can lead to leaky behavior if the user retains a reference to the request object.\n\n\n buffers = [];\n bufferLength = 0;\n } else if (strings.length) {\n // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.\n // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().\n if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\\uFEFF') {\n strings[0] = strings[0].substring(1);\n }\n\n response.body = strings.join('');\n }\n\n if (self._json) {\n try {\n response.body = JSON.parse(response.body, self._jsonReviver);\n } catch (e) {\n debug('invalid JSON received', self.uri.href);\n }\n }\n\n debug('emitting complete', self.uri.href);\n\n if (typeof response.body === 'undefined' && !self._json) {\n response.body = self.encoding === null ? Buffer.alloc(0) : '';\n }\n\n self.emit('complete', response, response.body);\n });\n};\n\nRequest.prototype.abort = function () {\n var self = this;\n self._aborted = true;\n\n if (self.req) {\n self.req.abort();\n } else if (self.response) {\n self.response.destroy();\n }\n\n self.clearTimeout();\n self.emit('abort');\n};\n\nRequest.prototype.pipeDest = function (dest) {\n var self = this;\n var response = self.response; // Called after the response is received\n\n if (dest.headers && !dest.headersSent) {\n if (response.caseless.has('content-type')) {\n var ctname = response.caseless.has('content-type');\n\n if (dest.setHeader) {\n dest.setHeader(ctname, response.headers[ctname]);\n } else {\n dest.headers[ctname] = response.headers[ctname];\n }\n }\n\n if (response.caseless.has('content-length')) {\n var clname = response.caseless.has('content-length');\n\n if (dest.setHeader) {\n dest.setHeader(clname, response.headers[clname]);\n } else {\n dest.headers[clname] = response.headers[clname];\n }\n }\n }\n\n if (dest.setHeader && !dest.headersSent) {\n for (var i in response.headers) {\n // If the response content is being decoded, the Content-Encoding header\n // of the response doesn't represent the piped content, so don't pass it.\n if (!self.gzip || i !== 'content-encoding') {\n dest.setHeader(i, response.headers[i]);\n }\n }\n\n dest.statusCode = response.statusCode;\n }\n\n if (self.pipefilter) {\n self.pipefilter(response, dest);\n }\n};\n\nRequest.prototype.qs = function (q, clobber) {\n var self = this;\n var base;\n\n if (!clobber && self.uri.query) {\n base = self._qs.parse(self.uri.query);\n } else {\n base = {};\n }\n\n for (var i in q) {\n base[i] = q[i];\n }\n\n var qs = self._qs.stringify(base);\n\n if (qs === '') {\n return self;\n }\n\n self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs);\n self.url = self.uri;\n self.path = self.uri.path;\n\n if (self.uri.host === 'unix') {\n self.enableUnixSocket();\n }\n\n return self;\n};\n\nRequest.prototype.form = function (form) {\n var self = this;\n\n if (form) {\n if (!/^application\\/x-www-form-urlencoded\\b/.test(self.getHeader('content-type'))) {\n self.setHeader('content-type', 'application/x-www-form-urlencoded');\n }\n\n self.body = typeof form === 'string' ? self._qs.rfc3986(form.toString('utf8')) : self._qs.stringify(form).toString('utf8');\n return self;\n } // create form-data object\n\n\n self._form = new FormData();\n\n self._form.on('error', function (err) {\n err.message = 'form-data: ' + err.message;\n self.emit('error', err);\n self.abort();\n });\n\n return self._form;\n};\n\nRequest.prototype.multipart = function (multipart) {\n var self = this;\n\n self._multipart.onRequest(multipart);\n\n if (!self._multipart.chunked) {\n self.body = self._multipart.body;\n }\n\n return self;\n};\n\nRequest.prototype.json = function (val) {\n var self = this;\n\n if (!self.hasHeader('accept')) {\n self.setHeader('accept', 'application/json');\n }\n\n if (typeof self.jsonReplacer === 'function') {\n self._jsonReplacer = self.jsonReplacer;\n }\n\n self._json = true;\n\n if (typeof val === 'boolean') {\n if (self.body !== undefined) {\n if (!/^application\\/x-www-form-urlencoded\\b/.test(self.getHeader('content-type'))) {\n self.body = safeStringify(self.body, self._jsonReplacer);\n } else {\n self.body = self._qs.rfc3986(self.body);\n }\n\n if (!self.hasHeader('content-type')) {\n self.setHeader('content-type', 'application/json');\n }\n }\n } else {\n self.body = safeStringify(val, self._jsonReplacer);\n\n if (!self.hasHeader('content-type')) {\n self.setHeader('content-type', 'application/json');\n }\n }\n\n if (typeof self.jsonReviver === 'function') {\n self._jsonReviver = self.jsonReviver;\n }\n\n return self;\n};\n\nRequest.prototype.getHeader = function (name, headers) {\n var self = this;\n var result, re, match;\n\n if (!headers) {\n headers = self.headers;\n }\n\n Object.keys(headers).forEach(function (key) {\n if (key.length !== name.length) {\n return;\n }\n\n re = new RegExp(name, 'i');\n match = key.match(re);\n\n if (match) {\n result = headers[key];\n }\n });\n return result;\n};\n\nRequest.prototype.enableUnixSocket = function () {\n // Get the socket & request paths from the URL\n var unixParts = this.uri.path.split(':');\n var host = unixParts[0];\n var path = unixParts[1]; // Apply unix properties to request\n\n this.socketPath = host;\n this.uri.pathname = path;\n this.uri.path = path;\n this.uri.host = host;\n this.uri.hostname = host;\n this.uri.isUnix = true;\n};\n\nRequest.prototype.auth = function (user, pass, sendImmediately, bearer) {\n var self = this;\n\n self._auth.onRequest(user, pass, sendImmediately, bearer);\n\n return self;\n};\n\nRequest.prototype.aws = function (opts, now) {\n var self = this;\n\n if (!now) {\n self._aws = opts;\n return self;\n }\n\n if (opts.sign_version === 4 || opts.sign_version === '4') {\n // use aws4\n var options = {\n host: self.uri.host,\n path: self.uri.path,\n method: self.method,\n headers: self.headers,\n body: self.body\n };\n\n if (opts.service) {\n options.service = opts.service;\n }\n\n var signRes = aws4.sign(options, {\n accessKeyId: opts.key,\n secretAccessKey: opts.secret,\n sessionToken: opts.session\n });\n self.setHeader('authorization', signRes.headers.Authorization);\n self.setHeader('x-amz-date', signRes.headers['X-Amz-Date']);\n\n if (signRes.headers['X-Amz-Security-Token']) {\n self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token']);\n }\n } else {\n // default: use aws-sign2\n var date = new Date();\n self.setHeader('date', date.toUTCString());\n var auth = {\n key: opts.key,\n secret: opts.secret,\n verb: self.method.toUpperCase(),\n date: date,\n contentType: self.getHeader('content-type') || '',\n md5: self.getHeader('content-md5') || '',\n amazonHeaders: aws2.canonicalizeHeaders(self.headers)\n };\n var path = self.uri.path;\n\n if (opts.bucket && path) {\n auth.resource = '/' + opts.bucket + path;\n } else if (opts.bucket && !path) {\n auth.resource = '/' + opts.bucket;\n } else if (!opts.bucket && path) {\n auth.resource = path;\n } else if (!opts.bucket && !path) {\n auth.resource = '/';\n }\n\n auth.resource = aws2.canonicalizeResource(auth.resource);\n self.setHeader('authorization', aws2.authorization(auth));\n }\n\n return self;\n};\n\nRequest.prototype.httpSignature = function (opts) {\n var self = this;\n httpSignature.signRequest({\n getHeader: function (header) {\n return self.getHeader(header, self.headers);\n },\n setHeader: function (header, value) {\n self.setHeader(header, value);\n },\n method: self.method,\n path: self.path\n }, opts);\n debug('httpSignature authorization', self.getHeader('authorization'));\n return self;\n};\n\nRequest.prototype.hawk = function (opts) {\n var self = this;\n self.setHeader('Authorization', hawk.header(self.uri, self.method, opts));\n};\n\nRequest.prototype.oauth = function (_oauth) {\n var self = this;\n\n self._oauth.onRequest(_oauth);\n\n return self;\n};\n\nRequest.prototype.jar = function (jar) {\n var self = this;\n var cookies;\n\n if (self._redirect.redirectsFollowed === 0) {\n self.originalCookieHeader = self.getHeader('cookie');\n }\n\n if (!jar) {\n // disable cookies\n cookies = false;\n self._disableCookies = true;\n } else {\n var targetCookieJar = jar.getCookieString ? jar : globalCookieJar;\n var urihref = self.uri.href; // fetch cookie in the Specified host\n\n if (targetCookieJar) {\n cookies = targetCookieJar.getCookieString(urihref);\n }\n } // if need cookie and cookie is not empty\n\n\n if (cookies && cookies.length) {\n if (self.originalCookieHeader) {\n // Don't overwrite existing Cookie header\n self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies);\n } else {\n self.setHeader('cookie', cookies);\n }\n }\n\n self._jar = jar;\n return self;\n}; // Stream API\n\n\nRequest.prototype.pipe = function (dest, opts) {\n var self = this;\n\n if (self.response) {\n if (self._destdata) {\n self.emit('error', new Error('You cannot pipe after data has been emitted from the response.'));\n } else if (self._ended) {\n self.emit('error', new Error('You cannot pipe after the response has been ended.'));\n } else {\n stream.Stream.prototype.pipe.call(self, dest, opts);\n self.pipeDest(dest);\n return dest;\n }\n } else {\n self.dests.push(dest);\n stream.Stream.prototype.pipe.call(self, dest, opts);\n return dest;\n }\n};\n\nRequest.prototype.write = function () {\n var self = this;\n\n if (self._aborted) {\n return;\n }\n\n if (!self._started) {\n self.start();\n }\n\n if (self.req) {\n return self.req.write.apply(self.req, arguments);\n }\n};\n\nRequest.prototype.end = function (chunk) {\n var self = this;\n\n if (self._aborted) {\n return;\n }\n\n if (chunk) {\n self.write(chunk);\n }\n\n if (!self._started) {\n self.start();\n }\n\n if (self.req) {\n self.req.end();\n }\n};\n\nRequest.prototype.pause = function () {\n var self = this;\n\n if (!self.responseContent) {\n self._paused = true;\n } else {\n self.responseContent.pause.apply(self.responseContent, arguments);\n }\n};\n\nRequest.prototype.resume = function () {\n var self = this;\n\n if (!self.responseContent) {\n self._paused = false;\n } else {\n self.responseContent.resume.apply(self.responseContent, arguments);\n }\n};\n\nRequest.prototype.destroy = function () {\n var self = this;\n this.clearTimeout();\n\n if (!self._ended) {\n self.end();\n } else if (self.response) {\n self.response.destroy();\n }\n};\n\nRequest.prototype.clearTimeout = function () {\n if (this.timeoutTimer) {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = null;\n }\n};\n\nRequest.defaultProxyHeaderWhiteList = Tunnel.defaultProxyHeaderWhiteList.slice();\nRequest.defaultProxyHeaderExclusiveList = Tunnel.defaultProxyHeaderExclusiveList.slice(); // Exports\n\nRequest.prototype.toJSON = requestToJSON;\nmodule.exports = Request;","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/request/request.js"],"names":["http","require","https","url","util","stream","zlib","aws2","aws4","httpSignature","mime","caseless","ForeverAgent","FormData","extend","isstream","isTypedArray","strict","helpers","cookies","getProxyFromURI","Querystring","Har","Auth","OAuth","hawk","Multipart","Redirect","Tunnel","now","Buffer","safeStringify","isReadStream","toBase64","defer","copy","version","globalCookieJar","jar","globalPool","filterForNonReserved","reserved","options","object","i","notReserved","indexOf","filterOutReservedFunctions","isReserved","isFunction","requestToJSON","self","uri","method","headers","responseToJSON","statusCode","body","request","call","Request","har","_har","Stream","Object","keys","prototype","nonReserved","readable","writable","explicitMethod","_qs","_auth","_oauth","_multipart","_redirect","_tunnel","init","inherits","debug","process","env","NODE_DEBUG","test","console","error","format","apply","arguments","headerName","httpify","localAddress","pool","dests","__isRequestRequest","_callback","callback","_callbackCalled","on","bind","baseUrl","emit","Error","baseUrlEndsWithSlash","lastIndexOf","length","uriStartsWithSlash","slice","parse","href","protocol","host","enableUnixSocket","strictSSL","rejectUnauthorized","pathname","hostname","port","isUnix","faultyUri","message","abort","hasOwnProperty","proxy","tunnel","isEnabled","setup","onRequest","setHost","hasHeader","hostHeaderName","originalHostHeaderName","setHeader","_jar","form","formData","requestForm","appendFormValue","key","value","append","formKey","formValue","Array","j","qs","path","search","aws","auth","user","username","pass","password","sendImmediately","bearer","gzip","uriAuthPieces","split","map","item","unescape","join","proxyAuthPieces","authHeader","json","multipart","time","timing","elapsedTime","setContentLength","from","byteLength","isArray","reduce","a","b","oauth","params","defaultModules","httpModules","httpModule","ca","agent","agentOptions","agentClass","forever","v","major","minor","SSL","Agent","keepAlive","getNewAgent","src","ntick","_started","lookup","_json","_aborted","end","_form","hasAuth","pipe","sentAuth","chunked","forEach","part","write","requestBodyStream","warn","getHeaders","getLength","err","isNaN","ciphers","secureProtocol","secureOptions","cert","pfx","passphrase","poolKey","name","isHttps","toString","globalAgent","maxSockets","start","startTime","Date","getTime","startTimeNow","stat","size","_aws","reqOptions","timeout","req","timings","timeoutTimer","isFinite","onRequestResponse","onRequestError","socket","isConnecting","_connecting","connecting","onLookupTiming","onConnectTiming","connect","once","removeListener","setReqTimeout","setTimeout","e","code","undefined","onReqSockConnect","clearTimeout","_reusedSocket","addRequestNoreuse","addRequest","response","timingStart","Math","round","timingPhases","wait","dns","tcp","firstByte","download","total","resume","toJSON","authorized","sslErr","authorizationError","originalHost","getHeader","removeHeader","targetCookieJar","setCookie","addCookie","cookie","ignoreError","has","_disableCookies","onResponse","_ended","noBody","responseContent","contentEncoding","trim","toLowerCase","zlibOptions","flush","Z_SYNC_FLUSH","finishFlush","createGunzip","createInflate","encoding","setEncoding","_paused","pause","dest","pipeDest","chunk","responseStarted","responseStartTime","_destdata","readResponseBody","buffers","bufferLength","strings","isBuffer","push","concat","substring","JSON","_jsonReviver","alloc","destroy","headersSent","ctname","clname","pipefilter","q","clobber","base","query","stringify","rfc3986","val","jsonReplacer","_jsonReplacer","jsonReviver","result","re","match","RegExp","unixParts","socketPath","opts","sign_version","service","signRes","sign","accessKeyId","secretAccessKey","secret","sessionToken","session","Authorization","date","toUTCString","verb","toUpperCase","contentType","md5","amazonHeaders","canonicalizeHeaders","bucket","resource","canonicalizeResource","authorization","signRequest","header","redirectsFollowed","originalCookieHeader","getCookieString","urihref","defaultProxyHeaderWhiteList","defaultProxyHeaderExclusiveList","module","exports"],"mappings":"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","sourcesContent":["'use strict'\n\nvar http = require('http')\nvar https = require('https')\nvar url = require('url')\nvar util = require('util')\nvar stream = require('stream')\nvar zlib = require('zlib')\nvar aws2 = require('aws-sign2')\nvar aws4 = require('aws4')\nvar httpSignature = require('http-signature')\nvar mime = require('mime-types')\nvar caseless = require('caseless')\nvar ForeverAgent = require('forever-agent')\nvar FormData = require('form-data')\nvar extend = require('extend')\nvar isstream = require('isstream')\nvar isTypedArray = require('is-typedarray').strict\nvar helpers = require('./lib/helpers')\nvar cookies = require('./lib/cookies')\nvar getProxyFromURI = require('./lib/getProxyFromURI')\nvar Querystring = require('./lib/querystring').Querystring\nvar Har = require('./lib/har').Har\nvar Auth = require('./lib/auth').Auth\nvar OAuth = require('./lib/oauth').OAuth\nvar hawk = require('./lib/hawk')\nvar Multipart = require('./lib/multipart').Multipart\nvar Redirect = require('./lib/redirect').Redirect\nvar Tunnel = require('./lib/tunnel').Tunnel\nvar now = require('performance-now')\nvar Buffer = require('safe-buffer').Buffer\n\nvar safeStringify = helpers.safeStringify\nvar isReadStream = helpers.isReadStream\nvar toBase64 = helpers.toBase64\nvar defer = helpers.defer\nvar copy = helpers.copy\nvar version = helpers.version\nvar globalCookieJar = cookies.jar()\n\nvar globalPool = {}\n\nfunction filterForNonReserved (reserved, options) {\n // Filter out properties that are not reserved.\n // Reserved values are passed in at call site.\n\n var object = {}\n for (var i in options) {\n var notReserved = (reserved.indexOf(i) === -1)\n if (notReserved) {\n object[i] = options[i]\n }\n }\n return object\n}\n\nfunction filterOutReservedFunctions (reserved, options) {\n // Filter out properties that are functions and are reserved.\n // Reserved values are passed in at call site.\n\n var object = {}\n for (var i in options) {\n var isReserved = !(reserved.indexOf(i) === -1)\n var isFunction = (typeof options[i] === 'function')\n if (!(isReserved && isFunction)) {\n object[i] = options[i]\n }\n }\n return object\n}\n\n// Return a simpler request object to allow serialization\nfunction requestToJSON () {\n var self = this\n return {\n uri: self.uri,\n method: self.method,\n headers: self.headers\n }\n}\n\n// Return a simpler response object to allow serialization\nfunction responseToJSON () {\n var self = this\n return {\n statusCode: self.statusCode,\n body: self.body,\n headers: self.headers,\n request: requestToJSON.call(self.request)\n }\n}\n\nfunction Request (options) {\n // if given the method property in options, set property explicitMethod to true\n\n // extend the Request instance with any non-reserved properties\n // remove any reserved functions from the options object\n // set Request instance to be readable and writable\n // call init\n\n var self = this\n\n // start with HAR, then override with additional options\n if (options.har) {\n self._har = new Har(self)\n options = self._har.options(options)\n }\n\n stream.Stream.call(self)\n var reserved = Object.keys(Request.prototype)\n var nonReserved = filterForNonReserved(reserved, options)\n\n extend(self, nonReserved)\n options = filterOutReservedFunctions(reserved, options)\n\n self.readable = true\n self.writable = true\n if (options.method) {\n self.explicitMethod = true\n }\n self._qs = new Querystring(self)\n self._auth = new Auth(self)\n self._oauth = new OAuth(self)\n self._multipart = new Multipart(self)\n self._redirect = new Redirect(self)\n self._tunnel = new Tunnel(self)\n self.init(options)\n}\n\nutil.inherits(Request, stream.Stream)\n\n// Debugging\nRequest.debug = process.env.NODE_DEBUG && /\\brequest\\b/.test(process.env.NODE_DEBUG)\nfunction debug () {\n if (Request.debug) {\n console.error('REQUEST %s', util.format.apply(util, arguments))\n }\n}\nRequest.prototype.debug = debug\n\nRequest.prototype.init = function (options) {\n // init() contains all the code to setup the request object.\n // the actual outgoing request is not started until start() is called\n // this function is called from both the constructor and on redirect.\n var self = this\n if (!options) {\n options = {}\n }\n self.headers = self.headers ? copy(self.headers) : {}\n\n // Delete headers with value undefined since they break\n // ClientRequest.OutgoingMessage.setHeader in node 0.12\n for (var headerName in self.headers) {\n if (typeof self.headers[headerName] === 'undefined') {\n delete self.headers[headerName]\n }\n }\n\n caseless.httpify(self, self.headers)\n\n if (!self.method) {\n self.method = options.method || 'GET'\n }\n if (!self.localAddress) {\n self.localAddress = options.localAddress\n }\n\n self._qs.init(options)\n\n debug(options)\n if (!self.pool && self.pool !== false) {\n self.pool = globalPool\n }\n self.dests = self.dests || []\n self.__isRequestRequest = true\n\n // Protect against double callback\n if (!self._callback && self.callback) {\n self._callback = self.callback\n self.callback = function () {\n if (self._callbackCalled) {\n return // Print a warning maybe?\n }\n self._callbackCalled = true\n self._callback.apply(self, arguments)\n }\n self.on('error', self.callback.bind())\n self.on('complete', self.callback.bind(self, null))\n }\n\n // People use this property instead all the time, so support it\n if (!self.uri && self.url) {\n self.uri = self.url\n delete self.url\n }\n\n // If there's a baseUrl, then use it as the base URL (i.e. uri must be\n // specified as a relative path and is appended to baseUrl).\n if (self.baseUrl) {\n if (typeof self.baseUrl !== 'string') {\n return self.emit('error', new Error('options.baseUrl must be a string'))\n }\n\n if (typeof self.uri !== 'string') {\n return self.emit('error', new Error('options.uri must be a string when using options.baseUrl'))\n }\n\n if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) {\n return self.emit('error', new Error('options.uri must be a path when using options.baseUrl'))\n }\n\n // Handle all cases to make sure that there's only one slash between\n // baseUrl and uri.\n var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1\n var uriStartsWithSlash = self.uri.indexOf('/') === 0\n\n if (baseUrlEndsWithSlash && uriStartsWithSlash) {\n self.uri = self.baseUrl + self.uri.slice(1)\n } else if (baseUrlEndsWithSlash || uriStartsWithSlash) {\n self.uri = self.baseUrl + self.uri\n } else if (self.uri === '') {\n self.uri = self.baseUrl\n } else {\n self.uri = self.baseUrl + '/' + self.uri\n }\n delete self.baseUrl\n }\n\n // A URI is needed by this point, emit error if we haven't been able to get one\n if (!self.uri) {\n return self.emit('error', new Error('options.uri is a required argument'))\n }\n\n // If a string URI/URL was given, parse it into a URL object\n if (typeof self.uri === 'string') {\n self.uri = url.parse(self.uri)\n }\n\n // Some URL objects are not from a URL parsed string and need href added\n if (!self.uri.href) {\n self.uri.href = url.format(self.uri)\n }\n\n // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme\n if (self.uri.protocol === 'unix:') {\n return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`'))\n }\n\n // Support Unix Sockets\n if (self.uri.host === 'unix') {\n self.enableUnixSocket()\n }\n\n if (self.strictSSL === false) {\n self.rejectUnauthorized = false\n }\n\n if (!self.uri.pathname) { self.uri.pathname = '/' }\n\n if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) {\n // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar\n // Detect and reject it as soon as possible\n var faultyUri = url.format(self.uri)\n var message = 'Invalid URI \"' + faultyUri + '\"'\n if (Object.keys(options).length === 0) {\n // No option ? This can be the sign of a redirect\n // As this is a case where the user cannot do anything (they didn't call request directly with this URL)\n // they should be warned that it can be caused by a redirection (can save some hair)\n message += '. This can be caused by a crappy redirection.'\n }\n // This error was fatal\n self.abort()\n return self.emit('error', new Error(message))\n }\n\n if (!self.hasOwnProperty('proxy')) {\n self.proxy = getProxyFromURI(self.uri)\n }\n\n self.tunnel = self._tunnel.isEnabled()\n if (self.proxy) {\n self._tunnel.setup(options)\n }\n\n self._redirect.onRequest(options)\n\n self.setHost = false\n if (!self.hasHeader('host')) {\n var hostHeaderName = self.originalHostHeaderName || 'host'\n self.setHeader(hostHeaderName, self.uri.host)\n // Drop :port suffix from Host header if known protocol.\n if (self.uri.port) {\n if ((self.uri.port === '80' && self.uri.protocol === 'http:') ||\n (self.uri.port === '443' && self.uri.protocol === 'https:')) {\n self.setHeader(hostHeaderName, self.uri.hostname)\n }\n }\n self.setHost = true\n }\n\n self.jar(self._jar || options.jar)\n\n if (!self.uri.port) {\n if (self.uri.protocol === 'http:') { self.uri.port = 80 } else if (self.uri.protocol === 'https:') { self.uri.port = 443 }\n }\n\n if (self.proxy && !self.tunnel) {\n self.port = self.proxy.port\n self.host = self.proxy.hostname\n } else {\n self.port = self.uri.port\n self.host = self.uri.hostname\n }\n\n if (options.form) {\n self.form(options.form)\n }\n\n if (options.formData) {\n var formData = options.formData\n var requestForm = self.form()\n var appendFormValue = function (key, value) {\n if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) {\n requestForm.append(key, value.value, value.options)\n } else {\n requestForm.append(key, value)\n }\n }\n for (var formKey in formData) {\n if (formData.hasOwnProperty(formKey)) {\n var formValue = formData[formKey]\n if (formValue instanceof Array) {\n for (var j = 0; j < formValue.length; j++) {\n appendFormValue(formKey, formValue[j])\n }\n } else {\n appendFormValue(formKey, formValue)\n }\n }\n }\n }\n\n if (options.qs) {\n self.qs(options.qs)\n }\n\n if (self.uri.path) {\n self.path = self.uri.path\n } else {\n self.path = self.uri.pathname + (self.uri.search || '')\n }\n\n if (self.path.length === 0) {\n self.path = '/'\n }\n\n // Auth must happen last in case signing is dependent on other headers\n if (options.aws) {\n self.aws(options.aws)\n }\n\n if (options.hawk) {\n self.hawk(options.hawk)\n }\n\n if (options.httpSignature) {\n self.httpSignature(options.httpSignature)\n }\n\n if (options.auth) {\n if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) {\n options.auth.user = options.auth.username\n }\n if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) {\n options.auth.pass = options.auth.password\n }\n\n self.auth(\n options.auth.user,\n options.auth.pass,\n options.auth.sendImmediately,\n options.auth.bearer\n )\n }\n\n if (self.gzip && !self.hasHeader('accept-encoding')) {\n self.setHeader('accept-encoding', 'gzip, deflate')\n }\n\n if (self.uri.auth && !self.hasHeader('authorization')) {\n var uriAuthPieces = self.uri.auth.split(':').map(function (item) { return self._qs.unescape(item) })\n self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true)\n }\n\n if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) {\n var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) { return self._qs.unescape(item) })\n var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':'))\n self.setHeader('proxy-authorization', authHeader)\n }\n\n if (self.proxy && !self.tunnel) {\n self.path = (self.uri.protocol + '//' + self.uri.host + self.path)\n }\n\n if (options.json) {\n self.json(options.json)\n }\n if (options.multipart) {\n self.multipart(options.multipart)\n }\n\n if (options.time) {\n self.timing = true\n\n // NOTE: elapsedTime is deprecated in favor of .timings\n self.elapsedTime = self.elapsedTime || 0\n }\n\n function setContentLength () {\n if (isTypedArray(self.body)) {\n self.body = Buffer.from(self.body)\n }\n\n if (!self.hasHeader('content-length')) {\n var length\n if (typeof self.body === 'string') {\n length = Buffer.byteLength(self.body)\n } else if (Array.isArray(self.body)) {\n length = self.body.reduce(function (a, b) { return a + b.length }, 0)\n } else {\n length = self.body.length\n }\n\n if (length) {\n self.setHeader('content-length', length)\n } else {\n self.emit('error', new Error('Argument error, options.body.'))\n }\n }\n }\n if (self.body && !isstream(self.body)) {\n setContentLength()\n }\n\n if (options.oauth) {\n self.oauth(options.oauth)\n } else if (self._oauth.params && self.hasHeader('authorization')) {\n self.oauth(self._oauth.params)\n }\n\n var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol\n var defaultModules = {'http:': http, 'https:': https}\n var httpModules = self.httpModules || {}\n\n self.httpModule = httpModules[protocol] || defaultModules[protocol]\n\n if (!self.httpModule) {\n return self.emit('error', new Error('Invalid protocol: ' + protocol))\n }\n\n if (options.ca) {\n self.ca = options.ca\n }\n\n if (!self.agent) {\n if (options.agentOptions) {\n self.agentOptions = options.agentOptions\n }\n\n if (options.agentClass) {\n self.agentClass = options.agentClass\n } else if (options.forever) {\n var v = version()\n // use ForeverAgent in node 0.10- only\n if (v.major === 0 && v.minor <= 10) {\n self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL\n } else {\n self.agentClass = self.httpModule.Agent\n self.agentOptions = self.agentOptions || {}\n self.agentOptions.keepAlive = true\n }\n } else {\n self.agentClass = self.httpModule.Agent\n }\n }\n\n if (self.pool === false) {\n self.agent = false\n } else {\n self.agent = self.agent || self.getNewAgent()\n }\n\n self.on('pipe', function (src) {\n if (self.ntick && self._started) {\n self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.'))\n }\n self.src = src\n if (isReadStream(src)) {\n if (!self.hasHeader('content-type')) {\n self.setHeader('content-type', mime.lookup(src.path))\n }\n } else {\n if (src.headers) {\n for (var i in src.headers) {\n if (!self.hasHeader(i)) {\n self.setHeader(i, src.headers[i])\n }\n }\n }\n if (self._json && !self.hasHeader('content-type')) {\n self.setHeader('content-type', 'application/json')\n }\n if (src.method && !self.explicitMethod) {\n self.method = src.method\n }\n }\n\n // self.on('pipe', function () {\n // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.')\n // })\n })\n\n defer(function () {\n if (self._aborted) {\n return\n }\n\n var end = function () {\n if (self._form) {\n if (!self._auth.hasAuth) {\n self._form.pipe(self)\n } else if (self._auth.hasAuth && self._auth.sentAuth) {\n self._form.pipe(self)\n }\n }\n if (self._multipart && self._multipart.chunked) {\n self._multipart.body.pipe(self)\n }\n if (self.body) {\n if (isstream(self.body)) {\n self.body.pipe(self)\n } else {\n setContentLength()\n if (Array.isArray(self.body)) {\n self.body.forEach(function (part) {\n self.write(part)\n })\n } else {\n self.write(self.body)\n }\n self.end()\n }\n } else if (self.requestBodyStream) {\n console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.')\n self.requestBodyStream.pipe(self)\n } else if (!self.src) {\n if (self._auth.hasAuth && !self._auth.sentAuth) {\n self.end()\n return\n }\n if (self.method !== 'GET' && typeof self.method !== 'undefined') {\n self.setHeader('content-length', 0)\n }\n self.end()\n }\n }\n\n if (self._form && !self.hasHeader('content-length')) {\n // Before ending the request, we had to compute the length of the whole form, asyncly\n self.setHeader(self._form.getHeaders(), true)\n self._form.getLength(function (err, length) {\n if (!err && !isNaN(length)) {\n self.setHeader('content-length', length)\n }\n end()\n })\n } else {\n end()\n }\n\n self.ntick = true\n })\n}\n\nRequest.prototype.getNewAgent = function () {\n var self = this\n var Agent = self.agentClass\n var options = {}\n if (self.agentOptions) {\n for (var i in self.agentOptions) {\n options[i] = self.agentOptions[i]\n }\n }\n if (self.ca) {\n options.ca = self.ca\n }\n if (self.ciphers) {\n options.ciphers = self.ciphers\n }\n if (self.secureProtocol) {\n options.secureProtocol = self.secureProtocol\n }\n if (self.secureOptions) {\n options.secureOptions = self.secureOptions\n }\n if (typeof self.rejectUnauthorized !== 'undefined') {\n options.rejectUnauthorized = self.rejectUnauthorized\n }\n\n if (self.cert && self.key) {\n options.key = self.key\n options.cert = self.cert\n }\n\n if (self.pfx) {\n options.pfx = self.pfx\n }\n\n if (self.passphrase) {\n options.passphrase = self.passphrase\n }\n\n var poolKey = ''\n\n // different types of agents are in different pools\n if (Agent !== self.httpModule.Agent) {\n poolKey += Agent.name\n }\n\n // ca option is only relevant if proxy or destination are https\n var proxy = self.proxy\n if (typeof proxy === 'string') {\n proxy = url.parse(proxy)\n }\n var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:'\n\n if (isHttps) {\n if (options.ca) {\n if (poolKey) {\n poolKey += ':'\n }\n poolKey += options.ca\n }\n\n if (typeof options.rejectUnauthorized !== 'undefined') {\n if (poolKey) {\n poolKey += ':'\n }\n poolKey += options.rejectUnauthorized\n }\n\n if (options.cert) {\n if (poolKey) {\n poolKey += ':'\n }\n poolKey += options.cert.toString('ascii') + options.key.toString('ascii')\n }\n\n if (options.pfx) {\n if (poolKey) {\n poolKey += ':'\n }\n poolKey += options.pfx.toString('ascii')\n }\n\n if (options.ciphers) {\n if (poolKey) {\n poolKey += ':'\n }\n poolKey += options.ciphers\n }\n\n if (options.secureProtocol) {\n if (poolKey) {\n poolKey += ':'\n }\n poolKey += options.secureProtocol\n }\n\n if (options.secureOptions) {\n if (poolKey) {\n poolKey += ':'\n }\n poolKey += options.secureOptions\n }\n }\n\n if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) {\n // not doing anything special. Use the globalAgent\n return self.httpModule.globalAgent\n }\n\n // we're using a stored agent. Make sure it's protocol-specific\n poolKey = self.uri.protocol + poolKey\n\n // generate a new agent for this setting if none yet exists\n if (!self.pool[poolKey]) {\n self.pool[poolKey] = new Agent(options)\n // properly set maxSockets on new agents\n if (self.pool.maxSockets) {\n self.pool[poolKey].maxSockets = self.pool.maxSockets\n }\n }\n\n return self.pool[poolKey]\n}\n\nRequest.prototype.start = function () {\n // start() is called once we are ready to send the outgoing HTTP request.\n // this is usually called on the first write(), end() or on nextTick()\n var self = this\n\n if (self.timing) {\n // All timings will be relative to this request's startTime. In order to do this,\n // we need to capture the wall-clock start time (via Date), immediately followed\n // by the high-resolution timer (via now()). While these two won't be set\n // at the _exact_ same time, they should be close enough to be able to calculate\n // high-resolution, monotonically non-decreasing timestamps relative to startTime.\n var startTime = new Date().getTime()\n var startTimeNow = now()\n }\n\n if (self._aborted) {\n return\n }\n\n self._started = true\n self.method = self.method || 'GET'\n self.href = self.uri.href\n\n if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) {\n self.setHeader('content-length', self.src.stat.size)\n }\n if (self._aws) {\n self.aws(self._aws, true)\n }\n\n // We have a method named auth, which is completely different from the http.request\n // auth option. If we don't remove it, we're gonna have a bad time.\n var reqOptions = copy(self)\n delete reqOptions.auth\n\n debug('make request', self.uri.href)\n\n // node v6.8.0 now supports a `timeout` value in `http.request()`, but we\n // should delete it for now since we handle timeouts manually for better\n // consistency with node versions before v6.8.0\n delete reqOptions.timeout\n\n try {\n self.req = self.httpModule.request(reqOptions)\n } catch (err) {\n self.emit('error', err)\n return\n }\n\n if (self.timing) {\n self.startTime = startTime\n self.startTimeNow = startTimeNow\n\n // Timing values will all be relative to startTime (by comparing to startTimeNow\n // so we have an accurate clock)\n self.timings = {}\n }\n\n var timeout\n if (self.timeout && !self.timeoutTimer) {\n if (self.timeout < 0) {\n timeout = 0\n } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) {\n timeout = self.timeout\n }\n }\n\n self.req.on('response', self.onRequestResponse.bind(self))\n self.req.on('error', self.onRequestError.bind(self))\n self.req.on('drain', function () {\n self.emit('drain')\n })\n\n self.req.on('socket', function (socket) {\n // `._connecting` was the old property which was made public in node v6.1.0\n var isConnecting = socket._connecting || socket.connecting\n if (self.timing) {\n self.timings.socket = now() - self.startTimeNow\n\n if (isConnecting) {\n var onLookupTiming = function () {\n self.timings.lookup = now() - self.startTimeNow\n }\n\n var onConnectTiming = function () {\n self.timings.connect = now() - self.startTimeNow\n }\n\n socket.once('lookup', onLookupTiming)\n socket.once('connect', onConnectTiming)\n\n // clean up timing event listeners if needed on error\n self.req.once('error', function () {\n socket.removeListener('lookup', onLookupTiming)\n socket.removeListener('connect', onConnectTiming)\n })\n }\n }\n\n var setReqTimeout = function () {\n // This timeout sets the amount of time to wait *between* bytes sent\n // from the server once connected.\n //\n // In particular, it's useful for erroring if the server fails to send\n // data halfway through streaming a response.\n self.req.setTimeout(timeout, function () {\n if (self.req) {\n self.abort()\n var e = new Error('ESOCKETTIMEDOUT')\n e.code = 'ESOCKETTIMEDOUT'\n e.connect = false\n self.emit('error', e)\n }\n })\n }\n if (timeout !== undefined) {\n // Only start the connection timer if we're actually connecting a new\n // socket, otherwise if we're already connected (because this is a\n // keep-alive connection) do not bother. This is important since we won't\n // get a 'connect' event for an already connected socket.\n if (isConnecting) {\n var onReqSockConnect = function () {\n socket.removeListener('connect', onReqSockConnect)\n self.clearTimeout()\n setReqTimeout()\n }\n\n socket.on('connect', onReqSockConnect)\n\n self.req.on('error', function (err) { // eslint-disable-line handle-callback-err\n socket.removeListener('connect', onReqSockConnect)\n })\n\n // Set a timeout in memory - this block will throw if the server takes more\n // than `timeout` to write the HTTP status and headers (corresponding to\n // the on('response') event on the client). NB: this measures wall-clock\n // time, not the time between bytes sent by the server.\n self.timeoutTimer = setTimeout(function () {\n socket.removeListener('connect', onReqSockConnect)\n self.abort()\n var e = new Error('ETIMEDOUT')\n e.code = 'ETIMEDOUT'\n e.connect = true\n self.emit('error', e)\n }, timeout)\n } else {\n // We're already connected\n setReqTimeout()\n }\n }\n self.emit('socket', socket)\n })\n\n self.emit('request', self.req)\n}\n\nRequest.prototype.onRequestError = function (error) {\n var self = this\n if (self._aborted) {\n return\n }\n if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' &&\n self.agent.addRequestNoreuse) {\n self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }\n self.start()\n self.req.end()\n return\n }\n self.clearTimeout()\n self.emit('error', error)\n}\n\nRequest.prototype.onRequestResponse = function (response) {\n var self = this\n\n if (self.timing) {\n self.timings.response = now() - self.startTimeNow\n }\n\n debug('onRequestResponse', self.uri.href, response.statusCode, response.headers)\n response.on('end', function () {\n if (self.timing) {\n self.timings.end = now() - self.startTimeNow\n response.timingStart = self.startTime\n\n // fill in the blanks for any periods that didn't trigger, such as\n // no lookup or connect due to keep alive\n if (!self.timings.socket) {\n self.timings.socket = 0\n }\n if (!self.timings.lookup) {\n self.timings.lookup = self.timings.socket\n }\n if (!self.timings.connect) {\n self.timings.connect = self.timings.lookup\n }\n if (!self.timings.response) {\n self.timings.response = self.timings.connect\n }\n\n debug('elapsed time', self.timings.end)\n\n // elapsedTime includes all redirects\n self.elapsedTime += Math.round(self.timings.end)\n\n // NOTE: elapsedTime is deprecated in favor of .timings\n response.elapsedTime = self.elapsedTime\n\n // timings is just for the final fetch\n response.timings = self.timings\n\n // pre-calculate phase timings as well\n response.timingPhases = {\n wait: self.timings.socket,\n dns: self.timings.lookup - self.timings.socket,\n tcp: self.timings.connect - self.timings.lookup,\n firstByte: self.timings.response - self.timings.connect,\n download: self.timings.end - self.timings.response,\n total: self.timings.end\n }\n }\n debug('response end', self.uri.href, response.statusCode, response.headers)\n })\n\n if (self._aborted) {\n debug('aborted', self.uri.href)\n response.resume()\n return\n }\n\n self.response = response\n response.request = self\n response.toJSON = responseToJSON\n\n // XXX This is different on 0.10, because SSL is strict by default\n if (self.httpModule === https &&\n self.strictSSL && (!response.hasOwnProperty('socket') ||\n !response.socket.authorized)) {\n debug('strict ssl error', self.uri.href)\n var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL'\n self.emit('error', new Error('SSL Error: ' + sslErr))\n return\n }\n\n // Save the original host before any redirect (if it changes, we need to\n // remove any authorization headers). Also remember the case of the header\n // name because lots of broken servers expect Host instead of host and we\n // want the caller to be able to specify this.\n self.originalHost = self.getHeader('host')\n if (!self.originalHostHeaderName) {\n self.originalHostHeaderName = self.hasHeader('host')\n }\n if (self.setHost) {\n self.removeHeader('host')\n }\n self.clearTimeout()\n\n var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar\n var addCookie = function (cookie) {\n // set the cookie if it's domain in the href's domain.\n try {\n targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true})\n } catch (e) {\n self.emit('error', e)\n }\n }\n\n response.caseless = caseless(response.headers)\n\n if (response.caseless.has('set-cookie') && (!self._disableCookies)) {\n var headerName = response.caseless.has('set-cookie')\n if (Array.isArray(response.headers[headerName])) {\n response.headers[headerName].forEach(addCookie)\n } else {\n addCookie(response.headers[headerName])\n }\n }\n\n if (self._redirect.onResponse(response)) {\n return // Ignore the rest of the response\n } else {\n // Be a good stream and emit end when the response is finished.\n // Hack to emit end on close because of a core bug that never fires end\n response.on('close', function () {\n if (!self._ended) {\n self.response.emit('end')\n }\n })\n\n response.once('end', function () {\n self._ended = true\n })\n\n var noBody = function (code) {\n return (\n self.method === 'HEAD' ||\n // Informational\n (code >= 100 && code < 200) ||\n // No Content\n code === 204 ||\n // Not Modified\n code === 304\n )\n }\n\n var responseContent\n if (self.gzip && !noBody(response.statusCode)) {\n var contentEncoding = response.headers['content-encoding'] || 'identity'\n contentEncoding = contentEncoding.trim().toLowerCase()\n\n // Be more lenient with decoding compressed responses, since (very rarely)\n // servers send slightly invalid gzip responses that are still accepted\n // by common browsers.\n // Always using Z_SYNC_FLUSH is what cURL does.\n var zlibOptions = {\n flush: zlib.Z_SYNC_FLUSH,\n finishFlush: zlib.Z_SYNC_FLUSH\n }\n\n if (contentEncoding === 'gzip') {\n responseContent = zlib.createGunzip(zlibOptions)\n response.pipe(responseContent)\n } else if (contentEncoding === 'deflate') {\n responseContent = zlib.createInflate(zlibOptions)\n response.pipe(responseContent)\n } else {\n // Since previous versions didn't check for Content-Encoding header,\n // ignore any invalid values to preserve backwards-compatibility\n if (contentEncoding !== 'identity') {\n debug('ignoring unrecognized Content-Encoding ' + contentEncoding)\n }\n responseContent = response\n }\n } else {\n responseContent = response\n }\n\n if (self.encoding) {\n if (self.dests.length !== 0) {\n console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.')\n } else {\n responseContent.setEncoding(self.encoding)\n }\n }\n\n if (self._paused) {\n responseContent.pause()\n }\n\n self.responseContent = responseContent\n\n self.emit('response', response)\n\n self.dests.forEach(function (dest) {\n self.pipeDest(dest)\n })\n\n responseContent.on('data', function (chunk) {\n if (self.timing && !self.responseStarted) {\n self.responseStartTime = (new Date()).getTime()\n\n // NOTE: responseStartTime is deprecated in favor of .timings\n response.responseStartTime = self.responseStartTime\n }\n self._destdata = true\n self.emit('data', chunk)\n })\n responseContent.once('end', function (chunk) {\n self.emit('end', chunk)\n })\n responseContent.on('error', function (error) {\n self.emit('error', error)\n })\n responseContent.on('close', function () { self.emit('close') })\n\n if (self.callback) {\n self.readResponseBody(response)\n } else { // if no callback\n self.on('end', function () {\n if (self._aborted) {\n debug('aborted', self.uri.href)\n return\n }\n self.emit('complete', response)\n })\n }\n }\n debug('finish init function', self.uri.href)\n}\n\nRequest.prototype.readResponseBody = function (response) {\n var self = this\n debug(\"reading response's body\")\n var buffers = []\n var bufferLength = 0\n var strings = []\n\n self.on('data', function (chunk) {\n if (!Buffer.isBuffer(chunk)) {\n strings.push(chunk)\n } else if (chunk.length) {\n bufferLength += chunk.length\n buffers.push(chunk)\n }\n })\n self.on('end', function () {\n debug('end event', self.uri.href)\n if (self._aborted) {\n debug('aborted', self.uri.href)\n // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request.\n // This can lead to leaky behavior if the user retains a reference to the request object.\n buffers = []\n bufferLength = 0\n return\n }\n\n if (bufferLength) {\n debug('has body', self.uri.href, bufferLength)\n response.body = Buffer.concat(buffers, bufferLength)\n if (self.encoding !== null) {\n response.body = response.body.toString(self.encoding)\n }\n // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request.\n // This can lead to leaky behavior if the user retains a reference to the request object.\n buffers = []\n bufferLength = 0\n } else if (strings.length) {\n // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.\n // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().\n if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\\uFEFF') {\n strings[0] = strings[0].substring(1)\n }\n response.body = strings.join('')\n }\n\n if (self._json) {\n try {\n response.body = JSON.parse(response.body, self._jsonReviver)\n } catch (e) {\n debug('invalid JSON received', self.uri.href)\n }\n }\n debug('emitting complete', self.uri.href)\n if (typeof response.body === 'undefined' && !self._json) {\n response.body = self.encoding === null ? Buffer.alloc(0) : ''\n }\n self.emit('complete', response, response.body)\n })\n}\n\nRequest.prototype.abort = function () {\n var self = this\n self._aborted = true\n\n if (self.req) {\n self.req.abort()\n } else if (self.response) {\n self.response.destroy()\n }\n\n self.clearTimeout()\n self.emit('abort')\n}\n\nRequest.prototype.pipeDest = function (dest) {\n var self = this\n var response = self.response\n // Called after the response is received\n if (dest.headers && !dest.headersSent) {\n if (response.caseless.has('content-type')) {\n var ctname = response.caseless.has('content-type')\n if (dest.setHeader) {\n dest.setHeader(ctname, response.headers[ctname])\n } else {\n dest.headers[ctname] = response.headers[ctname]\n }\n }\n\n if (response.caseless.has('content-length')) {\n var clname = response.caseless.has('content-length')\n if (dest.setHeader) {\n dest.setHeader(clname, response.headers[clname])\n } else {\n dest.headers[clname] = response.headers[clname]\n }\n }\n }\n if (dest.setHeader && !dest.headersSent) {\n for (var i in response.headers) {\n // If the response content is being decoded, the Content-Encoding header\n // of the response doesn't represent the piped content, so don't pass it.\n if (!self.gzip || i !== 'content-encoding') {\n dest.setHeader(i, response.headers[i])\n }\n }\n dest.statusCode = response.statusCode\n }\n if (self.pipefilter) {\n self.pipefilter(response, dest)\n }\n}\n\nRequest.prototype.qs = function (q, clobber) {\n var self = this\n var base\n if (!clobber && self.uri.query) {\n base = self._qs.parse(self.uri.query)\n } else {\n base = {}\n }\n\n for (var i in q) {\n base[i] = q[i]\n }\n\n var qs = self._qs.stringify(base)\n\n if (qs === '') {\n return self\n }\n\n self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs)\n self.url = self.uri\n self.path = self.uri.path\n\n if (self.uri.host === 'unix') {\n self.enableUnixSocket()\n }\n\n return self\n}\nRequest.prototype.form = function (form) {\n var self = this\n if (form) {\n if (!/^application\\/x-www-form-urlencoded\\b/.test(self.getHeader('content-type'))) {\n self.setHeader('content-type', 'application/x-www-form-urlencoded')\n }\n self.body = (typeof form === 'string')\n ? self._qs.rfc3986(form.toString('utf8'))\n : self._qs.stringify(form).toString('utf8')\n return self\n }\n // create form-data object\n self._form = new FormData()\n self._form.on('error', function (err) {\n err.message = 'form-data: ' + err.message\n self.emit('error', err)\n self.abort()\n })\n return self._form\n}\nRequest.prototype.multipart = function (multipart) {\n var self = this\n\n self._multipart.onRequest(multipart)\n\n if (!self._multipart.chunked) {\n self.body = self._multipart.body\n }\n\n return self\n}\nRequest.prototype.json = function (val) {\n var self = this\n\n if (!self.hasHeader('accept')) {\n self.setHeader('accept', 'application/json')\n }\n\n if (typeof self.jsonReplacer === 'function') {\n self._jsonReplacer = self.jsonReplacer\n }\n\n self._json = true\n if (typeof val === 'boolean') {\n if (self.body !== undefined) {\n if (!/^application\\/x-www-form-urlencoded\\b/.test(self.getHeader('content-type'))) {\n self.body = safeStringify(self.body, self._jsonReplacer)\n } else {\n self.body = self._qs.rfc3986(self.body)\n }\n if (!self.hasHeader('content-type')) {\n self.setHeader('content-type', 'application/json')\n }\n }\n } else {\n self.body = safeStringify(val, self._jsonReplacer)\n if (!self.hasHeader('content-type')) {\n self.setHeader('content-type', 'application/json')\n }\n }\n\n if (typeof self.jsonReviver === 'function') {\n self._jsonReviver = self.jsonReviver\n }\n\n return self\n}\nRequest.prototype.getHeader = function (name, headers) {\n var self = this\n var result, re, match\n if (!headers) {\n headers = self.headers\n }\n Object.keys(headers).forEach(function (key) {\n if (key.length !== name.length) {\n return\n }\n re = new RegExp(name, 'i')\n match = key.match(re)\n if (match) {\n result = headers[key]\n }\n })\n return result\n}\nRequest.prototype.enableUnixSocket = function () {\n // Get the socket & request paths from the URL\n var unixParts = this.uri.path.split(':')\n var host = unixParts[0]\n var path = unixParts[1]\n // Apply unix properties to request\n this.socketPath = host\n this.uri.pathname = path\n this.uri.path = path\n this.uri.host = host\n this.uri.hostname = host\n this.uri.isUnix = true\n}\n\nRequest.prototype.auth = function (user, pass, sendImmediately, bearer) {\n var self = this\n\n self._auth.onRequest(user, pass, sendImmediately, bearer)\n\n return self\n}\nRequest.prototype.aws = function (opts, now) {\n var self = this\n\n if (!now) {\n self._aws = opts\n return self\n }\n\n if (opts.sign_version === 4 || opts.sign_version === '4') {\n // use aws4\n var options = {\n host: self.uri.host,\n path: self.uri.path,\n method: self.method,\n headers: self.headers,\n body: self.body\n }\n if (opts.service) {\n options.service = opts.service\n }\n var signRes = aws4.sign(options, {\n accessKeyId: opts.key,\n secretAccessKey: opts.secret,\n sessionToken: opts.session\n })\n self.setHeader('authorization', signRes.headers.Authorization)\n self.setHeader('x-amz-date', signRes.headers['X-Amz-Date'])\n if (signRes.headers['X-Amz-Security-Token']) {\n self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token'])\n }\n } else {\n // default: use aws-sign2\n var date = new Date()\n self.setHeader('date', date.toUTCString())\n var auth = {\n key: opts.key,\n secret: opts.secret,\n verb: self.method.toUpperCase(),\n date: date,\n contentType: self.getHeader('content-type') || '',\n md5: self.getHeader('content-md5') || '',\n amazonHeaders: aws2.canonicalizeHeaders(self.headers)\n }\n var path = self.uri.path\n if (opts.bucket && path) {\n auth.resource = '/' + opts.bucket + path\n } else if (opts.bucket && !path) {\n auth.resource = '/' + opts.bucket\n } else if (!opts.bucket && path) {\n auth.resource = path\n } else if (!opts.bucket && !path) {\n auth.resource = '/'\n }\n auth.resource = aws2.canonicalizeResource(auth.resource)\n self.setHeader('authorization', aws2.authorization(auth))\n }\n\n return self\n}\nRequest.prototype.httpSignature = function (opts) {\n var self = this\n httpSignature.signRequest({\n getHeader: function (header) {\n return self.getHeader(header, self.headers)\n },\n setHeader: function (header, value) {\n self.setHeader(header, value)\n },\n method: self.method,\n path: self.path\n }, opts)\n debug('httpSignature authorization', self.getHeader('authorization'))\n\n return self\n}\nRequest.prototype.hawk = function (opts) {\n var self = this\n self.setHeader('Authorization', hawk.header(self.uri, self.method, opts))\n}\nRequest.prototype.oauth = function (_oauth) {\n var self = this\n\n self._oauth.onRequest(_oauth)\n\n return self\n}\n\nRequest.prototype.jar = function (jar) {\n var self = this\n var cookies\n\n if (self._redirect.redirectsFollowed === 0) {\n self.originalCookieHeader = self.getHeader('cookie')\n }\n\n if (!jar) {\n // disable cookies\n cookies = false\n self._disableCookies = true\n } else {\n var targetCookieJar = jar.getCookieString ? jar : globalCookieJar\n var urihref = self.uri.href\n // fetch cookie in the Specified host\n if (targetCookieJar) {\n cookies = targetCookieJar.getCookieString(urihref)\n }\n }\n\n // if need cookie and cookie is not empty\n if (cookies && cookies.length) {\n if (self.originalCookieHeader) {\n // Don't overwrite existing Cookie header\n self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies)\n } else {\n self.setHeader('cookie', cookies)\n }\n }\n self._jar = jar\n return self\n}\n\n// Stream API\nRequest.prototype.pipe = function (dest, opts) {\n var self = this\n\n if (self.response) {\n if (self._destdata) {\n self.emit('error', new Error('You cannot pipe after data has been emitted from the response.'))\n } else if (self._ended) {\n self.emit('error', new Error('You cannot pipe after the response has been ended.'))\n } else {\n stream.Stream.prototype.pipe.call(self, dest, opts)\n self.pipeDest(dest)\n return dest\n }\n } else {\n self.dests.push(dest)\n stream.Stream.prototype.pipe.call(self, dest, opts)\n return dest\n }\n}\nRequest.prototype.write = function () {\n var self = this\n if (self._aborted) { return }\n\n if (!self._started) {\n self.start()\n }\n if (self.req) {\n return self.req.write.apply(self.req, arguments)\n }\n}\nRequest.prototype.end = function (chunk) {\n var self = this\n if (self._aborted) { return }\n\n if (chunk) {\n self.write(chunk)\n }\n if (!self._started) {\n self.start()\n }\n if (self.req) {\n self.req.end()\n }\n}\nRequest.prototype.pause = function () {\n var self = this\n if (!self.responseContent) {\n self._paused = true\n } else {\n self.responseContent.pause.apply(self.responseContent, arguments)\n }\n}\nRequest.prototype.resume = function () {\n var self = this\n if (!self.responseContent) {\n self._paused = false\n } else {\n self.responseContent.resume.apply(self.responseContent, arguments)\n }\n}\nRequest.prototype.destroy = function () {\n var self = this\n this.clearTimeout()\n if (!self._ended) {\n self.end()\n } else if (self.response) {\n self.response.destroy()\n }\n}\n\nRequest.prototype.clearTimeout = function () {\n if (this.timeoutTimer) {\n clearTimeout(this.timeoutTimer)\n this.timeoutTimer = null\n }\n}\n\nRequest.defaultProxyHeaderWhiteList =\n Tunnel.defaultProxyHeaderWhiteList.slice()\n\nRequest.defaultProxyHeaderExclusiveList =\n Tunnel.defaultProxyHeaderExclusiveList.slice()\n\n// Exports\n\nRequest.prototype.toJSON = requestToJSON\nmodule.exports = Request\n"]},"metadata":{},"sourceType":"script"} |