Got
Human-friendly and powerful HTTP request library for Node.js
...Hook functions may be async and are run serially. Got will make no further changes to the request before it is sent. This is especially useful in conjunction with got.extend() when you want to create an API client that, for example, uses HMAC-signing. You can override the request function by returning a ClientRequest-like instance or a IncomingMessage-like instance. This is very useful when creating a custom cache mechanism. The response object will typically be a Node.js HTTP response stream, however, if returned from the cache it will be a response-like object which behaves in the same way.