pax_global_header 0000666 0000000 0000000 00000000064 14243473520 0014516 g ustar 00root root 0000000 0000000 52 comment=5e17bb748c260b02e4cf716c2f4079a1c6a7481e
got-11.8.5/ 0000775 0000000 0000000 00000000000 14243473520 0012403 5 ustar 00root root 0000000 0000000 got-11.8.5/.editorconfig 0000664 0000000 0000000 00000000257 14243473520 0015064 0 ustar 00root root 0000000 0000000 root = true
[*]
indent_style = tab
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.yml]
indent_style = space
indent_size = 2
got-11.8.5/.gitattributes 0000664 0000000 0000000 00000000037 14243473520 0015276 0 ustar 00root root 0000000 0000000 * text=auto eol=lf
*.ai binary
got-11.8.5/.github/ 0000775 0000000 0000000 00000000000 14243473520 0013743 5 ustar 00root root 0000000 0000000 got-11.8.5/.github/ISSUE_TEMPLATE/ 0000775 0000000 0000000 00000000000 14243473520 0016126 5 ustar 00root root 0000000 0000000 got-11.8.5/.github/ISSUE_TEMPLATE/1-bug-report.md 0000664 0000000 0000000 00000001334 14243473520 0020675 0 ustar 00root root 0000000 0000000 ---
name: "🐞 Bug report"
about: Something is not working as it should
---
#### Describe the bug
- Node.js version:
- OS & version:
#### Actual behavior
...
#### Expected behavior
...
#### Code to reproduce
```js
...
```
#### Checklist
- [ ] I have read the documentation.
- [ ] I have tried my code with the latest version of Node.js and Got.
got-11.8.5/.github/ISSUE_TEMPLATE/2-feature-request.md 0000664 0000000 0000000 00000000567 14243473520 0021740 0 ustar 00root root 0000000 0000000 ---
name: "⭐ Feature request"
about: Suggest an idea for Got
---
#### What problem are you trying to solve?
...
#### Describe the feature
...
#### Checklist
- [ ] I have read the documentation and made sure this feature doesn't already exist.
got-11.8.5/.github/ISSUE_TEMPLATE/3-question.md 0000664 0000000 0000000 00000000263 14243473520 0020460 0 ustar 00root root 0000000 0000000 ---
name: "❓ Question"
about: Something is unclear or needs to be discussed
---
#### What would you like to discuss?
...
#### Checklist
- [ ] I have read the documentation.
got-11.8.5/.github/PULL_REQUEST_TEMPLATE.md 0000664 0000000 0000000 00000000374 14243473520 0017550 0 ustar 00root root 0000000 0000000 #### Checklist
- [ ] I have read the documentation.
- [ ] I have included a pull request description of my changes.
- [ ] I have included some tests.
- [ ] If it's a new feature, I have included documentation updates in both the README and the types.
got-11.8.5/.github/funding.yml 0000664 0000000 0000000 00000000064 14243473520 0016120 0 ustar 00root root 0000000 0000000 github: [sindresorhus, szmarczak]
tidelift: npm/got
got-11.8.5/.github/security.md 0000664 0000000 0000000 00000000263 14243473520 0016135 0 ustar 00root root 0000000 0000000 # Security Policy
To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.
got-11.8.5/.gitignore 0000664 0000000 0000000 00000000061 14243473520 0014370 0 ustar 00root root 0000000 0000000 node_modules
yarn.lock
coverage
.nyc_output
dist
got-11.8.5/.npmrc 0000664 0000000 0000000 00000000023 14243473520 0013516 0 ustar 00root root 0000000 0000000 package-lock=false
got-11.8.5/.travis.yml 0000664 0000000 0000000 00000001370 14243473520 0014515 0 ustar 00root root 0000000 0000000 language: node_js
after_success:
- './node_modules/.bin/nyc report --reporter=text-lcov | ./node_modules/.bin/coveralls'
jobs:
include:
- os: linux
dist: focal
node_js: '14'
- os: linux
dist: focal
node_js: '12'
- os: linux
dist: focal
node_js: '10'
- os: linux
dist: bionic
node_js: '14'
- os: linux
dist: bionic
node_js: '12'
- os: linux
dist: bionic
node_js: '10'
- os: windows
node_js: '14'
- os: windows
node_js: '12'
- os: windows
node_js: '10'
- os: osx
osx_image: xcode12
node_js: '14'
- os: osx
osx_image: xcode12
node_js: '12'
- os: osx
osx_image: xcode12
node_js: '10'
got-11.8.5/benchmark/ 0000775 0000000 0000000 00000000000 14243473520 0014335 5 ustar 00root root 0000000 0000000 got-11.8.5/benchmark/index.ts 0000664 0000000 0000000 00000011662 14243473520 0016022 0 ustar 00root root 0000000 0000000 'use strict';
import {URL} from 'url';
import https = require('https');
import axios from 'axios';
import Benchmark = require('benchmark');
import fetch from 'node-fetch';
import request = require('request');
import got from '../source';
import Request, {kIsNormalizedAlready} from '../source/core';
const {normalizeArguments} = Request;
// Configuration
const httpsAgent = new https.Agent({
keepAlive: true,
rejectUnauthorized: false
});
const url = new URL('https://127.0.0.1:8080');
const urlString = url.toString();
const gotOptions = {
agent: {
https: httpsAgent
},
https: {
rejectUnauthorized: false
},
retry: 0
};
const normalizedGotOptions = normalizeArguments(url, gotOptions);
normalizedGotOptions[kIsNormalizedAlready] = true;
const requestOptions = {
strictSSL: false,
agent: httpsAgent
};
const fetchOptions = {
agent: httpsAgent
};
const axiosOptions = {
url: urlString,
httpsAgent,
https: {
rejectUnauthorized: false
}
};
const axiosStreamOptions: typeof axiosOptions & {responseType: 'stream'} = {
...axiosOptions,
responseType: 'stream'
};
const httpsOptions = {
https: {
rejectUnauthorized: false
},
agent: httpsAgent
};
const suite = new Benchmark.Suite();
// Benchmarking
suite.add('got - promise', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
await got(url, gotOptions);
deferred.resolve();
}
}).add('got - stream', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
got.stream(url, gotOptions).resume().once('end', () => {
deferred.resolve();
});
}
}).add('got - core', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
const stream = new Request(url, gotOptions);
stream.resume().once('end', () => {
deferred.resolve();
});
}
}).add('got - core - normalized options', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
const stream = new Request(undefined as any, normalizedGotOptions);
stream.resume().once('end', () => {
deferred.resolve();
});
}
}).add('request - callback', {
defer: true,
fn: (deferred: {resolve: () => void}) => {
request(urlString, requestOptions, (error: Error) => {
if (error) {
throw error;
}
deferred.resolve();
});
}
}).add('request - stream', {
defer: true,
fn: (deferred: {resolve: () => void}) => {
const stream = request(urlString, requestOptions);
stream.resume();
stream.once('end', () => {
deferred.resolve();
});
}
}).add('node-fetch - promise', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
const response = await fetch(url, fetchOptions);
await response.text();
deferred.resolve();
}
}).add('node-fetch - stream', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
const {body} = await fetch(url, fetchOptions);
body.resume();
body.once('end', () => {
deferred.resolve();
});
}
}).add('axios - promise', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
await axios.request(axiosOptions);
deferred.resolve();
}
}).add('axios - stream', {
defer: true,
fn: async (deferred: {resolve: () => void}) => {
const {data} = await axios.request(axiosStreamOptions);
data.resume();
data.once('end', () => {
deferred.resolve();
});
}
}).add('https - stream', {
defer: true,
fn: (deferred: {resolve: () => void}) => {
https.request(urlString, httpsOptions, response => {
response.resume();
response.once('end', () => {
deferred.resolve();
});
}).end();
}
}).on('cycle', (event: Benchmark.Event) => {
console.log(String(event.target));
}).on('complete', function (this: any) {
console.log(`Fastest is ${this.filter('fastest').map('name') as string}`);
internalBenchmark();
}).run();
const internalBenchmark = (): void => {
console.log();
const internalSuite = new Benchmark.Suite();
internalSuite.add('got - normalize options', {
fn: () => {
normalizeArguments(url, gotOptions);
}
}).on('cycle', (event: Benchmark.Event) => {
console.log(String(event.target));
});
internalSuite.run();
};
// Results (i7-7700k, CPU governor: performance):
// got - promise x 3,003 ops/sec ±6.26% (70 runs sampled)
// got - stream x 3,538 ops/sec ±5.86% (67 runs sampled)
// got - core x 5,828 ops/sec ±3.11% (79 runs sampled)
// got - core - normalized options x 7,596 ops/sec ±1.60% (85 runs sampled)
// request - callback x 6,530 ops/sec ±6.84% (72 runs sampled)
// request - stream x 7,348 ops/sec ±3.62% (78 runs sampled)
// node-fetch - promise x 6,284 ops/sec ±5.50% (76 runs sampled)
// node-fetch - stream x 7,746 ops/sec ±3.32% (80 runs sampled)
// axios - promise x 6,301 ops/sec ±6.24% (77 runs sampled)
// axios - stream x 8,605 ops/sec ±2.73% (87 runs sampled)
// https - stream x 10,477 ops/sec ±3.64% (80 runs sampled)
// Fastest is https - stream
// got - normalize options x 90,974 ops/sec ±0.57% (93 runs sampled)
got-11.8.5/benchmark/server.ts 0000664 0000000 0000000 00000000713 14243473520 0016214 0 ustar 00root root 0000000 0000000 import {AddressInfo} from 'net';
import https = require('https');
// @ts-expect-error No types
import createCert = require('create-cert');
(async () => {
const keys = await createCert({days: 365, commonName: 'localhost'});
const server = https.createServer(keys, (_request, response) => {
response.end('ok');
}).listen(8080, () => {
const {port} = server.address() as AddressInfo;
console.log(`Listening at https://localhost:${port}`);
});
})();
got-11.8.5/documentation/ 0000775 0000000 0000000 00000000000 14243473520 0015254 5 ustar 00root root 0000000 0000000 got-11.8.5/documentation/advanced-creation.md 0000664 0000000 0000000 00000006735 14243473520 0021160 0 ustar 00root root 0000000 0000000 # Advanced creation
> Make calling REST APIs easier by creating niche-specific `got` instances.
### Merging instances
Got supports composing multiple instances together. This is very powerful. You can create a client that limits download speed and then compose it with an instance that signs a request. It's like plugins without any of the plugin mess. You just create instances and then compose them together.
To mix them use `instanceA.extend(instanceB, instanceC, ...)`, that's all.
## Examples
Some examples of what kind of instances you could compose together:
#### Denying redirects that lead to other sites than specified
```js
const controlRedirects = got.extend({
handlers: [
(options, next) => {
const promiseOrStream = next(options);
return promiseOrStream.on('redirect', response => {
const host = new URL(resp.url).host;
if (options.allowedHosts && !options.allowedHosts.includes(host)) {
promiseOrStream.cancel(`Redirection to ${host} is not allowed`);
}
});
}
]
});
```
#### Limiting download & upload size
It can be useful when your machine has limited amount of memory.
```js
const limitDownloadUpload = got.extend({
handlers: [
(options, next) => {
let promiseOrStream = next(options);
if (typeof options.downloadLimit === 'number') {
promiseOrStream.on('downloadProgress', progress => {
if (progress.transferred > options.downloadLimit && progress.percent !== 1) {
promiseOrStream.cancel(`Exceeded the download limit of ${options.downloadLimit} bytes`);
}
});
}
if (typeof options.uploadLimit === 'number') {
promiseOrStream.on('uploadProgress', progress => {
if (progress.transferred > options.uploadLimit && progress.percent !== 1) {
promiseOrStream.cancel(`Exceeded the upload limit of ${options.uploadLimit} bytes`);
}
});
}
return promiseOrStream;
}
]
});
```
#### No user agent
```js
const noUserAgent = got.extend({
headers: {
'user-agent': undefined
}
});
```
#### Custom endpoint
```js
const httpbin = got.extend({
prefixUrl: 'https://httpbin.org/'
});
```
#### Signing requests
```js
const crypto = require('crypto');
const getMessageSignature = (data, secret) => crypto.createHmac('sha256', secret).update(data).digest('hex').toUpperCase();
const signRequest = got.extend({
hooks: {
beforeRequest: [
options => {
options.headers['sign'] = getMessageSignature(options.body || '', process.env.SECRET);
}
]
}
});
```
#### Putting it all together
If these instances are different modules and you don't want to rewrite them, use `got.extend(...instances)`.
**Note**: The `noUserAgent` instance must be placed at the end of chain as the instances are merged in order. Other instances do have the `user-agent` header.
```js
const merged = got.extend(controlRedirects, limitDownloadUpload, httpbin, signRequest, noUserAgent);
(async () => {
// There's no 'user-agent' header :)
await merged('/');
/* HTTP Request =>
* GET / HTTP/1.1
* accept-encoding: gzip, deflate, br
* sign: F9E66E179B6747AE54108F82F8ADE8B3C25D76FD30AFDE6C395822C530196169
* Host: httpbin.org
* Connection: close
*/
const MEGABYTE = 1048576;
await merged('https://ipv4.download.thinkbroadband.com/5MB.zip', {downloadLimit: MEGABYTE, prefixUrl: ''});
// CancelError: Exceeded the download limit of 1048576 bytes
await merged('https://jigsaw.w3.org/HTTP/300/301.html', {allowedHosts: ['google.com'], prefixUrl: ''});
// CancelError: Redirection to jigsaw.w3.org is not allowed
})();
```
got-11.8.5/documentation/examples/ 0000775 0000000 0000000 00000000000 14243473520 0017072 5 ustar 00root root 0000000 0000000 got-11.8.5/documentation/examples/gh-got.js 0000664 0000000 0000000 00000002671 14243473520 0020623 0 ustar 00root root 0000000 0000000 'use strict';
const got = require('../..');
const package = require('../../package');
const getRateLimit = (headers) => ({
limit: parseInt(headers['x-ratelimit-limit'], 10),
remaining: parseInt(headers['x-ratelimit-remaining'], 10),
reset: new Date(parseInt(headers['x-ratelimit-reset'], 10) * 1000)
});
const instance = got.extend({
prefixUrl: 'https://api.github.com',
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': `${package.name}/${package.version}`
},
responseType: 'json',
token: process.env.GITHUB_TOKEN,
handlers: [
(options, next) => {
// Authorization
if (options.token && !options.headers.authorization) {
options.headers.authorization = `token ${options.token}`;
}
// Don't touch streams
if (options.isStream) {
return next(options);
}
// Magic begins
return (async () => {
try {
const response = await next(options);
// Rate limit for the Response object
response.rateLimit = getRateLimit(response.headers);
return response;
} catch (error) {
const {response} = error;
// Nicer errors
if (response && response.body) {
error.name = 'GitHubError';
error.message = `${response.body.message} (${response.statusCode} status code)`;
}
// Rate limit for errors
if (response) {
error.rateLimit = getRateLimit(response.headers);
}
throw error;
}
})();
}
]
});
module.exports = instance;
got-11.8.5/documentation/examples/runkit-example.js 0000664 0000000 0000000 00000000373 14243473520 0022400 0 ustar 00root root 0000000 0000000 const got = require('got');
(async () => {
const issUrl = 'http://api.open-notify.org/iss-now.json';
const {iss_position: issPosition} = await got(issUrl).json();
console.log(issPosition);
//=> {latitude: '20.4956', longitude: '42.2216'}
})();
got-11.8.5/documentation/lets-make-a-plugin.md 0000664 0000000 0000000 00000015143 14243473520 0021176 0 ustar 00root root 0000000 0000000 # Let's make a plugin!
> Another example on how to use Got like a boss :electric_plug:
Okay, so you already have learned some basics. That's great!
When it comes to advanced usage, custom instances are really helpful.
For example, take a look at [`gh-got`](https://github.com/sindresorhus/gh-got).
It looks pretty complicated, but... it's really not.
Before we start, we need to find the [GitHub API docs](https://developer.github.com/v3/).
Let's write down the most important information:
1. The root endpoint is `https://api.github.com/`.
2. We will use version 3 of the API.\
The `Accept` header needs to be set to `application/vnd.github.v3+json`.
3. The body is in a JSON format.
4. We will use OAuth2 for authorization.
5. We may receive `400 Bad Request` or `422 Unprocessable Entity`.\
The body contains detailed information about the error.
6. *Pagination?* Not yet. This is going to be a native feature of Got. We'll update this page accordingly when the feature is available.
7. Rate limiting. These headers are interesting:
- `X-RateLimit-Limit`
- `X-RateLimit-Remaining`
- `X-RateLimit-Reset`
- `X-GitHub-Request-Id`
Also `X-GitHub-Request-Id` may be useful.
8. User-Agent is required.
When we have all the necessary info, we can start mixing :cake:
### The root endpoint
Not much to do here, just extend an instance and provide the `prefixUrl` option:
```js
const got = require('got');
const instance = got.extend({
prefixUrl: 'https://api.github.com'
});
module.exports = instance;
```
### v3 API
GitHub needs to know which version we are using. We'll use the `Accept` header for that:
```js
const got = require('got');
const instance = got.extend({
prefixUrl: 'https://api.github.com',
headers: {
accept: 'application/vnd.github.v3+json'
}
});
module.exports = instance;
```
### JSON body
We'll use [`options.responseType`](../readme.md#responsetype):
```js
const got = require('got');
const instance = got.extend({
prefixUrl: 'https://api.github.com',
headers: {
accept: 'application/vnd.github.v3+json'
},
responseType: 'json'
});
module.exports = instance;
```
### Authorization
It's common to set some environment variables, for example, `GITHUB_TOKEN`. You can modify the tokens in all your apps easily, right? Cool. What about... we want to provide a unique token for each app. Then we will need to create a new option - it will default to the environment variable, but you can easily override it.
Let's use handlers instead of hooks. This will make our code more readable: having `beforeRequest`, `beforeError` and `afterResponse` hooks for just a few lines of code would complicate things unnecessarily.
**Tip:** it's a good practice to use hooks when your plugin gets complicated. Try not to overload the handler function, but don't abuse hooks either.
```js
const got = require('got');
const instance = got.extend({
prefixUrl: 'https://api.github.com',
headers: {
accept: 'application/vnd.github.v3+json'
},
responseType: 'json',
token: process.env.GITHUB_TOKEN,
handlers: [
(options, next) => {
// Authorization
if (options.token && !options.headers.authorization) {
options.headers.authorization = `token ${options.token}`;
}
return next(options);
}
]
});
module.exports = instance;
```
### Errors
We should name our errors, just to know if the error is from the API response. Superb errors, here we come!
```js
...
handlers: [
(options, next) => {
// Authorization
if (options.token && !options.headers.authorization) {
options.headers.authorization = `token ${options.token}`;
}
// Don't touch streams
if (options.isStream) {
return next(options);
}
// Magic begins
return (async () => {
try {
const response = await next(options);
return response;
} catch (error) {
const {response} = error;
// Nicer errors
if (response && response.body) {
error.name = 'GitHubError';
error.message = `${response.body.message} (${response.statusCode} status code)`;
}
throw error;
}
})();
}
]
...
```
### Rate limiting
Umm... `response.headers['x-ratelimit-remaining']` doesn't look good. What about `response.rateLimit.limit` instead?
Yeah, definitely. Since `response.headers` is an object, we can easily parse these:
```js
const getRateLimit = (headers) => ({
limit: parseInt(headers['x-ratelimit-limit'], 10),
remaining: parseInt(headers['x-ratelimit-remaining'], 10),
reset: new Date(parseInt(headers['x-ratelimit-reset'], 10) * 1000)
});
getRateLimit({
'x-ratelimit-limit': '60',
'x-ratelimit-remaining': '55',
'x-ratelimit-reset': '1562852139'
});
// => {
// limit: 60,
// remaining: 55,
// reset: 2019-07-11T13:35:39.000Z
// }
```
Let's integrate it:
```js
const getRateLimit = (headers) => ({
limit: parseInt(headers['x-ratelimit-limit'], 10),
remaining: parseInt(headers['x-ratelimit-remaining'], 10),
reset: new Date(parseInt(headers['x-ratelimit-reset'], 10) * 1000)
});
...
handlers: [
(options, next) => {
// Authorization
if (options.token && !options.headers.authorization) {
options.headers.authorization = `token ${options.token}`;
}
// Don't touch streams
if (options.isStream) {
return next(options);
}
// Magic begins
return (async () => {
try {
const response = await next(options);
// Rate limit for the Response object
response.rateLimit = getRateLimit(response.headers);
return response;
} catch (error) {
const {response} = error;
// Nicer errors
if (response && response.body) {
error.name = 'GitHubError';
error.message = `${response.body.message} (${response.statusCode} status code)`;
}
// Rate limit for errors
if (response) {
error.rateLimit = getRateLimit(response.headers);
}
throw error;
}
})();
}
]
...
```
### The frosting on the cake: `User-Agent` header.
```js
const package = require('./package');
const instance = got.extend({
...
headers: {
accept: 'application/vnd.github.v3+json',
'user-agent': `${package.name}/${package.version}`
}
...
});
```
## Woah. Is that it?
Yup. View the full source code [here](examples/gh-got.js). Here's an example of how to use it:
```js
const ghGot = require('gh-got');
(async () => {
const response = await ghGot('users/sindresorhus');
const creationDate = new Date(response.created_at);
console.log(`Sindre's GitHub profile was created on ${creationDate.toGMTString()}`);
// => Sindre's GitHub profile was created on Sun, 20 Dec 2009 22:57:02 GMT
})();
```
Did you know you can mix many instances into a bigger, more powerful one? Check out the [Advanced Creation](advanced-creation.md) guide.
got-11.8.5/documentation/migration-guides.md 0000664 0000000 0000000 00000013243 14243473520 0021050 0 ustar 00root root 0000000 0000000 # Migration guides
> :star: Switching from other HTTP request libraries to Got :star:
### Migrating from Request
You may think it's too hard to switch, but it's really not. 🦄
Let's take the very first example from Request's readme:
```js
const request = require('request');
request('https://google.com', (error, response, body) => {
console.log('error:', error);
console.log('statusCode:', response && response.statusCode);
console.log('body:', body);
});
```
With Got, it is:
```js
const got = require('got');
(async () => {
try {
const response = await got('https://google.com');
console.log('statusCode:', response.statusCode);
console.log('body:', response.body);
} catch (error) {
console.log('error:', error);
}
})();
```
Looks better now, huh? 😎
#### Common options
Both Request and Got accept [`http.request` options](https://nodejs.org/api/http.html#http_http_request_options_callback).
These Got options are the same as with Request:
- [`url`](https://github.com/sindresorhus/got#url) (+ we accept [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL) instances too!)
- [`body`](https://github.com/sindresorhus/got#body)
- [`followRedirect`](https://github.com/sindresorhus/got#followRedirect)
- [`encoding`](https://github.com/sindresorhus/got#encoding)
- [`maxRedirects`](https://github.com/sindresorhus/got#maxredirects)
So if you're familiar with them, you're good to go.
Oh, and one more thing... There's no `time` option. Assume [it's always true](https://github.com/sindresorhus/got#timings).
#### Renamed options
Readability is very important to us, so we have different names for these options:
- `qs` → [`searchParams`](https://github.com/sindresorhus/got#searchParams)
- `strictSSL` → [`rejectUnauthorized`](https://github.com/sindresorhus/got#rejectUnauthorized)
- `gzip` → [`decompress`](https://github.com/sindresorhus/got#decompress)
- `jar` → [`cookieJar`](https://github.com/sindresorhus/got#cookiejar) (accepts [`tough-cookie`](https://github.com/salesforce/tough-cookie) jar)
It's more clear, isn't it?
#### Changes in behavior
The [`timeout` option](https://github.com/sindresorhus/got#timeout) has some extra features. You can [set timeouts on particular events](../readme.md#timeout)!
The [`searchParams` option](https://github.com/sindresorhus/got#searchParams) is always serialized using [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) unless it's a `string`.
To use streams, just call `got.stream(url, options)` or `got(url, {isStream: true, ...}`).
#### Breaking changes
- The `json` option is not a `boolean`, it's an `Object`. It will be stringified and used as a body.
- The `form` option is an `Object`. It can be a plain object or a [`form-data` instance](https://github.com/sindresorhus/got/#form-data).
- Got will lowercase all custom headers, even if they are specified to not be.
- No `oauth`/`hawk`/`aws`/`httpSignature` option. To sign requests, you need to create a [custom instance](advanced-creation.md#signing-requests).
- No `agentClass`/`agentOptions`/`pool` option.
- No `forever` option. You need to use [forever-agent](https://github.com/request/forever-agent).
- No `proxy` option. You need to [pass a custom agent](../readme.md#proxies).
- No `auth` option. You need to use `username` / `password` instead.
- No `baseUrl` option. Instead, there is `prefixUrl` which appends a trailing slash if not present. It will be always prepended unless `url` is an instance of URL.
- No `removeRefererHeader` option. You can remove the referer header in a [`beforeRequest` hook](https://github.com/sindresorhus/got#hooksbeforeRequest):
```js
const gotInstance = got.extend({
hooks: {
beforeRequest: [
options => {
delete options.headers.referer;
}
]
}
});
gotInstance(url, options);
```
- No `jsonReviver`/`jsonReplacer` option, but you can use `parseJson`/`stringifyJson` for that:
```js
const gotInstance = got.extend({
parseJson: text => JSON.parse(text, myJsonReviver),
stringifyJson: object => JSON.stringify(object, myJsonReplacer)
});
gotInstance(url, options);
```
Hooks are powerful, aren't they? [Read more](../readme.md#hooks) to see what else you achieve using hooks.
#### More about streams
Let's take a quick look at another example from Request's readme:
```js
http.createServer((serverRequest, serverResponse) => {
if (serverRequest.url === '/doodle.png') {
serverRequest.pipe(request('https://example.com/doodle.png')).pipe(serverResponse);
}
});
```
The cool feature here is that Request can proxy headers with the stream, but Got can do that too:
```js
const stream = require('stream');
const {promisify} = require('util');
const got = require('got');
const pipeline = promisify(stream.pipeline);
http.createServer(async (serverRequest, serverResponse) => {
if (serverRequest.url === '/doodle.png') {
// When someone makes a request to our server, we receive a body and some headers.
// These are passed to Got. Got proxies downloaded data to our server response,
// so you don't have to do `response.writeHead(statusCode, headers)` and `response.end(body)`.
// It's done automatically.
await pipeline(
got.stream('https://example.com/doodle.png'),
serverResponse
);
}
});
```
Nothing has really changed. Just remember to use `got.stream(url, options)` or `got(url, {isStream: true, …})`. That's it!
#### You're good to go!
Well, you have already come this far :tada: Take a look at the [documentation](../readme.md#highlights). It's worth the time to read it. There are [some great tips](../readme.md#aborting-the-request). If something is unclear or doesn't work as it should, don't hesitate to [open an issue](https://github.com/sindresorhus/got/issues/new/choose).
got-11.8.5/license 0000664 0000000 0000000 00000002125 14243473520 0013750 0 ustar 00root root 0000000 0000000 MIT License
Copyright (c) Sindre Sorhus (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.
got-11.8.5/media/ 0000775 0000000 0000000 00000000000 14243473520 0013462 5 ustar 00root root 0000000 0000000 got-11.8.5/media/logo.ai 0000664 0000000 0000000 00001310373 14243473520 0014745 0 ustar 00root root 0000000 0000000 %PDF-1.5
%
1 0 obj
<>/OCGs[5 0 R 27 0 R 48 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
application/pdf
got logo
Font: Hero Light
Sindre Sorhus
Adobe Illustrator CC 2014 (Macintosh)
2015-05-08T21:45:33+02:00
2015-05-08T21:49:52+02:00
2015-05-08T21:49:52+02:00
256
256
JPEG
/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A6/5888eZ7zzOn5f+QREv
mJoVudZ1q4X1LfSrV/sOU6STydY0PsSKGoVQ9v8A846eQ7qlx5tlv/N2qt8Ut9ql5cEcj19OGJ44
0Xf4VoaDviqy5/ILTdJU3X5d63qPk/Uo/jiihuJbrT5GHQT2ly0iuvyO3h2xVnvlCTzXJ5ftT5rh
tYNeUMl4ti7SW7FWKrInNVZeagNx3pirE/zF88+YI9csvInklI5POGqQm5mvZ15W2m2Ktxa6mWh5
MzfDGnc9ewZVBW3/ADjv5GuwLnzhLfecNXYVl1DVLqegY/aEUETxxxp/KtDQbVxVq5/5x98r6dW7
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
eNftD3G2ZuryRkBRa4B6TmC2OxV2KuxV/9k=
proof:pdf
uuid:65E6390686CF11DBA6E2D887CEACB407
xmp.did:9fa28b47-4c62-4038-9043-956c78b3ed20
uuid:d1e42c04-3cdb-ba4d-a392-757ab43c8ee9
xmp.iid:8371700e-157a-4940-bf59-8401dc1338a2
xmp.did:8371700e-157a-4940-bf59-8401dc1338a2
uuid:65E6390686CF11DBA6E2D887CEACB407
proof:pdf
saved
xmp.iid:16bdb7a9-88d3-420f-acce-43f9589108f5
2015-05-08T21:21:15+02:00
Adobe Illustrator CC 2014 (Macintosh)
/
saved
xmp.iid:9fa28b47-4c62-4038-9043-956c78b3ed20
2015-05-08T21:45:33+02:00
Adobe Illustrator CC 2014 (Macintosh)
/
Web
Document
1
False
False
500.000000
230.000000
Pixels
Cyan
Magenta
Yellow
Default Swatch Group
0
White
RGB
PROCESS
255
255
255
Black
RGB
PROCESS
0
0
0
RGB Red
RGB
PROCESS
255
0
0
RGB Yellow
RGB
PROCESS
255
255
0
RGB Green
RGB
PROCESS
0
255
0
RGB Cyan
RGB
PROCESS
0
255
255
RGB Blue
RGB
PROCESS
0
0
255
RGB Magenta
RGB
PROCESS
255
0
255
R=193 G=39 B=45
RGB
PROCESS
193
39
45
R=237 G=28 B=36
RGB
PROCESS
237
28
36
R=241 G=90 B=36
RGB
PROCESS
241
90
36
R=247 G=147 B=30
RGB
PROCESS
247
147
30
R=251 G=176 B=59
RGB
PROCESS
251
176
59
R=252 G=238 B=33
RGB
PROCESS
252
238
33
R=217 G=224 B=33
RGB
PROCESS
217
224
33
R=140 G=198 B=63
RGB
PROCESS
140
198
63
R=57 G=181 B=74
RGB
PROCESS
57
181
74
R=0 G=146 B=69
RGB
PROCESS
0
146
69
R=0 G=104 B=55
RGB
PROCESS
0
104
55
R=34 G=181 B=115
RGB
PROCESS
34
181
115
R=0 G=169 B=157
RGB
PROCESS
0
169
157
R=41 G=171 B=226
RGB
PROCESS
41
171
226
R=0 G=113 B=188
RGB
PROCESS
0
113
188
R=46 G=49 B=146
RGB
PROCESS
46
49
146
R=27 G=20 B=100
RGB
PROCESS
27
20
100
R=102 G=45 B=145
RGB
PROCESS
102
45
145
R=147 G=39 B=143
RGB
PROCESS
147
39
143
R=158 G=0 B=93
RGB
PROCESS
158
0
93
R=212 G=20 B=90
RGB
PROCESS
212
20
90
R=237 G=30 B=121
RGB
PROCESS
237
30
121
R=199 G=178 B=153
RGB
PROCESS
199
178
153
R=153 G=134 B=117
RGB
PROCESS
153
134
117
R=115 G=99 B=87
RGB
PROCESS
115
99
87
R=83 G=71 B=65
RGB
PROCESS
83
71
65
R=198 G=156 B=109
RGB
PROCESS
198
156
109
R=166 G=124 B=82
RGB
PROCESS
166
124
82
R=140 G=98 B=57
RGB
PROCESS
140
98
57
R=117 G=76 B=36
RGB
PROCESS
117
76
36
R=96 G=56 B=19
RGB
PROCESS
96
56
19
R=66 G=33 B=11
RGB
PROCESS
66
33
11
Grays
1
R=0 G=0 B=0
RGB
PROCESS
0
0
0
R=26 G=26 B=26
RGB
PROCESS
26
26
26
R=51 G=51 B=51
RGB
PROCESS
51
51
51
R=77 G=77 B=77
RGB
PROCESS
77
77
77
R=102 G=102 B=102
RGB
PROCESS
102
102
102
R=128 G=128 B=128
RGB
PROCESS
128
128
128
R=153 G=153 B=153
RGB
PROCESS
153
153
153
R=179 G=179 B=179
RGB
PROCESS
179
179
179
R=204 G=204 B=204
RGB
PROCESS
204
204
204
R=230 G=230 B=230
RGB
PROCESS
230
230
230
R=242 G=242 B=242
RGB
PROCESS
242
242
242
Web Color Group
1
R=63 G=169 B=245
RGB
PROCESS
63
169
245
R=122 G=201 B=67
RGB
PROCESS
122
201
67
R=255 G=147 B=30
RGB
PROCESS
255
147
30
R=255 G=29 B=37
RGB
PROCESS
255
29
37
R=255 G=123 B=172
RGB
PROCESS
255
123
172
R=189 G=204 B=212
RGB
PROCESS
189
204
212
Adobe PDF library 10.01
True
endstream
endobj
3 0 obj
<>
endobj
7 0 obj
<>/Resources<>/ExtGState<>/Properties<>>>/Thumb 54 0 R/TrimBox[0.0 0.0 500.0 230.0]/Type/Page>>
endobj
50 0 obj
<>stream
HlA7Eu
]8$R+#0@Ue hHI'5S9Yi_l_9S[M'o?n~l{IMʴn߷XUJc/Ɇ9X%LHqȣ],_։ӞuƎ]f#{ͧETu=E=ԆY&kj \Ӯ&j*,OǪcGKR)LjO ^Go˖M++dɔjVHՂP2LDҝ,*YP54Js*i6 IC;@ۃ
iC!ȅ4HZ?#Qrš6FL1*aѮN8]6WPhxAn3X'X|IȕG,H'dUzJ艠(pPi"+p 2hoXbݭE&v^Ymu'(tP k/0hM_X&qYgŧ}[WNcY
dGޱz9>|NmWKw9Y}hpc\uer