You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
5.7 KiB

4 years ago
  1. ## Follow Redirects
  2. Drop-in replacement for Node's `http` and `https` modules that automatically follows redirects.
  3. [![npm version](https://img.shields.io/npm/v/follow-redirects.svg)](https://www.npmjs.com/package/follow-redirects)
  4. [![Build Status](https://travis-ci.org/follow-redirects/follow-redirects.svg?branch=master)](https://travis-ci.org/follow-redirects/follow-redirects)
  5. [![Coverage Status](https://coveralls.io/repos/follow-redirects/follow-redirects/badge.svg?branch=master)](https://coveralls.io/r/follow-redirects/follow-redirects?branch=master)
  6. [![npm downloads](https://img.shields.io/npm/dm/follow-redirects.svg)](https://www.npmjs.com/package/follow-redirects)
  7. `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)
  8. 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)
  9. modules, with the exception that they will seamlessly follow redirects.
  10. ```javascript
  11. const { http, https } = require('follow-redirects');
  12. http.get('http://bit.ly/900913', response => {
  13. response.on('data', chunk => {
  14. console.log(chunk);
  15. });
  16. }).on('error', err => {
  17. console.error(err);
  18. });
  19. ```
  20. You can inspect the final redirected URL through the `responseUrl` property on the `response`.
  21. If no redirection happened, `responseUrl` is the original request URL.
  22. ```javascript
  23. https.request({
  24. host: 'bitly.com',
  25. path: '/UHfDGO',
  26. }, response => {
  27. console.log(response.responseUrl);
  28. // 'http://duckduckgo.com/robots.txt'
  29. });
  30. ```
  31. ## Options
  32. ### Global options
  33. Global options are set directly on the `follow-redirects` module:
  34. ```javascript
  35. const followRedirects = require('follow-redirects');
  36. followRedirects.maxRedirects = 10;
  37. followRedirects.maxBodyLength = 20 * 1024 * 1024; // 20 MB
  38. ```
  39. The following global options are supported:
  40. - `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.
  41. - `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.
  42. ### Per-request options
  43. Per-request options are set by passing an `options` object:
  44. ```javascript
  45. const url = require('url');
  46. const { http, https } = require('follow-redirects');
  47. const options = url.parse('http://bit.ly/900913');
  48. options.maxRedirects = 10;
  49. options.beforeRedirect = options => {
  50. // Use this function to adjust the options upon redirecting,
  51. // or to cancel the request by throwing an error
  52. if (options.hostname === "example.com") {
  53. options.auth = "user:password";
  54. }
  55. };
  56. http.request(options);
  57. ```
  58. 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),
  59. the following per-request options are supported:
  60. - `followRedirects` (default: `true`) – whether redirects should be followed.
  61. - `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted.
  62. - `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted.
  63. - `beforeRedirect` (default: `undefined`) – optionally change the request `options` on redirects, or abort the request by throwing an error.
  64. - `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() }`
  65. - `trackRedirects` (default: `false`) – whether to store the redirected response details into the `redirects` array on the response object.
  66. ### Advanced usage
  67. By default, `follow-redirects` will use the Node.js default implementations
  68. of [`http`](https://nodejs.org/api/http.html)
  69. and [`https`](https://nodejs.org/api/https.html).
  70. To enable features such as caching and/or intermediate request tracking,
  71. you might instead want to wrap `follow-redirects` around custom protocol implementations:
  72. ```javascript
  73. const { http, https } = require('follow-redirects').wrap({
  74. http: require('your-custom-http'),
  75. https: require('your-custom-https'),
  76. });
  77. ```
  78. Such custom protocols only need an implementation of the `request` method.
  79. ## Browser Usage
  80. Due to the way the browser works,
  81. the `http` and `https` browser equivalents perform redirects by default.
  82. By requiring `follow-redirects` this way:
  83. ```javascript
  84. const http = require('follow-redirects/http');
  85. const https = require('follow-redirects/https');
  86. ```
  87. you can easily tell webpack and friends to replace
  88. `follow-redirect` by the built-in versions:
  89. ```json
  90. {
  91. "follow-redirects/http" : "http",
  92. "follow-redirects/https" : "https"
  93. }
  94. ```
  95. ## Contributing
  96. Pull Requests are always welcome. Please [file an issue](https://github.com/follow-redirects/follow-redirects/issues)
  97. detailing your proposal before you invest your valuable time. Additional features and bug fixes should be accompanied
  98. by tests. You can run the test suite locally with a simple `npm test` command.
  99. ## Debug Logging
  100. `follow-redirects` uses the excellent [debug](https://www.npmjs.com/package/debug) for logging. To turn on logging
  101. set the environment variable `DEBUG=follow-redirects` for debug output from just this module. When running the test
  102. suite it is sometimes advantageous to set `DEBUG=*` to see output from the express server as well.
  103. ## Authors
  104. - [Ruben Verborgh](https://ruben.verborgh.org/)
  105. - Olivier Lalonde (olalonde@gmail.com)
  106. - James Talmage (james@talmage.io)
  107. ## License
  108. [MIT License](https://github.com/follow-redirects/follow-redirects/blob/master/LICENSE)