proxy-chain 2.7.1 → 3.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -62
- package/dist/anonymize_proxy.d.ts +2 -6
- package/dist/anonymize_proxy.d.ts.map +1 -1
- package/dist/anonymize_proxy.js +27 -44
- package/dist/anonymize_proxy.js.map +1 -1
- package/dist/chain.d.ts +1 -8
- package/dist/chain.d.ts.map +1 -1
- package/dist/chain.js +15 -21
- package/dist/chain.js.map +1 -1
- package/dist/chain_socks.d.ts +1 -6
- package/dist/chain_socks.d.ts.map +1 -1
- package/dist/chain_socks.js +9 -13
- package/dist/chain_socks.js.map +1 -1
- package/dist/custom_connect.d.ts.map +1 -1
- package/dist/custom_connect.js +3 -7
- package/dist/custom_connect.js.map +1 -1
- package/dist/custom_response.d.ts +0 -2
- package/dist/custom_response.d.ts.map +1 -1
- package/dist/custom_response.js +1 -5
- package/dist/custom_response.js.map +1 -1
- package/dist/direct.d.ts +1 -5
- package/dist/direct.d.ts.map +1 -1
- package/dist/direct.js +7 -12
- package/dist/direct.js.map +1 -1
- package/dist/forward.d.ts +0 -4
- package/dist/forward.d.ts.map +1 -1
- package/dist/forward.js +17 -25
- package/dist/forward.js.map +1 -1
- package/dist/forward_socks.d.ts +0 -1
- package/dist/forward_socks.d.ts.map +1 -1
- package/dist/forward_socks.js +15 -23
- package/dist/forward_socks.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -8
- package/dist/index.js.map +1 -1
- package/dist/request_error.d.ts.map +1 -1
- package/dist/request_error.js +5 -17
- package/dist/request_error.js.map +1 -1
- package/dist/server.d.ts +4 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +68 -133
- package/dist/server.js.map +1 -1
- package/dist/socket.d.ts +0 -2
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +1 -2
- package/dist/statuses.d.ts.map +1 -1
- package/dist/statuses.js +22 -27
- package/dist/statuses.js.map +1 -1
- package/dist/tcp_tunnel_tools.d.ts +2 -2
- package/dist/tcp_tunnel_tools.d.ts.map +1 -1
- package/dist/tcp_tunnel_tools.js +23 -41
- package/dist/tcp_tunnel_tools.js.map +1 -1
- package/dist/utils/count_target_bytes.d.ts +2 -3
- package/dist/utils/count_target_bytes.d.ts.map +1 -1
- package/dist/utils/count_target_bytes.js +4 -12
- package/dist/utils/count_target_bytes.js.map +1 -1
- package/dist/utils/decode_uri_component_safe.d.ts.map +1 -1
- package/dist/utils/decode_uri_component_safe.js +1 -5
- package/dist/utils/decode_uri_component_safe.js.map +1 -1
- package/dist/utils/get_basic.d.ts.map +1 -1
- package/dist/utils/get_basic.js +4 -8
- package/dist/utils/get_basic.js.map +1 -1
- package/dist/utils/is_hop_by_hop_header.d.ts.map +1 -1
- package/dist/utils/is_hop_by_hop_header.js +1 -5
- package/dist/utils/is_hop_by_hop_header.js.map +1 -1
- package/dist/utils/normalize_url_port.d.ts.map +1 -1
- package/dist/utils/normalize_url_port.js +1 -5
- package/dist/utils/normalize_url_port.js.map +1 -1
- package/dist/utils/parse_authorization_header.d.ts.map +1 -1
- package/dist/utils/parse_authorization_header.js +3 -7
- package/dist/utils/parse_authorization_header.js.map +1 -1
- package/dist/utils/redact_url.d.ts.map +1 -1
- package/dist/utils/redact_url.js +3 -7
- package/dist/utils/redact_url.js.map +1 -1
- package/dist/utils/valid_headers_only.d.ts.map +1 -1
- package/dist/utils/valid_headers_only.js +6 -10
- package/dist/utils/valid_headers_only.js.map +1 -1
- package/package.json +102 -93
- package/dist/utils/nodeify.d.ts +0 -2
- package/dist/utils/nodeify.d.ts.map +0 -1
- package/dist/utils/nodeify.js +0 -17
- package/dist/utils/nodeify.js.map +0 -1
package/dist/chain_socks.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const socks_1 = require("socks");
|
|
6
|
-
const statuses_1 = require("./statuses");
|
|
7
|
-
const count_target_bytes_1 = require("./utils/count_target_bytes");
|
|
1
|
+
import { URL } from 'node:url';
|
|
2
|
+
import { SocksClient } from 'socks';
|
|
3
|
+
import { createCustomStatusHttpResponse, socksErrorMessageToStatusCode } from './statuses.js';
|
|
4
|
+
import { countTargetBytes } from './utils/count_target_bytes.js';
|
|
8
5
|
const socksProtocolToVersionNumber = (protocol) => {
|
|
9
6
|
switch (protocol) {
|
|
10
7
|
case 'socks4:':
|
|
@@ -24,7 +21,7 @@ const socksProtocolToVersionNumber = (protocol) => {
|
|
|
24
21
|
* Client -> Apify (CONNECT) -> Upstream (SOCKS) -> Web
|
|
25
22
|
* Client <- Apify (CONNECT) <- Upstream (SOCKS) <- Web
|
|
26
23
|
*/
|
|
27
|
-
const chainSocks = async ({ request, sourceSocket, head, server, handlerOpts, }) => {
|
|
24
|
+
export const chainSocks = async ({ request, sourceSocket, head, server, handlerOpts, }) => {
|
|
28
25
|
const { proxyChainId } = sourceSocket;
|
|
29
26
|
const { hostname, port, username, password } = handlerOpts.upstreamProxyUrlParsed;
|
|
30
27
|
const proxy = {
|
|
@@ -44,14 +41,14 @@ const chainSocks = async ({ request, sourceSocket, head, server, handlerOpts, })
|
|
|
44
41
|
// Beware of upstream proxy servers that send out valid CONNECT responses with diagnostic data such as IPs!
|
|
45
42
|
sourceSocket.unshift(head);
|
|
46
43
|
}
|
|
47
|
-
const url = new
|
|
44
|
+
const url = new URL(`connect://${request.url}`);
|
|
48
45
|
const destination = {
|
|
49
46
|
port: Number(url.port),
|
|
50
47
|
host: url.hostname,
|
|
51
48
|
};
|
|
52
49
|
let targetSocket;
|
|
53
50
|
try {
|
|
54
|
-
const client = await
|
|
51
|
+
const client = await SocksClient.createConnection({
|
|
55
52
|
proxy,
|
|
56
53
|
command: 'connect',
|
|
57
54
|
destination,
|
|
@@ -62,10 +59,10 @@ const chainSocks = async ({ request, sourceSocket, head, server, handlerOpts, })
|
|
|
62
59
|
catch (error) {
|
|
63
60
|
const socksError = error;
|
|
64
61
|
server.log(proxyChainId, `Failed to connect to upstream SOCKS proxy ${socksError.stack}`);
|
|
65
|
-
sourceSocket.end(
|
|
62
|
+
sourceSocket.end(createCustomStatusHttpResponse(socksErrorMessageToStatusCode(socksError.message), socksError.message));
|
|
66
63
|
return;
|
|
67
64
|
}
|
|
68
|
-
|
|
65
|
+
countTargetBytes(sourceSocket, targetSocket);
|
|
69
66
|
sourceSocket.pipe(targetSocket);
|
|
70
67
|
targetSocket.pipe(sourceSocket);
|
|
71
68
|
// Once target socket closes forcibly, the source socket gets paused.
|
|
@@ -93,5 +90,4 @@ const chainSocks = async ({ request, sourceSocket, head, server, handlerOpts, })
|
|
|
93
90
|
targetSocket.destroy();
|
|
94
91
|
});
|
|
95
92
|
};
|
|
96
|
-
exports.chainSocks = chainSocks;
|
|
97
93
|
//# sourceMappingURL=chain_socks.js.map
|
package/dist/chain_socks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain_socks.js","sourceRoot":"","sources":["../src/chain_socks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chain_socks.js","sourceRoot":"","sources":["../src/chain_socks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom_connect.d.ts","sourceRoot":"","sources":["../src/custom_connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"custom_connect.d.ts","sourceRoot":"","sources":["../src/custom_connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,eAAO,MAAM,aAAa,GAAU,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,KAAG,OAAO,CAAC,IAAI,CAqBzF,CAAC"}
|
package/dist/custom_connect.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.customConnect = void 0;
|
|
4
|
-
const node_util_1 = require("node:util");
|
|
5
|
-
const customConnect = async (socket, server) => {
|
|
1
|
+
import { promisify } from 'node:util';
|
|
2
|
+
export const customConnect = async (socket, server) => {
|
|
6
3
|
// `countTargetBytes(socket, socket)` is incorrect here since `socket` is not a target.
|
|
7
4
|
// We would have to create a new stream and pipe traffic through that,
|
|
8
5
|
// however this would also increase CPU usage.
|
|
9
6
|
// Also, counting bytes here is not correct since we don't know how the response is generated
|
|
10
7
|
// (whether any additional sockets are used).
|
|
11
|
-
const asyncWrite =
|
|
8
|
+
const asyncWrite = promisify(socket.write).bind(socket);
|
|
12
9
|
await asyncWrite('HTTP/1.1 200 Connection Established\r\n\r\n');
|
|
13
10
|
server.emit('connection', socket);
|
|
14
11
|
return new Promise((resolve) => {
|
|
@@ -21,5 +18,4 @@ const customConnect = async (socket, server) => {
|
|
|
21
18
|
});
|
|
22
19
|
});
|
|
23
20
|
};
|
|
24
|
-
exports.customConnect = customConnect;
|
|
25
21
|
//# sourceMappingURL=custom_connect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom_connect.js","sourceRoot":"","sources":["../src/custom_connect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"custom_connect.js","sourceRoot":"","sources":["../src/custom_connect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,MAAkB,EAAE,MAAmB,EAAiB,EAAE;IAC1F,uFAAuF;IACvF,sEAAsE;IACtE,8CAA8C;IAC9C,6FAA6F;IAC7F,6CAA6C;IAE7C,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,UAAU,CAAC,6CAA6C,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAElC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,OAAO,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom_response.d.ts","sourceRoot":"","sources":["../src/custom_response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"custom_response.d.ts","sourceRoot":"","sources":["../src/custom_response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IACxB,sBAAsB,EAAE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1E;AAED,eAAO,MAAM,oBAAoB,GAC7B,UAAU,IAAI,CAAC,eAAe,EAC9B,UAAU,IAAI,CAAC,cAAc,EAC7B,aAAa,WAAW,KACzB,OAAO,CAAC,IAAI,CAqBd,CAAC"}
|
package/dist/custom_response.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleCustomResponse = void 0;
|
|
4
|
-
const handleCustomResponse = async (_request, response, handlerOpts) => {
|
|
1
|
+
export const handleCustomResponse = async (_request, response, handlerOpts) => {
|
|
5
2
|
const { customResponseFunction } = handlerOpts;
|
|
6
3
|
if (!customResponseFunction) {
|
|
7
4
|
throw new Error('The "customResponseFunction" option is required');
|
|
@@ -18,5 +15,4 @@ const handleCustomResponse = async (_request, response, handlerOpts) => {
|
|
|
18
15
|
}
|
|
19
16
|
response.end(customResponse.body, customResponse.encoding);
|
|
20
17
|
};
|
|
21
|
-
exports.handleCustomResponse = handleCustomResponse;
|
|
22
18
|
//# sourceMappingURL=custom_response.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom_response.js","sourceRoot":"","sources":["../src/custom_response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"custom_response.js","sourceRoot":"","sources":["../src/custom_response.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACrC,QAA8B,EAC9B,QAA6B,EAC7B,WAAwB,EACX,EAAE;IACf,MAAM,EAAE,sBAAsB,EAAE,GAAG,WAAW,CAAC;IAC/C,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAEtD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACzF,CAAC;IAED,QAAQ,CAAC,UAAU,GAAG,cAAc,CAAC,UAAU,IAAI,GAAG,CAAC;IAEvD,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAe,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,QAAS,CAAC,CAAC;AAChE,CAAC,CAAC"}
|
package/dist/direct.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
/// <reference types="node" />
|
|
4
|
-
/// <reference types="node" />
|
|
5
1
|
import type { Buffer } from 'node:buffer';
|
|
6
2
|
import type dns from 'node:dns';
|
|
7
3
|
import type { EventEmitter } from 'node:events';
|
|
8
|
-
import type { Socket } from './socket';
|
|
4
|
+
import type { Socket } from './socket.js';
|
|
9
5
|
export interface HandlerOpts {
|
|
10
6
|
localAddress?: string;
|
|
11
7
|
ipFamily?: number;
|
package/dist/direct.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct.d.ts","sourceRoot":"","sources":["../src/direct.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"direct.d.ts","sourceRoot":"","sources":["../src/direct.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,WAAW;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;CACpC;AAED,UAAU,UAAU;IAChB,OAAO,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,GAAG;QAAE,GAAG,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IAC7E,WAAW,EAAE,WAAW,CAAC;CAC5B;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,GACf,uDAMG,UAAU,KACd,IA0EF,CAAC"}
|
package/dist/direct.js
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const node_net_1 = tslib_1.__importDefault(require("node:net"));
|
|
6
|
-
const node_url_1 = require("node:url");
|
|
7
|
-
const count_target_bytes_1 = require("./utils/count_target_bytes");
|
|
1
|
+
import net from 'node:net';
|
|
2
|
+
import { URL } from 'node:url';
|
|
3
|
+
import { countTargetBytes } from './utils/count_target_bytes.js';
|
|
8
4
|
/**
|
|
9
5
|
* Directly connects to the target.
|
|
10
6
|
* Client -> Apify (CONNECT) -> Web
|
|
11
7
|
* Client <- Apify (CONNECT) <- Web
|
|
12
8
|
*/
|
|
13
|
-
const direct = ({ request, sourceSocket, head, server, handlerOpts, }) => {
|
|
14
|
-
const url = new
|
|
9
|
+
export const direct = ({ request, sourceSocket, head, server, handlerOpts, }) => {
|
|
10
|
+
const url = new URL(`connect://${request.url}`);
|
|
15
11
|
if (!url.hostname) {
|
|
16
12
|
throw new Error('Missing CONNECT hostname');
|
|
17
13
|
}
|
|
@@ -32,7 +28,7 @@ const direct = ({ request, sourceSocket, head, server, handlerOpts, }) => {
|
|
|
32
28
|
if (options.host[0] === '[') {
|
|
33
29
|
options.host = options.host.slice(1, -1);
|
|
34
30
|
}
|
|
35
|
-
const targetSocket =
|
|
31
|
+
const targetSocket = net.createConnection(options, () => {
|
|
36
32
|
try {
|
|
37
33
|
sourceSocket.write(`HTTP/1.1 200 Connection Established\r\n\r\n`);
|
|
38
34
|
}
|
|
@@ -40,7 +36,7 @@ const direct = ({ request, sourceSocket, head, server, handlerOpts, }) => {
|
|
|
40
36
|
sourceSocket.destroy(error);
|
|
41
37
|
}
|
|
42
38
|
});
|
|
43
|
-
|
|
39
|
+
countTargetBytes(sourceSocket, targetSocket);
|
|
44
40
|
sourceSocket.pipe(targetSocket);
|
|
45
41
|
targetSocket.pipe(sourceSocket);
|
|
46
42
|
// Once target socket closes forcibly, the source socket gets paused.
|
|
@@ -69,5 +65,4 @@ const direct = ({ request, sourceSocket, head, server, handlerOpts, }) => {
|
|
|
69
65
|
targetSocket.destroy();
|
|
70
66
|
});
|
|
71
67
|
};
|
|
72
|
-
exports.direct = direct;
|
|
73
68
|
//# sourceMappingURL=direct.js.map
|
package/dist/direct.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"direct.js","sourceRoot":"","sources":["../src/direct.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"direct.js","sourceRoot":"","sources":["../src/direct.ts"],"names":[],"mappings":"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"}
|
package/dist/forward.d.ts
CHANGED
package/dist/forward.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forward.d.ts","sourceRoot":"","sources":["../src/forward.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forward.d.ts","sourceRoot":"","sources":["../src/forward.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAkBpC,MAAM,WAAW,WAAW;IACxB,sBAAsB,EAAE,GAAG,CAAC;IAC5B,8BAA8B,EAAE,OAAO,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;IACvB,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,GAChB,SAAS,IAAI,CAAC,eAAe,EAC7B,UAAU,IAAI,CAAC,cAAc,EAC7B,aAAa,WAAW,KAEzB,OAAO,CAAC,IAAI,CAiGb,CAAC"}
|
package/dist/forward.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const node_util_1 = tslib_1.__importDefault(require("node:util"));
|
|
9
|
-
const statuses_1 = require("./statuses");
|
|
10
|
-
const count_target_bytes_1 = require("./utils/count_target_bytes");
|
|
11
|
-
const get_basic_1 = require("./utils/get_basic");
|
|
12
|
-
const valid_headers_only_1 = require("./utils/valid_headers_only");
|
|
13
|
-
const pipeline = node_util_1.default.promisify(node_stream_1.default.pipeline);
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import https from 'node:https';
|
|
3
|
+
import { pipeline } from 'node:stream/promises';
|
|
4
|
+
import { badGatewayStatusCodes, errorCodeToStatusCode } from './statuses.js';
|
|
5
|
+
import { countTargetBytes } from './utils/count_target_bytes.js';
|
|
6
|
+
import { getBasicAuthorizationHeader } from './utils/get_basic.js';
|
|
7
|
+
import { validHeadersOnly } from './utils/valid_headers_only.js';
|
|
14
8
|
/**
|
|
15
9
|
* The request is read from the client and is resent.
|
|
16
10
|
* This is similar to Direct / Chain, however it uses the CONNECT protocol instead.
|
|
@@ -28,12 +22,12 @@ const pipeline = node_util_1.default.promisify(node_stream_1.default.pipeline);
|
|
|
28
22
|
* Client <- Apify (HTTP) <- Upstream (HTTP) <- Web
|
|
29
23
|
* ```
|
|
30
24
|
*/
|
|
31
|
-
const forward = async (request, response, handlerOpts) => new Promise(async (resolve, reject) => {
|
|
25
|
+
export const forward = async (request, response, handlerOpts) => new Promise(async (resolve, reject) => {
|
|
32
26
|
const proxy = handlerOpts.upstreamProxyUrlParsed;
|
|
33
27
|
const origin = proxy ? proxy.origin : request.url;
|
|
34
28
|
const options = {
|
|
35
29
|
method: request.method,
|
|
36
|
-
headers:
|
|
30
|
+
headers: validHeadersOnly(request.rawHeaders),
|
|
37
31
|
insecureHTTPParser: true,
|
|
38
32
|
localAddress: handlerOpts.localAddress,
|
|
39
33
|
family: handlerOpts.ipFamily,
|
|
@@ -44,7 +38,7 @@ const forward = async (request, response, handlerOpts) => new Promise(async (res
|
|
|
44
38
|
options.path = request.url;
|
|
45
39
|
try {
|
|
46
40
|
if (proxy.username || proxy.password) {
|
|
47
|
-
options.headers.push('proxy-authorization',
|
|
41
|
+
options.headers.push('proxy-authorization', getBasicAuthorizationHeader(proxy));
|
|
48
42
|
}
|
|
49
43
|
}
|
|
50
44
|
catch (error) {
|
|
@@ -57,14 +51,14 @@ const forward = async (request, response, handlerOpts) => new Promise(async (res
|
|
|
57
51
|
// This is necessary to prevent Node.js throwing an error
|
|
58
52
|
let statusCode = clientResponse.statusCode;
|
|
59
53
|
if (statusCode < 100 || statusCode > 999) {
|
|
60
|
-
statusCode =
|
|
54
|
+
statusCode = badGatewayStatusCodes.STATUS_CODE_OUT_OF_RANGE;
|
|
61
55
|
}
|
|
62
56
|
// 407 is handled separately
|
|
63
57
|
if (clientResponse.statusCode === 407) {
|
|
64
58
|
reject(new Error('407 Proxy Authentication Required'));
|
|
65
59
|
return;
|
|
66
60
|
}
|
|
67
|
-
response.writeHead(statusCode, clientResponse.statusMessage,
|
|
61
|
+
response.writeHead(statusCode, clientResponse.statusMessage, validHeadersOnly(clientResponse.rawHeaders));
|
|
68
62
|
// `pipeline` automatically handles all the events and data
|
|
69
63
|
await pipeline(clientResponse, response);
|
|
70
64
|
resolve();
|
|
@@ -76,12 +70,12 @@ const forward = async (request, response, handlerOpts) => new Promise(async (res
|
|
|
76
70
|
};
|
|
77
71
|
// We have to force cast `options` because @types/node doesn't support an array.
|
|
78
72
|
const client = origin.startsWith('https:')
|
|
79
|
-
?
|
|
73
|
+
? https.request(origin, {
|
|
80
74
|
...options,
|
|
81
75
|
rejectUnauthorized: handlerOpts.upstreamProxyUrlParsed ? !handlerOpts.ignoreUpstreamProxyCertificate : undefined,
|
|
82
76
|
agent: handlerOpts.httpsAgent,
|
|
83
77
|
}, requestCallback)
|
|
84
|
-
:
|
|
78
|
+
: http.request(origin, {
|
|
85
79
|
...options,
|
|
86
80
|
agent: handlerOpts.httpAgent,
|
|
87
81
|
}, requestCallback);
|
|
@@ -90,22 +84,20 @@ const forward = async (request, response, handlerOpts) => new Promise(async (res
|
|
|
90
84
|
// That's why we need to track the previous stats.
|
|
91
85
|
socket.previousBytesRead = socket.bytesRead;
|
|
92
86
|
socket.previousBytesWritten = socket.bytesWritten;
|
|
93
|
-
|
|
87
|
+
countTargetBytes(request.socket, socket, (handler) => response.once('close', handler));
|
|
94
88
|
});
|
|
95
89
|
// Can't use pipeline here as it automatically destroys the streams
|
|
96
90
|
request.pipe(client);
|
|
97
91
|
client.on('error', (error) => {
|
|
98
|
-
var _a;
|
|
99
92
|
if (response.headersSent) {
|
|
100
93
|
resolve();
|
|
101
94
|
return;
|
|
102
95
|
}
|
|
103
|
-
const statusCode =
|
|
96
|
+
const statusCode = errorCodeToStatusCode[error.code] ?? badGatewayStatusCodes.GENERIC_ERROR;
|
|
104
97
|
response.statusCode = !proxy && error.code === 'ENOTFOUND' ? 404 : statusCode;
|
|
105
98
|
response.setHeader('content-type', 'text/plain; charset=utf-8');
|
|
106
|
-
response.end(
|
|
99
|
+
response.end(http.STATUS_CODES[response.statusCode]);
|
|
107
100
|
resolve();
|
|
108
101
|
});
|
|
109
102
|
});
|
|
110
|
-
exports.forward = forward;
|
|
111
103
|
//# sourceMappingURL=forward.js.map
|
package/dist/forward.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../src/forward.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../src/forward.ts"],"names":[],"mappings":"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"}
|
package/dist/forward_socks.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forward_socks.d.ts","sourceRoot":"","sources":["../src/forward_socks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forward_socks.d.ts","sourceRoot":"","sources":["../src/forward_socks.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAiBpC,MAAM,WAAW,WAAW;IACxB,sBAAsB,EAAE,GAAG,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GACrB,SAAS,IAAI,CAAC,eAAe,EAC7B,UAAU,IAAI,CAAC,cAAc,EAC7B,aAAa,WAAW,KAEzB,OAAO,CAAC,IAAI,CAkEb,CAAC"}
|
package/dist/forward_socks.js
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const node_util_1 = tslib_1.__importDefault(require("node:util"));
|
|
8
|
-
const socks_proxy_agent_1 = require("socks-proxy-agent");
|
|
9
|
-
const statuses_1 = require("./statuses");
|
|
10
|
-
const count_target_bytes_1 = require("./utils/count_target_bytes");
|
|
11
|
-
const valid_headers_only_1 = require("./utils/valid_headers_only");
|
|
12
|
-
const pipeline = node_util_1.default.promisify(node_stream_1.default.pipeline);
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { pipeline } from 'node:stream/promises';
|
|
3
|
+
import { SocksProxyAgent } from 'socks-proxy-agent';
|
|
4
|
+
import { badGatewayStatusCodes, errorCodeToStatusCode } from './statuses.js';
|
|
5
|
+
import { countTargetBytes } from './utils/count_target_bytes.js';
|
|
6
|
+
import { validHeadersOnly } from './utils/valid_headers_only.js';
|
|
13
7
|
/**
|
|
14
8
|
* Forwards HTTP requests through a SOCKS upstream proxy.
|
|
15
9
|
*
|
|
@@ -22,30 +16,30 @@ const pipeline = node_util_1.default.promisify(node_stream_1.default.pipeline);
|
|
|
22
16
|
* Client <- Apify (HTTP) <- Upstream (SOCKS) <- Web
|
|
23
17
|
* ```
|
|
24
18
|
*/
|
|
25
|
-
const forwardSocks = async (request, response, handlerOpts) => new Promise(async (resolve, reject) => {
|
|
26
|
-
const agent = new
|
|
19
|
+
export const forwardSocks = async (request, response, handlerOpts) => new Promise(async (resolve, reject) => {
|
|
20
|
+
const agent = new SocksProxyAgent(handlerOpts.upstreamProxyUrlParsed);
|
|
27
21
|
const options = {
|
|
28
22
|
method: request.method,
|
|
29
|
-
headers:
|
|
23
|
+
headers: validHeadersOnly(request.rawHeaders),
|
|
30
24
|
insecureHTTPParser: true,
|
|
31
25
|
localAddress: handlerOpts.localAddress,
|
|
32
26
|
agent,
|
|
33
27
|
};
|
|
34
28
|
// Only handling "http" here - since everything else is handeled by tunnelSocks.
|
|
35
29
|
// We have to force cast `options` because @types/node doesn't support an array.
|
|
36
|
-
const client =
|
|
30
|
+
const client = http.request(request.url, options, async (clientResponse) => {
|
|
37
31
|
try {
|
|
38
32
|
// This is necessary to prevent Node.js throwing an error
|
|
39
33
|
let statusCode = clientResponse.statusCode;
|
|
40
34
|
if (statusCode < 100 || statusCode > 999) {
|
|
41
|
-
statusCode =
|
|
35
|
+
statusCode = badGatewayStatusCodes.STATUS_CODE_OUT_OF_RANGE;
|
|
42
36
|
}
|
|
43
37
|
// 407 is handled separately
|
|
44
38
|
if (clientResponse.statusCode === 407) {
|
|
45
39
|
reject(new Error('407 Proxy Authentication Required'));
|
|
46
40
|
return;
|
|
47
41
|
}
|
|
48
|
-
response.writeHead(statusCode, clientResponse.statusMessage,
|
|
42
|
+
response.writeHead(statusCode, clientResponse.statusMessage, validHeadersOnly(clientResponse.rawHeaders));
|
|
49
43
|
// `pipeline` automatically handles all the events and data
|
|
50
44
|
await pipeline(clientResponse, response);
|
|
51
45
|
resolve();
|
|
@@ -56,22 +50,20 @@ const forwardSocks = async (request, response, handlerOpts) => new Promise(async
|
|
|
56
50
|
}
|
|
57
51
|
});
|
|
58
52
|
client.once('socket', (socket) => {
|
|
59
|
-
|
|
53
|
+
countTargetBytes(request.socket, socket);
|
|
60
54
|
});
|
|
61
55
|
// Can't use pipeline here as it automatically destroys the streams
|
|
62
56
|
request.pipe(client);
|
|
63
57
|
client.on('error', (error) => {
|
|
64
|
-
var _a;
|
|
65
58
|
if (response.headersSent) {
|
|
66
59
|
resolve();
|
|
67
60
|
return;
|
|
68
61
|
}
|
|
69
|
-
const statusCode =
|
|
62
|
+
const statusCode = errorCodeToStatusCode[error.code] ?? badGatewayStatusCodes.GENERIC_ERROR;
|
|
70
63
|
response.statusCode = statusCode;
|
|
71
64
|
response.setHeader('content-type', 'text/plain; charset=utf-8');
|
|
72
|
-
response.end(
|
|
65
|
+
response.end(http.STATUS_CODES[response.statusCode]);
|
|
73
66
|
resolve();
|
|
74
67
|
});
|
|
75
68
|
});
|
|
76
|
-
exports.forwardSocks = forwardSocks;
|
|
77
69
|
//# sourceMappingURL=forward_socks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forward_socks.js","sourceRoot":"","sources":["../src/forward_socks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forward_socks.js","sourceRoot":"","sources":["../src/forward_socks.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAgBjE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC7B,OAA6B,EAC7B,QAA6B,EAC7B,WAAwB,EAEX,EAAE,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAY;QACrB,MAAM,EAAE,OAAO,CAAC,MAAO;QACvB,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7C,kBAAkB,EAAE,IAAI;QACxB,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,KAAK;KACR,CAAC;IAEF,gFAAgF;IAChF,gFAAgF;IAChF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAI,EAAE,OAA4C,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;QAC7G,IAAI,CAAC;YACD,yDAAyD;YACzD,IAAI,UAAU,GAAG,cAAc,CAAC,UAAW,CAAC;YAC5C,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;gBACvC,UAAU,GAAG,qBAAqB,CAAC,wBAAwB,CAAC;YAChE,CAAC;YAED,4BAA4B;YAC5B,IAAI,cAAc,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBACvD,OAAO;YACX,CAAC;YAED,QAAQ,CAAC,SAAS,CACd,UAAU,EACV,cAAc,CAAC,aAAa,EAC5B,gBAAgB,CAAC,cAAc,CAAC,UAAU,CAAC,CAC9C,CAAC;YAEF,2DAA2D;YAC3D,MAAM,QAAQ,CACV,cAAc,EACd,QAAQ,CACX,CAAC;YAEF,OAAO,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACL,+DAA+D;YAC/D,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;QAC7B,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,mEAAmE;IACnE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;QAChD,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,qBAAqB,CAAC,aAAa,CAAC;QAE7F,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAErD,OAAO,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export * from './request_error';
|
|
2
|
-
export * from './server';
|
|
3
|
-
export * from './utils/redact_url';
|
|
4
|
-
export * from './anonymize_proxy';
|
|
5
|
-
export * from './tcp_tunnel_tools';
|
|
6
|
-
export { CustomResponse } from './custom_response';
|
|
1
|
+
export * from './request_error.js';
|
|
2
|
+
export * from './server.js';
|
|
3
|
+
export * from './utils/redact_url.js';
|
|
4
|
+
export * from './anonymize_proxy.js';
|
|
5
|
+
export * from './tcp_tunnel_tools.js';
|
|
6
|
+
export type { CustomResponse } from './custom_response.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AAEtC,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
tslib_1.__exportStar(require("./utils/redact_url"), exports);
|
|
7
|
-
tslib_1.__exportStar(require("./anonymize_proxy"), exports);
|
|
8
|
-
tslib_1.__exportStar(require("./tcp_tunnel_tools"), exports);
|
|
1
|
+
export * from './request_error.js';
|
|
2
|
+
export * from './server.js';
|
|
3
|
+
export * from './utils/redact_url.js';
|
|
4
|
+
export * from './anonymize_proxy.js';
|
|
5
|
+
export * from './tcp_tunnel_tools.js';
|
|
9
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request_error.d.ts","sourceRoot":"","sources":["../src/request_error.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAGxB,UAAU,EAAE,MAAM;IAClB,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"request_error.d.ts","sourceRoot":"","sources":["../src/request_error.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAGxB,UAAU,EAAE,MAAM;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;gBAFvC,OAAO,EAAE,MAAM,EACR,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA;CAO9C"}
|
package/dist/request_error.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RequestError = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* Represents custom request error. The message is emitted as HTTP response
|
|
6
3
|
* with a specific HTTP code and headers.
|
|
@@ -9,24 +6,15 @@ exports.RequestError = void 0;
|
|
|
9
6
|
* By default, the response will have Content-Type: text/plain
|
|
10
7
|
* and for the 407 status the Proxy-Authenticate header will be added.
|
|
11
8
|
*/
|
|
12
|
-
class RequestError extends Error {
|
|
9
|
+
export class RequestError extends Error {
|
|
10
|
+
statusCode;
|
|
11
|
+
headers;
|
|
13
12
|
constructor(message, statusCode, headers) {
|
|
14
13
|
super(message);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
configurable: true,
|
|
18
|
-
writable: true,
|
|
19
|
-
value: statusCode
|
|
20
|
-
});
|
|
21
|
-
Object.defineProperty(this, "headers", {
|
|
22
|
-
enumerable: true,
|
|
23
|
-
configurable: true,
|
|
24
|
-
writable: true,
|
|
25
|
-
value: headers
|
|
26
|
-
});
|
|
14
|
+
this.statusCode = statusCode;
|
|
15
|
+
this.headers = headers;
|
|
27
16
|
this.name = RequestError.name;
|
|
28
17
|
Error.captureStackTrace(this, RequestError);
|
|
29
18
|
}
|
|
30
19
|
}
|
|
31
|
-
exports.RequestError = RequestError;
|
|
32
20
|
//# sourceMappingURL=request_error.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request_error.js","sourceRoot":"","sources":["../src/request_error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request_error.js","sourceRoot":"","sources":["../src/request_error.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAGxB;IACA;IAHX,YACI,OAAe,EACR,UAAkB,EAClB,OAAgC;QAEvC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAQ;QAClB,YAAO,GAAP,OAAO,CAAyB;QAGvC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAE9B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;CACJ"}
|