README.md
  1  agent-base
  2  ==========
  3  ### Turn a function into an [`http.Agent`][http.Agent] instance
  4  [![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI)
  5  
  6  This module provides an `http.Agent` generator. That is, you pass it an async
  7  callback function, and it returns a new `http.Agent` instance that will invoke the
  8  given callback function when sending outbound HTTP requests.
  9  
 10  #### Some subclasses:
 11  
 12  Here's some more interesting uses of `agent-base`.
 13  Send a pull request to list yours!
 14  
 15   * [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints
 16   * [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints
 17   * [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS
 18   * [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS
 19  
 20  
 21  Installation
 22  ------------
 23  
 24  Install with `npm`:
 25  
 26  ``` bash
 27  $ npm install agent-base
 28  ```
 29  
 30  
 31  Example
 32  -------
 33  
 34  Here's a minimal example that creates a new `net.Socket` connection to the server
 35  for every HTTP request (i.e. the equivalent of `agent: false` option):
 36  
 37  ```js
 38  var net = require('net');
 39  var tls = require('tls');
 40  var url = require('url');
 41  var http = require('http');
 42  var agent = require('agent-base');
 43  
 44  var endpoint = 'http://nodejs.org/api/';
 45  var parsed = url.parse(endpoint);
 46  
 47  // This is the important part!
 48  parsed.agent = agent(function (req, opts) {
 49    var socket;
 50    // `secureEndpoint` is true when using the https module
 51    if (opts.secureEndpoint) {
 52      socket = tls.connect(opts);
 53    } else {
 54      socket = net.connect(opts);
 55    }
 56    return socket;
 57  });
 58  
 59  // Everything else works just like normal...
 60  http.get(parsed, function (res) {
 61    console.log('"response" event!', res.headers);
 62    res.pipe(process.stdout);
 63  });
 64  ```
 65  
 66  Returning a Promise or using an `async` function is also supported:
 67  
 68  ```js
 69  agent(async function (req, opts) {
 70    await sleep(1000);
 71    // etc…
 72  });
 73  ```
 74  
 75  Return another `http.Agent` instance to "pass through" the responsibility
 76  for that HTTP request to that agent:
 77  
 78  ```js
 79  agent(function (req, opts) {
 80    return opts.secureEndpoint ? https.globalAgent : http.globalAgent;
 81  });
 82  ```
 83  
 84  
 85  API
 86  ---
 87  
 88  ## Agent(Function callback[, Object options]) → [http.Agent][]
 89  
 90  Creates a base `http.Agent` that will execute the callback function `callback`
 91  for every HTTP request that it is used as the `agent` for. The callback function
 92  is responsible for creating a `stream.Duplex` instance of some kind that will be
 93  used as the underlying socket in the HTTP request.
 94  
 95  The `options` object accepts the following properties:
 96  
 97    * `timeout` - Number - Timeout for the `callback()` function in milliseconds. Defaults to Infinity (optional).
 98  
 99  The callback function should have the following signature:
100  
101  ### callback(http.ClientRequest req, Object options, Function cb) → undefined
102  
103  The ClientRequest `req` can be accessed to read request headers and
104  and the path, etc. The `options` object contains the options passed
105  to the `http.request()`/`https.request()` function call, and is formatted
106  to be directly passed to `net.connect()`/`tls.connect()`, or however
107  else you want a Socket to be created. Pass the created socket to
108  the callback function `cb` once created, and the HTTP request will
109  continue to proceed.
110  
111  If the `https` module is used to invoke the HTTP request, then the
112  `secureEndpoint` property on `options` _will be set to `true`_.
113  
114  
115  License
116  -------
117  
118  (The MIT License)
119  
120  Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net>
121  
122  Permission is hereby granted, free of charge, to any person obtaining
123  a copy of this software and associated documentation files (the
124  'Software'), to deal in the Software without restriction, including
125  without limitation the rights to use, copy, modify, merge, publish,
126  distribute, sublicense, and/or sell copies of the Software, and to
127  permit persons to whom the Software is furnished to do so, subject to
128  the following conditions:
129  
130  The above copyright notice and this permission notice shall be
131  included in all copies or substantial portions of the Software.
132  
133  THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
134  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
135  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
136  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
137  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
138  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
139  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
140  
141  [http-proxy-agent]: https://github.com/TooTallNate/node-http-proxy-agent
142  [https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent
143  [pac-proxy-agent]: https://github.com/TooTallNate/node-pac-proxy-agent
144  [socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent
145  [http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent