[d24f17c] | 1 | ## Follow Redirects
|
---|
| 2 |
|
---|
| 3 | Drop-in replacement for Node's `http` and `https` modules that automatically follows redirects.
|
---|
| 4 |
|
---|
| 5 | [](https://www.npmjs.com/package/follow-redirects)
|
---|
| 6 | [](https://github.com/follow-redirects/follow-redirects/actions)
|
---|
| 7 | [](https://coveralls.io/r/follow-redirects/follow-redirects?branch=master)
|
---|
| 8 | [](https://www.npmjs.com/package/follow-redirects)
|
---|
| 9 | [](https://github.com/sponsors/RubenVerborgh)
|
---|
| 10 |
|
---|
| 11 | `follow-redirects` provides [request](https://nodejs.org/api/http.html#http_http_request_options_callback) and [get](https://nodejs.org/api/http.html#http_http_get_options_callback)
|
---|
| 12 | methods that behave identically to those found on the native [http](https://nodejs.org/api/http.html#http_http_request_options_callback) and [https](https://nodejs.org/api/https.html#https_https_request_options_callback)
|
---|
| 13 | modules, with the exception that they will seamlessly follow redirects.
|
---|
| 14 |
|
---|
| 15 | ```javascript
|
---|
| 16 | const { http, https } = require('follow-redirects');
|
---|
| 17 |
|
---|
| 18 | http.get('http://bit.ly/900913', response => {
|
---|
| 19 | response.on('data', chunk => {
|
---|
| 20 | console.log(chunk);
|
---|
| 21 | });
|
---|
| 22 | }).on('error', err => {
|
---|
| 23 | console.error(err);
|
---|
| 24 | });
|
---|
| 25 | ```
|
---|
| 26 |
|
---|
| 27 | You can inspect the final redirected URL through the `responseUrl` property on the `response`.
|
---|
| 28 | If no redirection happened, `responseUrl` is the original request URL.
|
---|
| 29 |
|
---|
| 30 | ```javascript
|
---|
| 31 | const request = https.request({
|
---|
| 32 | host: 'bitly.com',
|
---|
| 33 | path: '/UHfDGO',
|
---|
| 34 | }, response => {
|
---|
| 35 | console.log(response.responseUrl);
|
---|
| 36 | // 'http://duckduckgo.com/robots.txt'
|
---|
| 37 | });
|
---|
| 38 | request.end();
|
---|
| 39 | ```
|
---|
| 40 |
|
---|
| 41 | ## Options
|
---|
| 42 | ### Global options
|
---|
| 43 | Global options are set directly on the `follow-redirects` module:
|
---|
| 44 |
|
---|
| 45 | ```javascript
|
---|
| 46 | const followRedirects = require('follow-redirects');
|
---|
| 47 | followRedirects.maxRedirects = 10;
|
---|
| 48 | followRedirects.maxBodyLength = 20 * 1024 * 1024; // 20 MB
|
---|
| 49 | ```
|
---|
| 50 |
|
---|
| 51 | The following global options are supported:
|
---|
| 52 |
|
---|
| 53 | - `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.
|
---|
| 54 |
|
---|
| 55 | - `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.
|
---|
| 56 |
|
---|
| 57 | ### Per-request options
|
---|
| 58 | Per-request options are set by passing an `options` object:
|
---|
| 59 |
|
---|
| 60 | ```javascript
|
---|
| 61 | const url = require('url');
|
---|
| 62 | const { http, https } = require('follow-redirects');
|
---|
| 63 |
|
---|
| 64 | const options = url.parse('http://bit.ly/900913');
|
---|
| 65 | options.maxRedirects = 10;
|
---|
| 66 | options.beforeRedirect = (options, response, request) => {
|
---|
| 67 | // Use this to adjust the request options upon redirecting,
|
---|
| 68 | // to inspect the latest response headers,
|
---|
| 69 | // or to cancel the request by throwing an error
|
---|
| 70 |
|
---|
| 71 | // response.headers = the redirect response headers
|
---|
| 72 | // response.statusCode = the redirect response code (eg. 301, 307, etc.)
|
---|
| 73 |
|
---|
| 74 | // request.url = the requested URL that resulted in a redirect
|
---|
| 75 | // request.headers = the headers in the request that resulted in a redirect
|
---|
| 76 | // request.method = the method of the request that resulted in a redirect
|
---|
| 77 | if (options.hostname === "example.com") {
|
---|
| 78 | options.auth = "user:password";
|
---|
| 79 | }
|
---|
| 80 | };
|
---|
| 81 | http.request(options);
|
---|
| 82 | ```
|
---|
| 83 |
|
---|
| 84 | In addition to the [standard HTTP](https://nodejs.org/api/http.html#http_http_request_options_callback) and [HTTPS options](https://nodejs.org/api/https.html#https_https_request_options_callback),
|
---|
| 85 | the following per-request options are supported:
|
---|
| 86 | - `followRedirects` (default: `true`) – whether redirects should be followed.
|
---|
| 87 |
|
---|
| 88 | - `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.
|
---|
| 89 |
|
---|
| 90 | - `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.
|
---|
| 91 |
|
---|
| 92 | - `beforeRedirect` (default: `undefined`) – optionally change the request `options` on redirects, or abort the request by throwing an error.
|
---|
| 93 |
|
---|
| 94 | - `agents` (default: `undefined`) – sets the `agent` option per protocol, since HTTP and HTTPS use different agents. Example value: `{ http: new http.Agent(), https: new https.Agent() }`
|
---|
| 95 |
|
---|
| 96 | - `trackRedirects` (default: `false`) – whether to store the redirected response details into the `redirects` array on the response object.
|
---|
| 97 |
|
---|
| 98 |
|
---|
| 99 | ### Advanced usage
|
---|
| 100 | By default, `follow-redirects` will use the Node.js default implementations
|
---|
| 101 | of [`http`](https://nodejs.org/api/http.html)
|
---|
| 102 | and [`https`](https://nodejs.org/api/https.html).
|
---|
| 103 | To enable features such as caching and/or intermediate request tracking,
|
---|
| 104 | you might instead want to wrap `follow-redirects` around custom protocol implementations:
|
---|
| 105 |
|
---|
| 106 | ```javascript
|
---|
| 107 | const { http, https } = require('follow-redirects').wrap({
|
---|
| 108 | http: require('your-custom-http'),
|
---|
| 109 | https: require('your-custom-https'),
|
---|
| 110 | });
|
---|
| 111 | ```
|
---|
| 112 |
|
---|
| 113 | Such custom protocols only need an implementation of the `request` method.
|
---|
| 114 |
|
---|
| 115 | ## Browser Usage
|
---|
| 116 |
|
---|
| 117 | Due to the way the browser works,
|
---|
| 118 | the `http` and `https` browser equivalents perform redirects by default.
|
---|
| 119 |
|
---|
| 120 | By requiring `follow-redirects` this way:
|
---|
| 121 | ```javascript
|
---|
| 122 | const http = require('follow-redirects/http');
|
---|
| 123 | const https = require('follow-redirects/https');
|
---|
| 124 | ```
|
---|
| 125 | you can easily tell webpack and friends to replace
|
---|
| 126 | `follow-redirect` by the built-in versions:
|
---|
| 127 |
|
---|
| 128 | ```json
|
---|
| 129 | {
|
---|
| 130 | "follow-redirects/http" : "http",
|
---|
| 131 | "follow-redirects/https" : "https"
|
---|
| 132 | }
|
---|
| 133 | ```
|
---|
| 134 |
|
---|
| 135 | ## Contributing
|
---|
| 136 |
|
---|
| 137 | Pull Requests are always welcome. Please [file an issue](https://github.com/follow-redirects/follow-redirects/issues)
|
---|
| 138 | detailing your proposal before you invest your valuable time. Additional features and bug fixes should be accompanied
|
---|
| 139 | by tests. You can run the test suite locally with a simple `npm test` command.
|
---|
| 140 |
|
---|
| 141 | ## Debug Logging
|
---|
| 142 |
|
---|
| 143 | `follow-redirects` uses the excellent [debug](https://www.npmjs.com/package/debug) for logging. To turn on logging
|
---|
| 144 | set the environment variable `DEBUG=follow-redirects` for debug output from just this module. When running the test
|
---|
| 145 | suite it is sometimes advantageous to set `DEBUG=*` to see output from the express server as well.
|
---|
| 146 |
|
---|
| 147 | ## Authors
|
---|
| 148 |
|
---|
| 149 | - [Ruben Verborgh](https://ruben.verborgh.org/)
|
---|
| 150 | - [Olivier Lalonde](mailto:olalonde@gmail.com)
|
---|
| 151 | - [James Talmage](mailto:james@talmage.io)
|
---|
| 152 |
|
---|
| 153 | ## License
|
---|
| 154 |
|
---|
| 155 | [MIT License](https://github.com/follow-redirects/follow-redirects/blob/master/LICENSE)
|
---|