Global HTTP/HTTPS proxy agent configurable using environment variables.

Overview

global-agent

GitSpo Mentions Travis build status Coveralls NPM version Canonical Code Style Twitter Follow

Global HTTP/HTTPS proxy configurable using environment variables.

Usage

Setup proxy using global-agent/bootstrap

To configure HTTP proxy:

  1. Import global-agent/bootstrap.
  2. Export HTTP proxy address as GLOBAL_AGENT_HTTP_PROXY environment variable.

Code:

import 'global-agent/bootstrap';

// or:
// import {bootstrap} from 'global-agent';
// bootstrap();

Bash:

$ export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8080

Alternatively, you can preload module using Node.js --require, -r configuration, e.g.

$ export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8080
$ node -r 'global-agent/bootstrap' your-script.js

Setup proxy using bootstrap routine

Instead of importing a self-initialising script with side-effects as demonstrated in the setup proxy using global-agent/bootstrap documentation, you can import bootstrap routine and explicitly evaluate the bootstrap logic, e.g.

import {
  bootstrap
} from 'global-agent';

bootstrap();

This is useful if you need to conditionally bootstrap global-agent, e.g.

import {
  bootstrap
} from 'global-agent';
import globalTunnel from 'global-tunnel-ng';

const MAJOR_NODEJS_VERSION = parseInt(process.version.slice(1).split('.')[0], 10);

if (MAJOR_NODEJS_VERSION >= 10) {
  // `global-agent` works with Node.js v10 and above.
  bootstrap();
} else {
  // `global-tunnel-ng` works only with Node.js v10 and below.
  globalTunnel.initialize();
}

Setup proxy using createGlobalProxyAgent

If you do not want to use global.GLOBAL_AGENT variable, then you can use createGlobalProxyAgent to instantiate a controlled instance of global-agent, e.g.

import {
  createGlobalProxyAgent
} from 'global-agent';

const globalProxyAgent = createGlobalProxyAgent();

Unlike bootstrap routine, createGlobalProxyAgent factory does not create global.GLOBAL_AGENT variable and does not guard against multiple initializations of global-agent. The result object of createGlobalProxyAgent is equivalent to global.GLOBAL_AGENT.

Runtime configuration

global-agent/bootstrap script copies process.env.GLOBAL_AGENT_HTTP_PROXY value to global.GLOBAL_AGENT.HTTP_PROXY and continues to use the latter variable.

You can override the global.GLOBAL_AGENT.HTTP_PROXY value at runtime to change proxy behaviour, e.g.

http.get('http://127.0.0.1:8000');

global.GLOBAL_AGENT.HTTP_PROXY = 'http://127.0.0.1:8001';

http.get('http://127.0.0.1:8000');

global.GLOBAL_AGENT.HTTP_PROXY = 'http://127.0.0.1:8002';

The first HTTP request is going to use http://127.0.0.1:8001 proxy and the secord request is going to use http://127.0.0.1:8002.

All global-agent configuration is available under global.GLOBAL_AGENT namespace.

Exclude URLs

The GLOBAL_AGENT_NO_PROXY environment variable specifies a pattern of URLs that should be excluded from proxying. GLOBAL_AGENT_NO_PROXY value is a comma-separated list of domain names. Asterisks can be used as wildcards, e.g.

export GLOBAL_AGENT_NO_PROXY='*.foo.com,baz.com'

says to contact all machines with the 'foo.com' TLD and 'baz.com' domains directly.

Separate proxy for HTTPS

The environment variable GLOBAL_AGENT_HTTPS_PROXY can be set to specify a separate proxy for HTTPS requests. When this variable is not set GLOBAL_AGENT_HTTP_PROXY is used for both HTTP and HTTPS requests.

Enable logging

global-agent is using roarr logger to log HTTP requests and response (HTTP status code and headers), e.g.

{"context":{"program":"global-agent","namespace":"Agent","logLevel":10,"destination":"http://gajus.com","proxy":"http://127.0.0.1:8076"},"message":"proxying request","sequence":1,"time":1556269669663,"version":"1.0.0"}
{"context":{"program":"global-agent","namespace":"Agent","logLevel":10,"headers":{"content-type":"text/plain","content-length":"2","date":"Fri, 26 Apr 2019 12:07:50 GMT","connection":"close"},"requestId":6,"statusCode":200},"message":"proxying response","sequence":2,"time":1557133856955,"version":"1.0.0"}

Export ROARR_LOG=true environment variable to enable log printing to stdout.

Use roarr-cli program to pretty-print the logs.

API

createGlobalProxyAgent

/**
 * @property environmentVariableNamespace Defines namespace of `HTTP_PROXY`, `HTTPS_PROXY` and `NO_PROXY` environment variables. (Default: `GLOBAL_AGENT_`)
 * @property forceGlobalAgent Forces to use `global-agent` HTTP(S) agent even when request was explicitly constructed with another agent. (Default: `true`)
 * @property socketConnectionTimeout Destroys socket if connection is not established within the timeout. (Default: `60000`)
 */
type ProxyAgentConfigurationInputType = {|
  +environmentVariableNamespace?: string,
  +forceGlobalAgent?: boolean,
  +socketConnectionTimeout?: number,
|};

(configurationInput: ProxyAgentConfigurationInputType) => ProxyAgentConfigurationType;

Environment variables

Name Description Default
GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE Defines namespace of HTTP_PROXY, HTTPS_PROXY and NO_PROXY environment variables. GLOBAL_AGENT_
GLOBAL_AGENT_FORCE_GLOBAL_AGENT Forces to use global-agent HTTP(S) agent even when request was explicitly constructed with another agent. true
GLOBAL_AGENT_SOCKET_CONNECTION_TIMEOUT Destroys socket if connection is not established within the timeout. 60000
${NAMESPACE}_HTTP_PROXY Sets the initial proxy controller HTTP_PROXY value. N/A
${NAMESPACE}_HTTPS_PROXY Sets the initial proxy controller HTTPS_PROXY value. N/A
${NAMESPACE}_NO_PROXY Sets the initial proxy controller NO_PROXY value. N/A

global.GLOBAL_AGENT

global.GLOBAL_AGENT is initialized by bootstrap routine.

global.GLOBAL_AGENT has the following properties:

Name Description Configurable
HTTP_PROXY Yes Sets HTTP proxy to use.
HTTPS_PROXY Yes Sets a distinct proxy to use for HTTPS requests.
NO_PROXY Yes Specifies a pattern of URLs that should be excluded from proxying. See Exclude URLs.

Supported libraries

global-agent works with all libraries that internally use http.request.

global-agent has been tested to work with:

FAQ

What is the reason global-agent overrides explicitly configured HTTP(S) agent?

By default, global-agent overrides agent property of any HTTP request, even if agent property was explicitly set when constructing a HTTP request. This behaviour allows to intercept requests of libraries that use a custom instance of an agent per default (e.g. Stripe SDK uses an http(s).globalAgent instance pre-configured with keepAlive: true).

This behaviour can be disabled with GLOBAL_AGENT_FORCE_GLOBAL_AGENT=false environment variable. When disabled, then global-agent will only set agent property when it is not already defined or if agent is an instance of http(s).globalAgent.

What is the reason global-agent/bootstrap does not use HTTP_PROXY?

Some libraries (e.g. request) change their behaviour when HTTP_PROXY environment variable is present. Using a namespaced environment variable prevents conflicting library behaviour.

You can override this behaviour by configuring GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE variable, e.g.

$ export GLOBAL_AGENT_ENVIRONMENT_VARIABLE_NAMESPACE=

Now script initialized using global-agent/bootstrap will use HTTP_PROXY, HTTPS_PROXY and NO_PROXY environment variables.

What is the difference from global-tunnel and tunnel?

global-tunnel (including global-tunnel-ng and tunnel) are designed to support legacy Node.js versions. They use various workarounds and rely on monkey-patching http.request, http.get, https.request and https.get methods.

In contrast, global-agent supports Node.js v10 and above, and does not implements workarounds for the older Node.js versions.

Comments
  • Enforce that all HTTP requests always use the global agent

    Enforce that all HTTP requests always use the global agent

    Some libraries (e.g. Stripe) provide their own default agent, which has to be explicitly overridden.

    To do this nicely, I'd like to override that agent with the exact same agent that global-agent is using, but that's not always available. If you're using Node >= v11.7.0 it's exposed as {http,https}.globalAgent, but in older Node versions it only exists as part of the binding of the http/https methods.

    This PR exposes the agents as part of the global configuration, so that they can be retrieved as global.GLOBAL_AGENT.HTTP_PROXY_AGENT and global.GLOBAL_AGENT.HTTPS_PROXY_AGENT.

    released 
    opened by pimterry 14
  • Web socket proxying does not work with Node.js v11 and above

    Web socket proxying does not work with Node.js v11 and above

    When using node version v12.4.0 I get the following error when initiating a connection:

    [...]\node_modules\global-agent\dist\classes\Agent.js:32
        if (!this.isProxyConfigured()) {
                  ^
    
    TypeError: this.isProxyConfigured is not a function
    

    Using node v10.16.0 seems to work as expected. I'm running a super minimal node script (I could share if helpful) and use global-agent via "node -r" option.

    I know very little about node and this project, so please let me know if a) the newer node is supported at all b) I can supply any other information to be helpful with this issue.

    Best regards, Tyrius

    enhancement question 
    opened by TheTyrius 9
  • set tls.rejectUnauthorized option as true by default (#25)

    set tls.rejectUnauthorized option as true by default (#25)

    cf. comment here: https://github.com/gajus/global-agent/issues/25#issuecomment-643307475

    the option will be reset to "false" if "NODE_TLS_REJECT_UNAUTHORIZED=0" environment variable is present (here: https://github.com/gajus/global-agent/blob/master/src/classes/Agent.js#L161 ) But we need to be sure it will be set to "true" otherwise.

    enhancement 
    opened by ballinette 8
  • no https proxy support?

    no https proxy support?

    I can only use a non TLS proxy, otherwise I get the following error:

    UnexpectedStateError: Unsupported `GLOBAL_AGENT.HTTP_PROXY` configuration value: URL protocol must be "http:"
    

    However, who in 2020 uses a proxy via http? We can't expect companies to use an unencrypted proxy in their network, can we?

    Can someone please explain to me how I can use a https or socks proxy with node?

    question 
    opened by tessus 7
  • Aborts with TypeError on socket.setTimeout

    Aborts with TypeError on socket.setTimeout

    Just started using global-agent and it works as expected with my local proxy if I only do a small amount of request. But as soon as the program does more requests (say > 20), it runs into a typeerror every time:

    C:\Users\cklingb\home\proj\iparts-db-builder\node_modules\global-agent\dist\classes\Agent.js:96
          socket.setTimeout(this.socketConnectionTimeout, () => {
                 ^
    TypeError: Cannot read property 'setTimeout' of undefined
      at C:\Users\cklingb\home\proj\iparts-db-builder\node_modules\←[4mglobal-agent←[24m\dist\classes\Agent.js:96:14
      at Socket.<anonymous> (C:\Users\cklingb\home\proj\iparts-db-builder\node_modules\←[4mglobal-agent←[24m\dist\classes\HttpsProxyAgent.js:28:7)
      at Socket.emit (events.js:210:5)
      at emitErrorNT (internal/streams/destroy.js:91:8)
      at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
      at processTicksAndRejections (internal/process/task_queues.js:80:21)
    

    I don't know what I'm doing wrong, since all works fine when doing just a few connections / working without any proxy. Just guessing: Could it be related to #2 ?

    help wanted 
    opened by cjk 6
  • Respect options.host not only options.hostname

    Respect options.host not only options.hostname

    It seems that global-agent only respects options.hostname. But node.js reference says that options.hostname is an alias of options.host. https://nodejs.org/docs/latest-v10.x/api/http.html#http_http_request_options_callback Proxy is not used in the following code.

    const http = require('http');
    require('global-agent/bootstrap');
    global.GLOBAL_AGENT.HTTP_PROXY = 'http://127.0.0.1:8080';
    const options = {
      host: 'some.host.com'
    };
    http.get(options, res => {
      console.log(res.statusCode, res.headers);
    });
    
    bug help wanted released 
    opened by wcho 6
  • Unanticipated logging

    Unanticipated logging

    global-agent is part of renovate and then renovate is required as part of another project I have, that runs within Docker. Somehow the logs are full of global-agent logs, e.g.

    server_1  | {"context":{"program":"global-agent","namespace":"Agent","logLevel":10,"destination":"https://index.docker.io/v2/"},"message":"not proxying request; GLOBAL_AGENT.HTTP_PROXY is not configured","sequence":39,"time":1565889150617,"version":"1.0.0"}
    

    I definitely haven't set ROARR_LOG=true and I even tried setting ROARR_LOG=false but that also didn't disable them. Any idea how this can be turned off? Seems like a bug though, unless I'm mistaken.

    FYI my tool uses bunyan for its logs, not sure if that has anything to do with it.

    released 
    opened by rarkins 5
  • Provided options to configure ca certificates to the global-agent

    Provided options to configure ca certificates to the global-agent

    Provided options to configue ca certificate to the global-agent

    1. ca certificates can be set while initiating global-agent (using to constructor)
    2. ca certificate can be set/reset after initiation of global-agent (using methods)
    opened by vipendra-mehra 4
  • cannot send client certificate to the endpoint while using the proxy

    cannot send client certificate to the endpoint while using the proxy

    Hi.

    We have an nodejs application that need to authenticate to an API endpoint with a SSL client certificate. For that need, we inject tls.connect() options such as key and cert to the request options, as documented here : https://nodejs.org/docs/latest-v12.x/api/https.html#https_https_request_url_options_callback

    It works like expected without proxy, but while using a proxy with global-agent lib, these options are not propagated to the final request.

    We should add these attributes within createConnection method here to fix that: https://github.com/gajus/global-agent/blob/master/src/classes/HttpsProxyAgent.js#L31

    released 
    opened by ballinette 4
  • Fails with Axios & request if used with HTTP_PROXY

    Fails with Axios & request if used with HTTP_PROXY

    My application needs to work in an environment with HTTP_PROXY set, and I need to be able to proxy traffic from Axios, and from raw node.js HTTP.

    Unfortunately, it seems that global-agent current breaks in this case: when proxying, libraries that do support HTTP proxies end up sending requests like CONNECT http://proxy-address:8000https://target-address:443, instead of the expected CONNECT https://target-address:443.

    I've seen your comment with a little background about this, which makes sense, but doesn't solve cases like mine (which I think are fairly common - in any environment using a proxy globally, you'll normally have these variables defined).

    Do you have any ideas about how to resolve this? I'd like to do so without wiping out the HTTP_PROXY variables if possible, since I'd still like those to be inherited correctly by subprocesses etc.

    Notably global-tunnel-ng does successfully handle this, for both Axios & request, so it's clearly possible, but I'm not exactly sure why quite yet.

    opened by pimterry 4
  • Support traditional HTTP_PROXY, HTTPS_PROXY, NO_PROXY

    Support traditional HTTP_PROXY, HTTPS_PROXY, NO_PROXY

    It would be ideal if users could use global-agent in environments where users already use the traditional environment variables for proxy. Wouldn't it be safe to detect both the traditional as well as custom variables, with the custom ones taking precedence if both are present?

    question 
    opened by rarkins 4
  • fix: do not proxy traffic to sockets

    fix: do not proxy traffic to sockets

    This commit implements a proxy-exception for traffic targeting local sockets instead of a "host:port" combination. If such traffic would be forwarded through the proxy, the socket destination info would be lost, while a "localhost:80" destination would be added. This means that the proxy cannot handle such requests correctly either way, which makes sending traffic to the proxy pointless.

    Because of that, if the agent receives traffic destined for a socket, it will simply use the fallback agent to handle that traffic.

    Fixes #59.

    opened by tommyknows 0
  • Do not proxy traffic to sockets

    Do not proxy traffic to sockets

    First off, thanks a lot for this library!

    I am currently facing an issue where I have an application that has two different types of connections:

    • "normal" HTTP connections to some upstream servers
    • TCP HTTP traffic to local sockets, e.g. /var/run/...

    The first type of traffic works as expected, however for Socket traffic things get weird. global-agent redirects / routes that traffic through the proxy, and because HTTP requests to sockets do not have a host or port set, something will set localhost:80 as the destination. Now the proxy obviously does not know what to do with it, because the socket-info is lost.

    I'm opening this issue because I wanted to ask if it would be possible to add an exception for socket traffic. For example, the easiest solution would be to simply add the following code here:

        if (configuration.socketPath) {
            log.trace({
                destination: request.socketPath,
            }, 'not proxying request; destination is a socket');
    
            this.fallbackAgent.addRequest(request, configuration);
            return ;
        }
    

    This could also be made configurable through an option, I guess, though because traffic sent to the proxy is "useless" (no / wrong destination attached), I don't see why an option for this could be useful (YMMV 😉)

    I'd be happy to open a PR for this, but wanted to get an opinion first.

    Thanks!

    opened by tommyknows 0
  • docs: fix table heading for GLOBAL_AGENT properties

    docs: fix table heading for GLOBAL_AGENT properties

    It looks like for some reason the "Configurable" and "Description" headings were somehow swapped in the table describing global.GLOBAL_AGENT object's properties. This PR swaps them to the correct order.

    opened by itsananderson 0
  • Would You Be Open to Supporting the Lowercase Proxy Environment Variables?

    Would You Be Open to Supporting the Lowercase Proxy Environment Variables?

    Most tools respect both the lowercase and uppercase proxy environment variables, and I was almost bitten by the fact that global agent didn't read the lowercase variables that I had set.

    Would you be open to a PR for supporting the lowercase versions?

    And thanks for this package!

    opened by zicklag 0
  • Can't make a simple request using node's https

    Can't make a simple request using node's https

    This is my code:

    import https from 'https';
    import 'global-agent/bootstrap';
    
    // https://docs.aws.amazon.com/general/latest/gr/pol.html
    
    const options = {
      hostname: 'docs.aws.amazon.com',
      port: 443,
      path: '/general/latest/gr/pol.html',
      method: 'GET',
    };
    
    const req = https.request(options, res => {
      console.log(`statusCode: ${res.statusCode}`);
    
      res.on('data', d => {
        process.stdout.write(d);
      });
    });
    
    req.on('error', error => {
      console.error(error);
    });
    
    req.end();
    

    Which I run as:

    $ GLOBAL_AGENT_HTTPS_PROXY='https://127.0.0.1:8000' npx ts-node get-regions.ts
    

    And I get an error:

    /projects/custom/hfl/composer/node_modules/global-agent/src/utilities/parseProxyUrl.js:22
        throw new UnexpectedStateError('Unsupported `GLOBAL_AGENT.HTTP_PROXY` configuration value: URL protocol must be "http:".');
              ^
    UnexpectedStateError: Unsupported `GLOBAL_AGENT.HTTP_PROXY` configuration value: URL protocol must be "http:".
        at parseProxyUrl (/projects/custom/hfl/composer/node_modules/global-agent/src/utilities/parseProxyUrl.js:22:11)
        at BoundHttpsProxyAgent.getUrlProxy (/projects/custom/hfl/composer/node_modules/global-agent/src/factories/createGlobalProxyAgent.js:117:14)
        at BoundHttpsProxyAgent.addRequest (/projects/custom/hfl/composer/node_modules/global-agent/src/classes/Agent.js:90:24)
        at new ClientRequest (node:_http_client:305:16)
        at originalMethod (node:https:353:10)
        at Object.request (/projects/custom/hfl/composer/node_modules/global-agent/src/utilities/bindHttpMethod.js:51:14)
        at Object.<anonymous> (/projects/custom/hfl/composer/get-regions.ts:13:19)
        at Module._compile (node:internal/modules/cjs/loader:1103:14)
        at Module.m._compile (/projects/custom/hfl/composer/node_modules/ts-node/src/index.ts:1455:23)
        at Module._extensions..js (node:internal/modules/cjs/loader:1155:10) {
      code: 'UNEXPECTED_STATE_ERROR'
    }
    

    Node version: 16.14.0 OS: Linux And it doesn't matter do I have a running proxy or not - the error is triggered before.

    opened by OnkelTem 0
Releases(v3.0.0)
Owner
Gajus Kuizinas
Software architect. Passionate about JavaScript, React, GraphQL, Redux. Active open-source contributor.
Gajus Kuizinas
The official proxy of Titanium Network with enhanced support for a large majority of sites with hCAPTCHA support. Successor to Alloy Proxy.

Corrosion Titanium Networks main web proxy. Successor to Alloy Installation: npm i corrosion Example: const Corrosion = require('corrosion'); const p

Titanium Network 79 Dec 21, 2022
A full-featured http proxy for node.js

node-http-proxy node-http-proxy is an HTTP programmable proxying library that supports websockets. It is suitable for implementing components such as

http ... PARTY! 13.1k Jan 3, 2023
Full-featured, middleware-oriented, programmatic HTTP and WebSocket proxy for node.js

rocky A multipurpose, full-featured, middleware-oriented and hackable HTTP/S and WebSocket proxy with powerful built-in features such as versatile rou

Tom 370 Nov 24, 2022
Node.js web server framework for Http/1.1 or Http/2

Node.js web server framework for Http/1.1 or Http/2 Description: This is http framework, you can use it to create Http/1.1 or Http/2 service。 Now let'

Jeremy Yu 10 Mar 24, 2022
Build a fake backend by providing the content of JSON files or JavaScript objects through configurable routes.

http-fake-backend Build a fake backend by providing the content of JSON files or JavaScript objects through configurable routes. It actually can serve

Micromata GmbH 279 Dec 11, 2022
Highly sophisticated proxy used for evading internet censorship or accessing websites in a controlled sandbox using the power of service-workers and more! Easy deployment version (Node.js)

Ultraviolet-Node The deployable version of Ultraviolet, a highly sophisticated proxy used for evading internet censorship or accessing websites in a c

Titanium Network 27 Jan 2, 2023
Highly sophisticated proxy used for evading internet censorship or accessing websites in a controlled sandbox using the power of service-workers and more! Easy deployment version (Node.js)

Ultraviolet-Node The deployable version of Ultraviolet, a highly sophisticated proxy used for evading internet censorship or accessing websites in a c

Titanium Network 34 Apr 15, 2022
A proxy web app that serves ABC iView content outside of the iView webplayer, avoiding intrusive data harvesting.

iview-proxy A proxy web app that serves ABC iView content outside of the iView webplayer, avoiding intrusive data harvesting. There's also a cool Andr

The OpenGov Australia Project 11 Jul 16, 2022
DSC-AlarmServer - Creates web interface to DSC/Envisalink with proxy.

DSC-AlarmServer Creates web interface to DSC/Envisalink with proxy. Since the Envisalink module can only have one connection, this phython script can

null 4 Oct 11, 2022
Simple proxy that is intended to support on chaos testing.

Proxy with Behavior Proxy with Behavior is a node application that work as a reverse proxy, and enables apply some behaviors to be executed in request

José Carlos de Moraes Filho 7 Jan 28, 2022
Prefect API Authentication/Authorization Proxy for on-premises deployments

Proxy Authorization Service for Prefect UI and Prefect CLI Prefect is a great platform for building data flows/pipelines. It supports hybrid execution

Softrams 20 Dec 10, 2022
wabac.js CORS Proxy

wabac.js CORS Proxy This provides a simple CORS proxy, which is designed to run as a Cloudflare Worker. This system is compatible with wabac.js-based

Webrecorder 3 Mar 8, 2022
Promise based HTTP client for the browser and node.js

axios Promise based HTTP client for the browser and node.js New axios docs website: click here Table of Contents Features Browser Support Installing E

axios 98k Dec 31, 2022
🏊🏾 Simplified HTTP request client.

Deprecated! As of Feb 11th 2020, request is fully deprecated. No new changes are expected to land. In fact, none have landed for some time. For more i

request 25.6k Jan 4, 2023
Ajax for Node.js and browsers (JS HTTP client)

superagent Small progressive client-side HTTP request library, and Node.js module with the same API, supporting many high-level HTTP client features T

Sloth 16.2k Jan 1, 2023
HTTP server mocking and expectations library for Node.js

Nock HTTP server mocking and expectations library for Node.js Nock can be used to test modules that perform HTTP requests in isolation. For instance,

Nock 11.9k Jan 3, 2023
🌐 Human-friendly and powerful HTTP request library for Node.js

Sindre's open source work is supported by the community. Special thanks to: Human-friendly and powerful HTTP request library for Node.js Moving from R

Sindre Sorhus 12.5k Jan 9, 2023
make streaming http requests

hyperquest treat http requests as a streaming transport The hyperquest api is a subset of request. This module works in the browser with browserify. r

James Halliday 711 Sep 8, 2022
HTTP Client Utilities

@hapi/wreck HTTP client utilities. wreck is part of the hapi ecosystem and was designed to work seamlessly with the hapi web framework and its other c

hapi.js 383 Nov 1, 2022