diff options
Diffstat (limited to 'hash_script/node_modules/node-fetch/index.js')
-rw-r--r-- | hash_script/node_modules/node-fetch/index.js | 271 |
1 files changed, 0 insertions, 271 deletions
diff --git a/hash_script/node_modules/node-fetch/index.js b/hash_script/node_modules/node-fetch/index.js deleted file mode 100644 index 8f6730d..0000000 --- a/hash_script/node_modules/node-fetch/index.js +++ /dev/null @@ -1,271 +0,0 @@ - -/** - * index.js - * - * a request API compatible with window.fetch - */ - -var parse_url = require('url').parse; -var resolve_url = require('url').resolve; -var http = require('http'); -var https = require('https'); -var zlib = require('zlib'); -var stream = require('stream'); - -var Body = require('./lib/body'); -var Response = require('./lib/response'); -var Headers = require('./lib/headers'); -var Request = require('./lib/request'); -var FetchError = require('./lib/fetch-error'); - -// commonjs -module.exports = Fetch; -// es6 default export compatibility -module.exports.default = module.exports; - -/** - * Fetch class - * - * @param Mixed url Absolute url or Request instance - * @param Object opts Fetch options - * @return Promise - */ -function Fetch(url, opts) { - - // allow call as function - if (!(this instanceof Fetch)) - return new Fetch(url, opts); - - // allow custom promise - if (!Fetch.Promise) { - throw new Error('native promise missing, set Fetch.Promise to your favorite alternative'); - } - - Body.Promise = Fetch.Promise; - - var self = this; - - // wrap http.request into fetch - return new Fetch.Promise(function(resolve, reject) { - // build request object - var options = new Request(url, opts); - - if (!options.protocol || !options.hostname) { - throw new Error('only absolute urls are supported'); - } - - if (options.protocol !== 'http:' && options.protocol !== 'https:') { - throw new Error('only http(s) protocols are supported'); - } - - var send; - if (options.protocol === 'https:') { - send = https.request; - } else { - send = http.request; - } - - // normalize headers - var headers = new Headers(options.headers); - - if (options.compress) { - headers.set('accept-encoding', 'gzip,deflate'); - } - - if (!headers.has('user-agent')) { - headers.set('user-agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); - } - - if (!headers.has('connection') && !options.agent) { - headers.set('connection', 'close'); - } - - if (!headers.has('accept')) { - headers.set('accept', '*/*'); - } - - // detect form data input from form-data module, this hack avoid the need to pass multipart header manually - if (!headers.has('content-type') && options.body && typeof options.body.getBoundary === 'function') { - headers.set('content-type', 'multipart/form-data; boundary=' + options.body.getBoundary()); - } - - // bring node-fetch closer to browser behavior by setting content-length automatically - if (!headers.has('content-length') && /post|put|patch|delete/i.test(options.method)) { - if (typeof options.body === 'string') { - headers.set('content-length', Buffer.byteLength(options.body)); - // detect form data input from form-data module, this hack avoid the need to add content-length header manually - } else if (options.body && typeof options.body.getLengthSync === 'function') { - // for form-data 1.x - if (options.body._lengthRetrievers && options.body._lengthRetrievers.length == 0) { - headers.set('content-length', options.body.getLengthSync().toString()); - // for form-data 2.x - } else if (options.body.hasKnownLength && options.body.hasKnownLength()) { - headers.set('content-length', options.body.getLengthSync().toString()); - } - // this is only necessary for older nodejs releases (before iojs merge) - } else if (options.body === undefined || options.body === null) { - headers.set('content-length', '0'); - } - } - - options.headers = headers.raw(); - - // http.request only support string as host header, this hack make custom host header possible - if (options.headers.host) { - options.headers.host = options.headers.host[0]; - } - - // send request - var req = send(options); - var reqTimeout; - - if (options.timeout) { - req.once('socket', function(socket) { - reqTimeout = setTimeout(function() { - req.abort(); - reject(new FetchError('network timeout at: ' + options.url, 'request-timeout')); - }, options.timeout); - }); - } - - req.on('error', function(err) { - clearTimeout(reqTimeout); - reject(new FetchError('request to ' + options.url + ' failed, reason: ' + err.message, 'system', err)); - }); - - req.on('response', function(res) { - clearTimeout(reqTimeout); - - // handle redirect - if (self.isRedirect(res.statusCode) && options.redirect !== 'manual') { - if (options.redirect === 'error') { - reject(new FetchError('redirect mode is set to error: ' + options.url, 'no-redirect')); - return; - } - - if (options.counter >= options.follow) { - reject(new FetchError('maximum redirect reached at: ' + options.url, 'max-redirect')); - return; - } - - if (!res.headers.location) { - reject(new FetchError('redirect location header missing at: ' + options.url, 'invalid-redirect')); - return; - } - - // per fetch spec, for POST request with 301/302 response, or any request with 303 response, use GET when following redirect - if (res.statusCode === 303 - || ((res.statusCode === 301 || res.statusCode === 302) && options.method === 'POST')) - { - options.method = 'GET'; - delete options.body; - delete options.headers['content-length']; - } - - options.counter++; - - resolve(Fetch(resolve_url(options.url, res.headers.location), options)); - return; - } - - // normalize location header for manual redirect mode - var headers = new Headers(res.headers); - if (options.redirect === 'manual' && headers.has('location')) { - headers.set('location', resolve_url(options.url, headers.get('location'))); - } - - // prepare response - var body = res.pipe(new stream.PassThrough()); - var response_options = { - url: options.url - , status: res.statusCode - , statusText: res.statusMessage - , headers: headers - , size: options.size - , timeout: options.timeout - }; - - // response object - var output; - - // in following scenarios we ignore compression support - // 1. compression support is disabled - // 2. HEAD request - // 3. no content-encoding header - // 4. no content response (204) - // 5. content not modified response (304) - if (!options.compress || options.method === 'HEAD' || !headers.has('content-encoding') || res.statusCode === 204 || res.statusCode === 304) { - output = new Response(body, response_options); - resolve(output); - return; - } - - // otherwise, check for gzip or deflate - var name = headers.get('content-encoding'); - - // for gzip - if (name == 'gzip' || name == 'x-gzip') { - body = body.pipe(zlib.createGunzip()); - output = new Response(body, response_options); - resolve(output); - return; - - // for deflate - } else if (name == 'deflate' || name == 'x-deflate') { - // handle the infamous raw deflate response from old servers - // a hack for old IIS and Apache servers - var raw = res.pipe(new stream.PassThrough()); - raw.once('data', function(chunk) { - // see http://stackoverflow.com/questions/37519828 - if ((chunk[0] & 0x0F) === 0x08) { - body = body.pipe(zlib.createInflate()); - } else { - body = body.pipe(zlib.createInflateRaw()); - } - output = new Response(body, response_options); - resolve(output); - }); - return; - } - - // otherwise, use response as-is - output = new Response(body, response_options); - resolve(output); - return; - }); - - // accept string, buffer or readable stream as body - // per spec we will call tostring on non-stream objects - if (typeof options.body === 'string') { - req.write(options.body); - req.end(); - } else if (options.body instanceof Buffer) { - req.write(options.body); - req.end(); - } else if (typeof options.body === 'object' && options.body.pipe) { - options.body.pipe(req); - } else if (typeof options.body === 'object') { - req.write(options.body.toString()); - req.end(); - } else { - req.end(); - } - }); - -}; - -/** - * Redirect code matching - * - * @param Number code Status code - * @return Boolean - */ -Fetch.prototype.isRedirect = function(code) { - return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; -} - -// expose Promise -Fetch.Promise = global.Promise; -Fetch.Response = Response; -Fetch.Headers = Headers; -Fetch.Request = Request; |