|
|
import axios from 'axios'; |
|
|
import dns from 'dns'; |
|
|
import http from 'http'; |
|
|
import https from 'https'; |
|
|
import config from '../config/config.js'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function customLookup(hostname, options, callback) { |
|
|
dns.lookup(hostname, { ...options, family: 4 }, (err4, address4, family4) => { |
|
|
if (!err4 && address4) { |
|
|
return callback(null, address4, family4); |
|
|
} |
|
|
dns.lookup(hostname, { ...options, family: 6 }, (err6, address6, family6) => { |
|
|
if (!err6 && address6) { |
|
|
return callback(null, address6, family6); |
|
|
} |
|
|
callback(err4 || err6); |
|
|
}); |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
const httpAgent = new http.Agent({ |
|
|
lookup: customLookup, |
|
|
keepAlive: true |
|
|
}); |
|
|
|
|
|
const httpsAgent = new https.Agent({ |
|
|
lookup: customLookup, |
|
|
keepAlive: true |
|
|
}); |
|
|
|
|
|
|
|
|
function buildProxyConfig() { |
|
|
if (!config.proxy) return false; |
|
|
try { |
|
|
const proxyUrl = new URL(config.proxy); |
|
|
return { |
|
|
protocol: proxyUrl.protocol.replace(':', ''), |
|
|
host: proxyUrl.hostname, |
|
|
port: parseInt(proxyUrl.port, 10) |
|
|
}; |
|
|
} catch { |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export function buildAxiosRequestConfig({ method = 'POST', url, headers, data = null, timeout = config.timeout }) { |
|
|
const axiosConfig = { |
|
|
method, |
|
|
url, |
|
|
headers, |
|
|
timeout, |
|
|
httpAgent, |
|
|
httpsAgent, |
|
|
proxy: buildProxyConfig() |
|
|
}; |
|
|
|
|
|
if (data !== null) axiosConfig.data = data; |
|
|
return axiosConfig; |
|
|
} |
|
|
|
|
|
|
|
|
export async function httpRequest(configOverrides) { |
|
|
const axiosConfig = buildAxiosRequestConfig(configOverrides); |
|
|
return axios(axiosConfig); |
|
|
} |
|
|
|
|
|
|
|
|
export async function httpStreamRequest(configOverrides) { |
|
|
const axiosConfig = buildAxiosRequestConfig(configOverrides); |
|
|
axiosConfig.responseType = 'stream'; |
|
|
return axios(axiosConfig); |
|
|
} |
|
|
|