got-scraping
Version:
HTTP client made for scraping based on got.
68 lines • 2.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createResolveProtocol = void 0;
const tslib_1 = require("tslib");
const tls_1 = tslib_1.__importDefault(require("tls"));
const url_1 = require("url");
const http2_wrapper_1 = require("http2-wrapper");
const quick_lru_1 = tslib_1.__importDefault(require("quick-lru"));
const connect = async (proxyUrl, options, callback) => new Promise((resolve, reject) => {
const host = `${options.host}:${options.port}`;
(async () => {
try {
const headers = {
host,
};
const url = new url_1.URL(proxyUrl);
const username = decodeURIComponent(url.username);
const password = decodeURIComponent(url.password);
if (username || password) {
headers.authorization = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`;
headers['proxy-authorization'] = headers.authorization;
}
const request = await http2_wrapper_1.auto(url, {
method: 'CONNECT',
headers,
path: host,
rejectUnauthorized: false,
});
request.end();
request.once('connect', (response, socket, head) => {
if (response.statusCode !== 200 || head.length > 0) {
reject(new Error(`Proxy responded with ${response.statusCode}: ${head.length} bytes`));
socket.destroy();
return;
}
const tlsSocket = tls_1.default.connect({
...options,
socket,
}, callback);
resolve(tlsSocket);
});
}
catch (error) {
reject(error);
}
})();
});
const createCaches = () => ({
protocolCache: new quick_lru_1.default({ maxSize: 1000 }),
resolveAlpnQueue: new Map(),
});
const defaults = createCaches();
const createResolveProtocol = (proxyUrl, sessionData) => {
let { protocolCache, resolveAlpnQueue } = defaults;
if (sessionData) {
if (!sessionData.protocolCache || !sessionData.resolveAlpnQueue) {
Object.assign(sessionData, createCaches());
}
protocolCache = sessionData.protocolCache;
resolveAlpnQueue = sessionData.resolveAlpnQueue;
}
const connectWithProxy = async (pOptions, pCallback) => {
return connect(proxyUrl, pOptions, pCallback);
};
return http2_wrapper_1.auto.createResolveProtocol(protocolCache, resolveAlpnQueue, connectWithProxy);
};
exports.createResolveProtocol = createResolveProtocol;
//# sourceMappingURL=resolve-protocol.js.map