diff options
Diffstat (limited to 'deps/npm/node_modules/got')
-rw-r--r-- | deps/npm/node_modules/got/index.js | 364 | ||||
-rw-r--r-- | deps/npm/node_modules/got/license | 21 | ||||
-rw-r--r-- | deps/npm/node_modules/got/package.json | 110 | ||||
-rw-r--r-- | deps/npm/node_modules/got/readme.md | 335 |
4 files changed, 830 insertions, 0 deletions
diff --git a/deps/npm/node_modules/got/index.js b/deps/npm/node_modules/got/index.js new file mode 100644 index 0000000000..31a64dd08b --- /dev/null +++ b/deps/npm/node_modules/got/index.js @@ -0,0 +1,364 @@ +'use strict'; +const EventEmitter = require('events'); +const http = require('http'); +const https = require('https'); +const PassThrough = require('stream').PassThrough; +const urlLib = require('url'); +const querystring = require('querystring'); +const duplexer3 = require('duplexer3'); +const isStream = require('is-stream'); +const getStream = require('get-stream'); +const timedOut = require('timed-out'); +const urlParseLax = require('url-parse-lax'); +const lowercaseKeys = require('lowercase-keys'); +const isRedirect = require('is-redirect'); +const unzipResponse = require('unzip-response'); +const createErrorClass = require('create-error-class'); +const isRetryAllowed = require('is-retry-allowed'); +const Buffer = require('safe-buffer').Buffer; +const pkg = require('./package'); + +function requestAsEventEmitter(opts) { + opts = opts || {}; + + const ee = new EventEmitter(); + const requestUrl = opts.href || urlLib.resolve(urlLib.format(opts), opts.path); + let redirectCount = 0; + let retryCount = 0; + let redirectUrl; + + const get = opts => { + const fn = opts.protocol === 'https:' ? https : http; + + const req = fn.request(opts, res => { + const statusCode = res.statusCode; + + if (isRedirect(statusCode) && opts.followRedirect && 'location' in res.headers && (opts.method === 'GET' || opts.method === 'HEAD')) { + res.resume(); + + if (++redirectCount > 10) { + ee.emit('error', new got.MaxRedirectsError(statusCode, opts), null, res); + return; + } + + const bufferString = Buffer.from(res.headers.location, 'binary').toString(); + + redirectUrl = urlLib.resolve(urlLib.format(opts), bufferString); + const redirectOpts = Object.assign({}, opts, urlLib.parse(redirectUrl)); + + ee.emit('redirect', res, redirectOpts); + + get(redirectOpts); + + return; + } + + setImmediate(() => { + const response = typeof unzipResponse === 'function' && req.method !== 'HEAD' ? unzipResponse(res) : res; + response.url = redirectUrl || requestUrl; + response.requestUrl = requestUrl; + + ee.emit('response', response); + }); + }); + + req.once('error', err => { + const backoff = opts.retries(++retryCount, err); + + if (backoff) { + setTimeout(get, backoff, opts); + return; + } + + ee.emit('error', new got.RequestError(err, opts)); + }); + + if (opts.gotTimeout) { + timedOut(req, opts.gotTimeout); + } + + setImmediate(() => { + ee.emit('request', req); + }); + }; + + get(opts); + return ee; +} + +function asPromise(opts) { + return new Promise((resolve, reject) => { + const ee = requestAsEventEmitter(opts); + + ee.on('request', req => { + if (isStream(opts.body)) { + opts.body.pipe(req); + opts.body = undefined; + return; + } + + req.end(opts.body); + }); + + ee.on('response', res => { + const stream = opts.encoding === null ? getStream.buffer(res) : getStream(res, opts); + + stream + .catch(err => reject(new got.ReadError(err, opts))) + .then(data => { + const statusCode = res.statusCode; + const limitStatusCode = opts.followRedirect ? 299 : 399; + + res.body = data; + + if (opts.json && res.body) { + try { + res.body = JSON.parse(res.body); + } catch (e) { + throw new got.ParseError(e, statusCode, opts, data); + } + } + + if (statusCode < 200 || statusCode > limitStatusCode) { + throw new got.HTTPError(statusCode, opts); + } + + resolve(res); + }) + .catch(err => { + Object.defineProperty(err, 'response', {value: res}); + reject(err); + }); + }); + + ee.on('error', reject); + }); +} + +function asStream(opts) { + const input = new PassThrough(); + const output = new PassThrough(); + const proxy = duplexer3(input, output); + + if (opts.json) { + throw new Error('got can not be used as stream when options.json is used'); + } + + if (opts.body) { + proxy.write = () => { + throw new Error('got\'s stream is not writable when options.body is used'); + }; + } + + const ee = requestAsEventEmitter(opts); + + ee.on('request', req => { + proxy.emit('request', req); + + if (isStream(opts.body)) { + opts.body.pipe(req); + return; + } + + if (opts.body) { + req.end(opts.body); + return; + } + + if (opts.method === 'POST' || opts.method === 'PUT' || opts.method === 'PATCH') { + input.pipe(req); + return; + } + + req.end(); + }); + + ee.on('response', res => { + const statusCode = res.statusCode; + + res.pipe(output); + + if (statusCode < 200 || statusCode > 299) { + proxy.emit('error', new got.HTTPError(statusCode, opts), null, res); + return; + } + + proxy.emit('response', res); + }); + + ee.on('redirect', proxy.emit.bind(proxy, 'redirect')); + ee.on('error', proxy.emit.bind(proxy, 'error')); + + return proxy; +} + +function normalizeArguments(url, opts) { + if (typeof url !== 'string' && typeof url !== 'object') { + throw new Error(`Parameter \`url\` must be a string or object, not ${typeof url}`); + } + + if (typeof url === 'string') { + url = url.replace(/^unix:/, 'http://$&'); + url = urlParseLax(url); + + if (url.auth) { + throw new Error('Basic authentication must be done with auth option'); + } + } + + opts = Object.assign( + { + protocol: 'http:', + path: '', + retries: 5 + }, + url, + opts + ); + + opts.headers = Object.assign({ + 'user-agent': `${pkg.name}/${pkg.version} (https://github.com/sindresorhus/got)`, + 'accept-encoding': 'gzip,deflate' + }, lowercaseKeys(opts.headers)); + + const query = opts.query; + + if (query) { + if (typeof query !== 'string') { + opts.query = querystring.stringify(query); + } + + opts.path = `${opts.path.split('?')[0]}?${opts.query}`; + delete opts.query; + } + + if (opts.json && opts.headers.accept === undefined) { + opts.headers.accept = 'application/json'; + } + + let body = opts.body; + + if (body) { + if (typeof body !== 'string' && !(body !== null && typeof body === 'object')) { + throw new Error('options.body must be a ReadableStream, string, Buffer or plain Object'); + } + + opts.method = opts.method || 'POST'; + + if (isStream(body) && typeof body.getBoundary === 'function') { + // Special case for https://github.com/form-data/form-data + opts.headers['content-type'] = opts.headers['content-type'] || `multipart/form-data; boundary=${body.getBoundary()}`; + } else if (body !== null && typeof body === 'object' && !Buffer.isBuffer(body) && !isStream(body)) { + opts.headers['content-type'] = opts.headers['content-type'] || 'application/x-www-form-urlencoded'; + body = opts.body = querystring.stringify(body); + } + + if (opts.headers['content-length'] === undefined && opts.headers['transfer-encoding'] === undefined && !isStream(body)) { + const length = typeof body === 'string' ? Buffer.byteLength(body) : body.length; + opts.headers['content-length'] = length; + } + } + + opts.method = (opts.method || 'GET').toUpperCase(); + + if (opts.hostname === 'unix') { + const matches = /(.+):(.+)/.exec(opts.path); + + if (matches) { + opts.socketPath = matches[1]; + opts.path = matches[2]; + opts.host = null; + } + } + + if (typeof opts.retries !== 'function') { + const retries = opts.retries; + + opts.retries = (iter, err) => { + if (iter > retries || !isRetryAllowed(err)) { + return 0; + } + + const noise = Math.random() * 100; + + return ((1 << iter) * 1000) + noise; + }; + } + + if (opts.followRedirect === undefined) { + opts.followRedirect = true; + } + + if (opts.timeout) { + opts.gotTimeout = opts.timeout; + delete opts.timeout; + } + + return opts; +} + +function got(url, opts) { + try { + return asPromise(normalizeArguments(url, opts)); + } catch (err) { + return Promise.reject(err); + } +} + +const helpers = [ + 'get', + 'post', + 'put', + 'patch', + 'head', + 'delete' +]; + +helpers.forEach(el => { + got[el] = (url, opts) => got(url, Object.assign({}, opts, {method: el})); +}); + +got.stream = (url, opts) => asStream(normalizeArguments(url, opts)); + +for (const el of helpers) { + got.stream[el] = (url, opts) => got.stream(url, Object.assign({}, opts, {method: el})); +} + +function stdError(error, opts) { + if (error.code !== undefined) { + this.code = error.code; + } + + Object.assign(this, { + message: error.message, + host: opts.host, + hostname: opts.hostname, + method: opts.method, + path: opts.path + }); +} + +got.RequestError = createErrorClass('RequestError', stdError); +got.ReadError = createErrorClass('ReadError', stdError); +got.ParseError = createErrorClass('ParseError', function (e, statusCode, opts, data) { + stdError.call(this, e, opts); + this.statusCode = statusCode; + this.statusMessage = http.STATUS_CODES[this.statusCode]; + this.message = `${e.message} in "${urlLib.format(opts)}": \n${data.slice(0, 77)}...`; +}); + +got.HTTPError = createErrorClass('HTTPError', function (statusCode, opts) { + stdError.call(this, {}, opts); + this.statusCode = statusCode; + this.statusMessage = http.STATUS_CODES[this.statusCode]; + this.message = `Response code ${this.statusCode} (${this.statusMessage})`; +}); + +got.MaxRedirectsError = createErrorClass('MaxRedirectsError', function (statusCode, opts) { + stdError.call(this, {}, opts); + this.statusCode = statusCode; + this.statusMessage = http.STATUS_CODES[this.statusCode]; + this.message = 'Redirected 10 times. Aborting.'; +}); + +module.exports = got; diff --git a/deps/npm/node_modules/got/license b/deps/npm/node_modules/got/license new file mode 100644 index 0000000000..654d0bfe94 --- /dev/null +++ b/deps/npm/node_modules/got/license @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/deps/npm/node_modules/got/package.json b/deps/npm/node_modules/got/package.json new file mode 100644 index 0000000000..67a0cedf56 --- /dev/null +++ b/deps/npm/node_modules/got/package.json @@ -0,0 +1,110 @@ +{ + "_from": "got@^6.7.1", + "_id": "got@6.7.1", + "_inBundle": false, + "_integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "_location": "/got", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "got@^6.7.1", + "name": "got", + "escapedName": "got", + "rawSpec": "^6.7.1", + "saveSpec": null, + "fetchSpec": "^6.7.1" + }, + "_requiredBy": [ + "/package-json" + ], + "_resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "_shasum": "240cd05785a9a18e561dc1b44b41c763ef1e8db0", + "_spec": "got@^6.7.1", + "_where": "/Users/rebecca/code/npm/node_modules/package-json", + "ava": { + "concurrency": 4 + }, + "browser": { + "unzip-response": false + }, + "bugs": { + "url": "https://github.com/sindresorhus/got/issues" + }, + "bundleDependencies": false, + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "deprecated": false, + "description": "Simplified HTTP requests", + "devDependencies": { + "ava": "^0.17.0", + "coveralls": "^2.11.4", + "form-data": "^2.1.1", + "get-port": "^2.0.0", + "into-stream": "^3.0.0", + "nyc": "^10.0.0", + "pem": "^1.4.4", + "pify": "^2.3.0", + "tempfile": "^1.1.1", + "xo": "*" + }, + "engines": { + "node": ">=4" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/got#readme", + "keywords": [ + "http", + "https", + "get", + "got", + "url", + "uri", + "request", + "util", + "utility", + "simple", + "curl", + "wget", + "fetch" + ], + "license": "MIT", + "maintainers": [ + { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + { + "name": "Vsevolod Strukchinsky", + "email": "floatdrop@gmail.com", + "url": "github.com/floatdrop" + } + ], + "name": "got", + "repository": { + "type": "git", + "url": "git+https://github.com/sindresorhus/got.git" + }, + "scripts": { + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "test": "xo && nyc ava" + }, + "version": "6.7.1", + "xo": { + "esnext": true + } +} diff --git a/deps/npm/node_modules/got/readme.md b/deps/npm/node_modules/got/readme.md new file mode 100644 index 0000000000..bfab067679 --- /dev/null +++ b/deps/npm/node_modules/got/readme.md @@ -0,0 +1,335 @@ +<h1 align="center"> + <br> + <img width="360" src="https://rawgit.com/sindresorhus/got/master/media/logo.svg" alt="got"> + <br> + <br> + <br> +</h1> + +> Simplified HTTP requests + +[![Build Status](https://travis-ci.org/sindresorhus/got.svg?branch=master)](https://travis-ci.org/sindresorhus/got) [![Coverage Status](https://coveralls.io/repos/github/sindresorhus/got/badge.svg?branch=master)](https://coveralls.io/github/sindresorhus/got?branch=master) [![Downloads](https://img.shields.io/npm/dm/got.svg)](https://npmjs.com/got) + +A nicer interface to the built-in [`http`](http://nodejs.org/api/http.html) module. + +It supports following redirects, promises, streams, retries, automagically handling gzip/deflate and some convenience options. + +Created because [`request`](https://github.com/request/request) is bloated *(several megabytes!)*. + + +## Install + +**WARNING: Node.js 4 or higher is required for got@6 and above.** For older Node.js versions use [got@5](https://github.com/sindresorhus/got/tree/v5.x). + +``` +$ npm install --save got +``` + + +## Usage + +```js +const fs = require('fs'); +const got = require('got'); + +got('todomvc.com') + .then(response => { + console.log(response.body); + //=> '<!doctype html> ...' + }) + .catch(error => { + console.log(error.response.body); + //=> 'Internal server error ...' + }); + +// Streams +got.stream('todomvc.com').pipe(fs.createWriteStream('index.html')); + +// For POST, PUT and PATCH methods got.stream returns a WritableStream +fs.createReadStream('index.html').pipe(got.stream.post('todomvc.com')); +``` + + +### API + +It's a `GET` request by default, but can be changed in `options`. + +#### got(url, [options]) + +Returns a Promise for a `response` object with a `body` property, a `url` property with the request URL or the final URL after redirects, and a `requestUrl` property with the original request URL. + +##### url + +Type: `string`, `object` + +The URL to request or a [`http.request` options](https://nodejs.org/api/http.html#http_http_request_options_callback) object. + +Properties from `options` will override properties in the parsed `url`. + +##### options + +Type: `object` + +Any of the [`http.request`](http://nodejs.org/api/http.html#http_http_request_options_callback) options. + +###### body + +Type: `string`, `buffer`, `readableStream`, `object` + +*This is mutually exclusive with stream mode.* + +Body that will be sent with a `POST` request. + +If present in `options` and `options.method` is not set, `options.method` will be set to `POST`. + +If `content-length` or `transfer-encoding` is not set in `options.headers` and `body` is a string or buffer, `content-length` will be set to the body length. + +If `body` is a plain object, it will be stringified with [`querystring.stringify`](https://nodejs.org/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) and sent as `application/x-www-form-urlencoded`. + +###### encoding + +Type: `string`, `null`<br> +Default: `'utf8'` + +Encoding to be used on `setEncoding` of the response data. If `null`, the body is returned as a Buffer. + +###### json + +Type: `boolean`<br> +Default: `false` + +*This is mutually exclusive with stream mode.* + +Parse response body with `JSON.parse` and set `accept` header to `application/json`. + +###### query + +Type: `string`, `object`<br> + +Query string object that will be added to the request URL. This will override the query string in `url`. + +###### timeout + +Type: `number`, `object` + +Milliseconds to wait for a server to send response headers before aborting request with `ETIMEDOUT` error. + +Option accepts `object` with separate `connect` and `socket` fields for connection and socket inactivity timeouts. + +###### retries + +Type: `number`, `function`<br> +Default: `5` + +Number of request retries when network errors happens. Delays between retries counts with function `1000 * Math.pow(2, retry) + Math.random() * 100`, where `retry` is attempt number (starts from 0). + +Option accepts `function` with `retry` and `error` arguments. Function must return delay in milliseconds (`0` return value cancels retry). + +**Note:** if `retries` is `number`, `ENOTFOUND` and `ENETUNREACH` error will not be retried (see full list in [`is-retry-allowed`](https://github.com/floatdrop/is-retry-allowed/blob/master/index.js#L12) module). + +###### followRedirect + +Type: `boolean`<br> +Default: `true` + +Defines if redirect responses should be followed automatically. + + +#### Streams + +#### got.stream(url, [options]) + +`stream` method will return Duplex stream with additional events: + +##### .on('request', request) + +`request` event to get the request object of the request. + +**Tip**: You can use `request` event to abort request: + +```js +got.stream('github.com') + .on('request', req => setTimeout(() => req.abort(), 50)); +``` + +##### .on('response', response) + +`response` event to get the response object of the final request. + +##### .on('redirect', response, nextOptions) + +`redirect` event to get the response object of a redirect. The second argument is options for the next request to the redirect location. + +##### .on('error', error, body, response) + +`error` event emitted in case of protocol error (like `ENOTFOUND` etc.) or status error (4xx or 5xx). The second argument is the body of the server response in case of status error. The third argument is response object. + +#### got.get(url, [options]) +#### got.post(url, [options]) +#### got.put(url, [options]) +#### got.patch(url, [options]) +#### got.head(url, [options]) +#### got.delete(url, [options]) + +Sets `options.method` to the method name and makes a request. + + +## Errors + +Each error contains (if available) `statusCode`, `statusMessage`, `host`, `hostname`, `method` and `path` properties to make debugging easier. + +In Promise mode, the `response` is attached to the error. + +#### got.RequestError + +When a request fails. Contains a `code` property with error class code, like `ECONNREFUSED`. + +#### got.ReadError + +When reading from response stream fails. + +#### got.ParseError + +When `json` option is enabled and `JSON.parse` fails. + +#### got.HTTPError + +When server response code is not 2xx. Contains `statusCode` and `statusMessage`. + +#### got.MaxRedirectsError + +When server redirects you more than 10 times. + + +## Proxies + +You can use the [`tunnel`](https://github.com/koichik/node-tunnel) module with the `agent` option to work with proxies: + +```js +const got = require('got'); +const tunnel = require('tunnel'); + +got('todomvc.com', { + agent: tunnel.httpOverHttp({ + proxy: { + host: 'localhost' + } + }) +}); +``` + + +## Cookies + +You can use the [`cookie`](https://github.com/jshttp/cookie) module to include cookies in a request: + +```js +const got = require('got'); +const cookie = require('cookie'); + +got('google.com', { + headers: { + cookie: cookie.serialize('foo', 'bar') + } +}); +``` + + +## Form data + +You can use the [`form-data`](https://github.com/form-data/form-data) module to create POST request with form data: + +```js +const fs = require('fs'); +const got = require('got'); +const FormData = require('form-data'); +const form = new FormData(); + +form.append('my_file', fs.createReadStream('/foo/bar.jpg')); + +got.post('google.com', { + body: form +}); +``` + + +## OAuth + +You can use the [`oauth-1.0a`](https://github.com/ddo/oauth-1.0a) module to create a signed OAuth request: + +```js +const got = require('got'); +const crypto = require('crypto'); +const OAuth = require('oauth-1.0a'); + +const oauth = OAuth({ + consumer: { + key: process.env.CONSUMER_KEY, + secret: process.env.CONSUMER_SECRET + }, + signature_method: 'HMAC-SHA1', + hash_function: (baseString, key) => crypto.createHmac('sha1', key).update(baseString).digest('base64') +}); + +const token = { + key: process.env.ACCESS_TOKEN, + secret: process.env.ACCESS_TOKEN_SECRET +}; + +const url = 'https://api.twitter.com/1.1/statuses/home_timeline.json'; + +got(url, { + headers: oauth.toHeader(oauth.authorize({url, method: 'GET'}, token)), + json: true +}); +``` + + +## Unix Domain Sockets + +Requests can also be sent via [unix domain sockets](http://serverfault.com/questions/124517/whats-the-difference-between-unix-socket-and-tcp-ip-socket). Use the following URL scheme: `PROTOCOL://unix:SOCKET:PATH`. + +- `PROTOCOL` - `http` or `https` *(optional)* +- `SOCKET` - absolute path to a unix domain socket, e.g. `/var/run/docker.sock` +- `PATH` - request path, e.g. `/v2/keys` + +```js +got('http://unix:/var/run/docker.sock:/containers/json'); + +// or without protocol (http by default) +got('unix:/var/run/docker.sock:/containers/json'); +``` + + +## Tip + +It's a good idea to set the `'user-agent'` header so the provider can more easily see how their resource is used. By default, it's the URL to this repo. + +```js +const got = require('got'); +const pkg = require('./package.json'); + +got('todomvc.com', { + headers: { + 'user-agent': `my-module/${pkg.version} (https://github.com/username/my-module)` + } +}); +``` + + +## Related + +- [gh-got](https://github.com/sindresorhus/gh-got) - Convenience wrapper for interacting with the GitHub API +- [travis-got](https://github.com/samverschueren/travis-got) - Convenience wrapper for interacting with the Travis API + + +## Created by + +[![Sindre Sorhus](https://avatars.githubusercontent.com/u/170270?v=3&s=100)](https://sindresorhus.com) | [![Vsevolod Strukchinsky](https://avatars.githubusercontent.com/u/365089?v=3&s=100)](https://github.com/floatdrop) +---|--- +[Sindre Sorhus](https://sindresorhus.com) | [Vsevolod Strukchinsky](https://github.com/floatdrop) + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) |