got-scraping
Version:
HTTP client made for scraping based on got.
130 lines • 4.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpsProxyAgent = exports.HttpProxyAgent = exports.HttpRegularProxyAgent = void 0;
const tslib_1 = require("tslib");
/* eslint-disable max-classes-per-file */
const url_1 = require("url");
const tls_1 = tslib_1.__importDefault(require("tls"));
const http_1 = tslib_1.__importDefault(require("http"));
const https_1 = tslib_1.__importDefault(require("https"));
const initialize = (self, options) => {
self.proxy = typeof options.proxy === 'string' ? new url_1.URL(options.proxy) : options.proxy;
};
const getBasic = (url) => {
let basic = '';
if (url.username || url.password) {
const username = decodeURIComponent(url.username);
const password = decodeURIComponent(url.password);
basic = Buffer.from(`${username}:${password}`).toString('base64');
return `Basic ${basic}`;
}
return basic;
};
class HttpRegularProxyAgent extends http_1.default.Agent {
constructor(options) {
super(options);
Object.defineProperty(this, "proxy", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
initialize(this, options);
}
addRequest(request, options) {
if (options.socketPath) {
// @ts-expect-error @types/node is missing types
super.addRequest(request, options);
return;
}
const hostport = `${options.host}:${options.port}`;
const url = new url_1.URL(`${request.protocol}//${hostport}${request.path}`);
options = {
...options,
host: this.proxy.hostname,
port: this.proxy.port,
};
request.path = url.href;
const basic = getBasic(this.proxy);
if (basic) {
request.setHeader('proxy-authorization', basic);
}
// @ts-expect-error @types/node is missing types
super.addRequest(request, options);
}
}
exports.HttpRegularProxyAgent = HttpRegularProxyAgent;
class HttpProxyAgent extends http_1.default.Agent {
constructor(options) {
super(options);
Object.defineProperty(this, "proxy", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
initialize(this, options);
}
createConnection(options, callback) {
if (options.path) {
// @ts-expect-error @types/node is missing types
super.createConnection(options, callback);
return;
}
const fn = this.proxy.protocol === 'https:' ? https_1.default.request : http_1.default.request;
const hostport = `${options.host}:${options.port}`;
const headers = {
host: hostport,
};
const basic = getBasic(this.proxy);
if (basic) {
headers['proxy-authorization'] = basic;
headers.authorization = basic;
}
const connectRequest = fn(this.proxy, {
method: 'CONNECT',
headers,
path: hostport,
agent: false,
rejectUnauthorized: false,
});
connectRequest.once('connect', (response, socket, head) => {
if (head.length > 0 || response.statusCode !== 200) {
socket.destroy();
const error = new Error(`The proxy responded with ${response.statusCode}: ${head.toString()}`);
callback(error);
return;
}
if (options.protocol === 'https:') {
callback(undefined, tls_1.default.connect({
...options,
socket,
}));
return;
}
callback(undefined, socket);
});
connectRequest.once('error', (error) => {
callback(error);
});
connectRequest.end();
}
}
exports.HttpProxyAgent = HttpProxyAgent;
class HttpsProxyAgent extends https_1.default.Agent {
constructor(options) {
super(options);
Object.defineProperty(this, "proxy", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
initialize(this, options);
}
createConnection(options, callback) {
HttpProxyAgent.prototype.createConnection.call(this, options, callback);
}
}
exports.HttpsProxyAgent = HttpsProxyAgent;
//# sourceMappingURL=h1-proxy-agent.js.map