ProxyHttpAgent
A factory to create http proxy agent! Based on the tunnel module! To use a proxy through modules like http and https or node-fetch!
It support https => (http, https) and http => (http, https). (proxy => server) ! Either the proxy is http and either it will go as a tunnel for http! Or a tunnel for https through the CONNECT method!
Or the proxy will be https! And direct forwarding will go!
Install
npm install proxy-http-agent --save
The name start with proxy and make the accent on https agent to highlight that it's https.Agent
Creating the agent
let agent = getProxyHttpAgent ( options ) ;
const { getProxyHttpAgent } = require ( ' proxy-http-agent ' ) ;
let proxyUrl =
process . env . HTTP_PROXY ||
process . env . http_proxy ||
` http://localhost : ${ proxyPort } ` ;
let agent = getProxyHttpAgent ( {
proxy : proxyUrl ,
rejectUnauthorized : false
} ) ;
Also the module is build by typescript! It support typescript too out of the box!
import { getProxyHttpAgent } = from ' proxy-http-agent ' ;
import https from ' https ' ;
let proxyUrl =
process . env . HTTP_PROXY ||
process . env . http_proxy ||
` http://localhost:${proxyPort} ` ;
let agent : https . Agent = getProxyHttpAgent ( {
proxy : proxyUrl ,
rejectUnauthorized : false
} ) ;
Options
In the core the options are the direct options of http.Agent
and https.Agent
and tunnel module factories options
Check the node-tunnel repo here
https://github.com/koichik/node-tunnel/
Plus our extra options:
proxy (IProxyOptions | IProxyHttpsOptions | string)
(Obligatory)
interface IProxyOptions {
host : string ;
port : number ;
protocol ? : ' http: ' | ' https: ' ;
localAddress ? : string ;
proxyAuth ? : string ;
headers ? : { [ key : string ] : any } ;
}
interface IHttpsProxyOptions extends IProxyOptions {
ca ? : Buffer [ ] ;
servername ? : string ;
key ? : Buffer ;
cert ? : Buffer ;
}
string: the proxy url
endServerProtocol ('http:' | 'https:')
(optional) default: 'https:'
Typescript HttpsAgent, HttpAgent types
For typescript you can also get directly https.Agent type from this module as follow
import { getProxyHttpAgent , HttpsAgent , HttpAgent } = from ' proxy-http-agent ' ;
let proxyUrl =
process . env . HTTP_PROXY ||
process . env . http_proxy ||
` http://localhost:${proxyPort} ` ;
let agent : HttpsAgent = getProxyHttpAgent ( {
proxy : proxyUrl ,
rejectUnauthorized : false
} ) ;
We do expose and export it too.
Usage with node-fetch and http.get
From the test files here some nice examples
https end server
(default is https)
Fetch
let proxyUrl =
process . env . HTTP_PROXY ||
process . env . http_proxy ||
` http://localhost:${proxyPort} ` ;
let agent = getProxyHttpAgent ( {
proxy : proxyUrl ,
rejectUnauthorized : false
} ) ;
try {
console . log ( ( ' fetch :::: :: :: :: : ' ) )
const response = await fetch ( ` https://localhost : ${ localApiHttpsServerPort } ` , {
method : ' GET ' ,
agent
} ) ;
console . log ( ' "response !!!!!!!!!!!!" ' )
if ( response . status === 200 ) {
const data = await response . json ( ) ;
console . log ( data )
if ( data ) {
expect ( data . host ) . toEqual ( ` localhost: ${ localApiHttpsServerPort } ` ) ;
} else {
fail ( new Error ( ' No data from local server! ' ) ) ;
}
}
} catch ( err ) {
fail ( err ) ;
}
http.get
let proxyUrl =
process . env . HTTP_PROXY ||
process . env . http_proxy ||
` http://localhost:${proxyPort} ` ;
let agent = getProxyHttpAgent ( {
proxy : proxyUrl
} ) ;
const opts : any = url . parse ( ` https://api.binance.com/api/v3/ping ` ) ;
delete opts . port ;
opts . agent = agent ;
let req = https . get ( opts , function ( res ) {
let data : any = ' ' ;
res . setEncoding ( ' utf8 ' ) ;
res . on ( ' data ' , function ( b ) {
console . log ( ' ::::::::::::::::::::::::::::::::::::://///> ' )
console . log ( ' DATA :::: ' )
data += b ;
} ) ;
res . on ( ' end ' , function ( ) {
console . log ( ' RESPONSE END :::::::::::////> ' )
data = JSON . parse ( data ) ;
console . log ( data )
expect ( data ) . toEqual ( { } ) ;
done ( ) ;
} ) ;
} ) ;
req . once ( ' error ' , done ) ;
end server http
let proxyUrl =
process . env . HTTP_PROXY ||
process . env . http_proxy ||
` http://localhost:${proxyPort} ` ;
let agent = getProxyHttpAgent ( {
proxy : proxyUrl ,
endServerProtocol : ' http: '
} ) ;
try {
console . log ( " Fetch ::::> " )
const response = await fetch ( ` http://localhost : ${ localApiServerPort } ` , {
method : ' GET ' ,
agent
} ) ;
console . log ( ' response :::::::::////> ' )
if ( response . status === 200 ) {
const data = await response . json ( ) ;
if ( data ) {
expect ( data . host ) . toEqual ( ` localhost: ${ localApiServerPort } ` ) ;
} else {
fail ( new Error ( ' No data from local server! ' ) ) ;
}
}
} catch ( err ) {
fail ( err ) ;
}