This module provides an http.Agent implementation that connects to a specified
HTTP, HTTPS and SOCKS proxy server, and can be used with the built-in https module.
Specifically, this Agent implementation connects to an intermediary "proxy"
server and issues the CONNECT HTTP method, which tells the proxy to
open a direct TCP connection to the destination server.
Since this agent implements the CONNECT HTTP method, it also works with other protocols that use this method when connecting over proxies (i.e. WebSockets).
It can also be used in conjunction with the ws module to establish a WebSocket
connection over a SOCKS proxy.
See the "Examples" section below for more.
Install with npm:
npm i @sam01101/node-proxy-agentimportfetchfrom"node-fetch";import{HttpsProxyAgent}from'@sam01101/node-proxy-agent';(async()=>{// HTTP/HTTPS proxy to connect toconstproxy=process.env.http_proxy||'http://168.63.76.32:3128';console.log('using proxy server %j',proxy);// HTTPS endpoint for the proxy to connect toconstendpoint=process.argv[2]||'https://one.one.one.one/cdn-cgi/trace';console.log('attempting to GET %j',endpoint);constresponse=awaitfetch(endpoint,{// create an instance of the `HttpsProxyAgent` class with the proxy server informationagent: newHttpsProxyAgent(proxy,{// Note: options is empty but reserved for backward compatibilitylookup: (hostname,options,callback)=>{console.log(`Lookup ${hostname}`);returncallback(null,'1.1.1.1',4);}})});console.log(`HTTP Status: ${response.status} OK: ${response.ok}`);})();importfetchfrom"node-fetch";import{HttpsProxyAgent}from'@sam01101/node-proxy-agent';(async()=>{// HTTP/HTTPS proxy to connect toconstproxy=process.env.http_proxy||'http://168.63.76.32:3128';console.log('using proxy server %j',proxy);// HTTPS endpoint for the proxy to connect toconstendpoint=process.argv[2]||'https://graph.facebook.com/tootallnate';console.log('attempting to GET %j',endpoint);constresponse=awaitfetch(endpoint,{// create an instance of the `HttpsProxyAgent` class with the proxy server informationagent: newHttpsProxyAgent(proxy)});console.log(`HTTP Status: ${response.status} OK: ${response.ok}`);})();varurl=require('url');varWebSocket=require('ws');varHttpsProxyAgent=require('@sam01101/node-proxy-agent');// HTTP/HTTPS proxy to connect tovarproxy=process.env.http_proxy||'http://168.63.76.32:3128';console.log('using proxy server %j',proxy);// WebSocket endpoint for the proxy to connect tovarendpoint=process.argv[2]||'ws://echo.websocket.org';varparsed=url.parse(endpoint);console.log('attempting to connect to WebSocket %j',endpoint);// create an instance of the `HttpsProxyAgent` class with the proxy server informationvaroptions=url.parse(proxy);varagent=newHttpsProxyAgent(options);// finally, initiate the WebSocket connectionvarsocket=newWebSocket(endpoint,{agent: agent});socket.on('open',function(){console.log('"open" event!');socket.send('hello world');});socket.on('message',function(data,flags){console.log('"message" event! %j %j',data,flags);socket.close();});importhttpsfrom'https';import{SocksProxyAgent}from'@sam01101/node-proxy-agent';constinfo={hostname: 'br41.nordvpn.com',userId: 'your-name@gmail.com',password: 'abcdef12345124'};constagent=newSocksProxyAgent(info);https.get('https://ipinfo.io',{agent},(res)=>{console.log(res.headers);res.pipe(process.stdout);});varurl=require('url');varhttp=require('http');var{ SocksProxyAgent }=require('@sam01101/node-proxy-agent');// SOCKS proxy to connect tovarproxy=process.env.socks_proxy||'socks://127.0.0.1:1080';console.log('using proxy server %j',proxy);// HTTP endpoint for the proxy to connect tovarendpoint=process.argv[2]||'http://nodejs.org/api/';console.log('attempting to GET %j',endpoint);varopts=url.parse(endpoint);// create an instance of the `SocksProxyAgent` class with the proxy server informationvaragent=newSocksProxyAgent(proxy);opts.agent=agent;http.get(opts,function(res){console.log('"response" event!',res.headers);res.pipe(process.stdout);});varurl=require('url');varhttps=require('https');var{ SocksProxyAgent }=require('@sam01101/node-proxy-agent');// SOCKS proxy to connect tovarproxy=process.env.socks_proxy||'socks://127.0.0.1:1080';console.log('using proxy server %j',proxy);// HTTP endpoint for the proxy to connect tovarendpoint=process.argv[2]||'https://encrypted.google.com/';console.log('attempting to GET %j',endpoint);varopts=url.parse(endpoint);// create an instance of the `SocksProxyAgent` class with the proxy server informationvaragent=newSocksProxyAgent(proxy);opts.agent=agent;https.get(opts,function(res){console.log('"response" event!',res.headers);res.pipe(process.stdout);});varWebSocket=require('ws');var{ SocksProxyAgent }=require('@sam01101/node-proxy-agent');// SOCKS proxy to connect tovarproxy=process.env.socks_proxy||'socks://127.0.0.1:1080';console.log('using proxy server %j',proxy);// WebSocket endpoint for the proxy to connect tovarendpoint=process.argv[2]||'ws://echo.websocket.org';console.log('attempting to connect to WebSocket %j',endpoint);// create an instance of the `SocksProxyAgent` class with the proxy server informationvaragent=newSocksProxyAgent(proxy);// initiate the WebSocket connectionvarsocket=newWebSocket(endpoint,{agent: agent});socket.on('open',function(){console.log('"open" event!');socket.send('hello world');});socket.on('message',function(data,flags){console.log('"message" event! %j %j',data,flags);socket.close();});The HttpsProxyAgent class implements an http.Agent subclass that connects
to the specified "HTTP(s) proxy server" in order to proxy HTTPS and/or WebSocket
requests. This is achieved by using the HTTP CONNECT method.
The options argument may either be a string URI of the proxy server to use, or an
"options" object with more specific properties:
hostname- String - Proxy host to connect to. Required.port- Number - Proxy port to connect to. Required.protocol- String - Ifhttps:, then use TLS to connect to the proxy.headers- Object - Additional HTTP headers to be sent on the HTTP CONNECT method.timeout- Number - Timeout in milliseconds for the CONNECT method.tls-tls.SecureContextOptions- TLS configuration options.auth- String - Basic Proxy Authentication for the proxy.- You can use
usernameandpasswordinstead ofauth, it will be converted toauth. - Any other options given are passed to the
net.connect()/tls.connect()functions.
The SocksProxyAgent class implements an http.Agent subclass that connects
to the specified "SOCKS proxy server" in order to proxy HTTPS and/or WebSocket
requests.
The options argument may either be a string URI of the proxy server to use, or an
"options" object with more specific properties:
hostname- String - Proxy host to connect to. Required.port- Number - Proxy port to connect to. Required.protocol- String - Same asHttpsProxyAgent.type- Number - SOCKS version to use. Defaults to 5.tls-tls.ConnectionOptions- TLS options to use for the SOCKS connection.timeout- Number - Timeout in milliseconds for the CONNECT method.username- String - Username for the SOCKS proxy.password- String - Password for the SOCKS proxy.- You can use
authinstead ofusernameandpassword, it will auto set theusernameandpasswordproperties. - Any other options given are passed to the
net.connect()/tls.connect()functions.