urllib 2.38.1 → 3.0.0

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.
Files changed (55) hide show
  1. package/README.md +75 -264
  2. package/package.json +62 -59
  3. package/src/HttpAgent.ts +72 -0
  4. package/src/HttpClient.ts +514 -0
  5. package/src/Request.ts +118 -0
  6. package/src/Response.ts +41 -0
  7. package/src/cjs/HttpAgent.d.ts +16 -0
  8. package/src/cjs/HttpAgent.js +62 -0
  9. package/src/cjs/HttpAgent.js.map +1 -0
  10. package/src/cjs/HttpClient.d.ts +39 -0
  11. package/src/cjs/HttpClient.js +466 -0
  12. package/src/cjs/HttpClient.js.map +1 -0
  13. package/src/cjs/Request.d.ts +114 -0
  14. package/src/cjs/Request.js +3 -0
  15. package/src/cjs/Request.js.map +1 -0
  16. package/src/cjs/Response.d.ts +36 -0
  17. package/src/cjs/Response.js +3 -0
  18. package/src/cjs/Response.js.map +1 -0
  19. package/src/cjs/index.d.ts +7 -0
  20. package/src/cjs/index.js +18 -0
  21. package/src/cjs/index.js.map +1 -0
  22. package/src/cjs/package.json +3 -0
  23. package/src/cjs/utils.d.ts +3 -0
  24. package/src/cjs/utils.js +56 -0
  25. package/src/cjs/utils.js.map +1 -0
  26. package/src/esm/HttpAgent.d.ts +16 -0
  27. package/src/esm/HttpAgent.js +58 -0
  28. package/src/esm/HttpAgent.js.map +1 -0
  29. package/src/esm/HttpClient.d.ts +39 -0
  30. package/src/esm/HttpClient.js +462 -0
  31. package/src/esm/HttpClient.js.map +1 -0
  32. package/src/esm/Request.d.ts +114 -0
  33. package/src/esm/Request.js +2 -0
  34. package/src/esm/Request.js.map +1 -0
  35. package/src/esm/Response.d.ts +36 -0
  36. package/src/esm/Response.js +2 -0
  37. package/src/esm/Response.js.map +1 -0
  38. package/src/esm/index.d.ts +7 -0
  39. package/src/esm/index.js +13 -0
  40. package/src/esm/index.js.map +1 -0
  41. package/src/esm/package.json +3 -0
  42. package/src/esm/utils.d.ts +3 -0
  43. package/src/esm/utils.js +51 -0
  44. package/src/esm/utils.js.map +1 -0
  45. package/src/index.ts +16 -0
  46. package/src/utils.ts +53 -0
  47. package/History.md +0 -804
  48. package/lib/detect_proxy_agent.js +0 -31
  49. package/lib/get_proxy_from_uri.js +0 -81
  50. package/lib/httpclient.js +0 -61
  51. package/lib/httpclient2.js +0 -83
  52. package/lib/index.d.ts +0 -279
  53. package/lib/index.js +0 -21
  54. package/lib/index.test-d.ts +0 -19
  55. package/lib/urllib.js +0 -1317
@@ -0,0 +1,41 @@
1
+ import { Readable } from 'stream';
2
+ import { IncomingHttpHeaders } from 'http';
3
+
4
+ export type HttpClientResponseMeta = {
5
+ status: number;
6
+ statusCode: number;
7
+ headers: IncomingHttpHeaders;
8
+ size: number;
9
+ aborted: boolean;
10
+ rt: number;
11
+ keepAliveSocket: boolean;
12
+ requestUrls: string[];
13
+ /**
14
+ * https://eggjs.org/en/core/httpclient.html#timing-boolean
15
+ */
16
+ timing: {
17
+ contentDownload: number;
18
+ waiting: number;
19
+ };
20
+ // remoteAddress: remoteAddress,
21
+ // remotePort: remotePort,
22
+ // socketHandledRequests: socketHandledRequests,
23
+ // socketHandledResponses: socketHandledResponses,
24
+ };
25
+
26
+ export type ReadableWithMeta = Readable & {
27
+ status: number;
28
+ statusCode: number;
29
+ headers: IncomingHttpHeaders;
30
+ };
31
+
32
+ export type HttpClientResponse = {
33
+ opaque: unknown;
34
+ data: any
35
+ status: number;
36
+ headers: IncomingHttpHeaders;
37
+ url: string;
38
+ redirected: boolean;
39
+ requestUrls: string[];
40
+ res: ReadableWithMeta | HttpClientResponseMeta;
41
+ };
@@ -0,0 +1,16 @@
1
+ /// <reference types="node" />
2
+ import { LookupFunction } from 'net';
3
+ import { Agent } from 'undici';
4
+ import { DispatchHandlers } from 'undici/types/dispatcher';
5
+ import { BuildOptions } from 'undici/types/connector';
6
+ export declare type CheckAddressFunction = (ip: string, family: number | string) => boolean;
7
+ export declare type HttpAgentOptions = {
8
+ lookup?: LookupFunction;
9
+ checkAddress?: CheckAddressFunction;
10
+ connect?: BuildOptions;
11
+ };
12
+ export declare class HttpAgent extends Agent {
13
+ #private;
14
+ constructor(options: HttpAgentOptions);
15
+ dispatch(options: Agent.DispatchOptions, handler: DispatchHandlers): boolean;
16
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var _HttpAgent_checkAddress;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HttpAgent = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const dns_1 = tslib_1.__importDefault(require("dns"));
7
+ const net_1 = require("net");
8
+ const undici_1 = require("undici");
9
+ class IllegalAddressError extends Error {
10
+ constructor(hostname, ip, family) {
11
+ const message = 'illegal address';
12
+ super(message);
13
+ this.name = this.constructor.name;
14
+ this.hostname = hostname;
15
+ this.ip = ip;
16
+ this.family = family;
17
+ Error.captureStackTrace(this, this.constructor);
18
+ }
19
+ }
20
+ class HttpAgent extends undici_1.Agent {
21
+ constructor(options) {
22
+ var _a;
23
+ /* eslint node/prefer-promises/dns: off*/
24
+ const _lookup = (_a = options.lookup) !== null && _a !== void 0 ? _a : dns_1.default.lookup;
25
+ const lookup = (hostname, dnsOptions, callback) => {
26
+ _lookup(hostname, dnsOptions, (err, address, family) => {
27
+ if (err)
28
+ return callback(err, address, family);
29
+ if (options.checkAddress && !options.checkAddress(address, family)) {
30
+ err = new IllegalAddressError(hostname, address, family);
31
+ }
32
+ callback(err, address, family);
33
+ });
34
+ };
35
+ super({
36
+ connect: { ...options.connect, lookup },
37
+ });
38
+ _HttpAgent_checkAddress.set(this, void 0);
39
+ tslib_1.__classPrivateFieldSet(this, _HttpAgent_checkAddress, options.checkAddress, "f");
40
+ }
41
+ dispatch(options, handler) {
42
+ if (tslib_1.__classPrivateFieldGet(this, _HttpAgent_checkAddress, "f") && options.origin) {
43
+ const originUrl = typeof options.origin === 'string' ? new URL(options.origin) : options.origin;
44
+ let hostname = originUrl.hostname;
45
+ // [2001:db8:2de::e13] => 2001:db8:2de::e13
46
+ if (hostname.startsWith('[') && hostname.endsWith(']')) {
47
+ hostname = hostname.substring(1, hostname.length - 1);
48
+ }
49
+ const family = (0, net_1.isIP)(hostname);
50
+ if (family === 4 || family === 6) {
51
+ // if request hostname is ip, custom lookup won't excute
52
+ if (!tslib_1.__classPrivateFieldGet(this, _HttpAgent_checkAddress, "f").call(this, hostname, family)) {
53
+ throw new IllegalAddressError(hostname, hostname, family);
54
+ }
55
+ }
56
+ }
57
+ return super.dispatch(options, handler);
58
+ }
59
+ }
60
+ exports.HttpAgent = HttpAgent;
61
+ _HttpAgent_checkAddress = new WeakMap();
62
+ //# sourceMappingURL=HttpAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpAgent.js","sourceRoot":"","sources":["../HttpAgent.ts"],"names":[],"mappings":";;;;;AAAA,sDAAsB;AACtB,6BAA2C;AAC3C,mCAEgB;AAYhB,MAAM,mBAAoB,SAAQ,KAAK;IAKrC,YAAY,QAAgB,EAAE,EAAU,EAAE,MAAc;QACtD,MAAM,OAAO,GAAG,iBAAiB,CAAC;QAClC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAED,MAAa,SAAU,SAAQ,cAAK;IAGlC,YAAY,OAAyB;;QACnC,yCAAyC;QACzC,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,aAAG,CAAC,MAAM,CAAC;QAC7C,MAAM,MAAM,GAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE;YAChE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrD,IAAI,GAAG;oBAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;oBAClE,GAAG,GAAG,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;iBAC1D;gBACD,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,KAAK,CAAC;YACJ,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE;SACxC,CAAC,CAAC;QAhBL,0CAAqC;QAiBnC,+BAAA,IAAI,2BAAiB,OAAO,CAAC,YAAY,MAAA,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,OAA8B,EAAE,OAAyB;QAChE,IAAI,+BAAA,IAAI,+BAAc,IAAI,OAAO,CAAC,MAAM,EAAE;YACxC,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAChG,IAAI,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YAClC,2CAA2C;YAC3C,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACtD,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;aACvD;YACD,MAAM,MAAM,GAAG,IAAA,UAAI,EAAC,QAAQ,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE;gBAChC,wDAAwD;gBACxD,IAAI,CAAC,+BAAA,IAAI,+BAAc,MAAlB,IAAI,EAAe,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACzC,MAAM,IAAI,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;iBAC3D;aACF;SACF;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACF;AAvCD,8BAuCC"}
@@ -0,0 +1,39 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ import { EventEmitter } from 'events';
5
+ import { LookupFunction } from 'net';
6
+ import { CheckAddressFunction } from './HttpAgent';
7
+ import { RequestURL, RequestOptions } from './Request';
8
+ import { HttpClientResponse } from './Response';
9
+ export declare type ClientOptions = {
10
+ defaultArgs?: RequestOptions;
11
+ /**
12
+ * Custom DNS lookup function, default is `dns.lookup`.
13
+ */
14
+ lookup?: LookupFunction;
15
+ /**
16
+ * check request address to protect from SSRF and similar attacks.
17
+ * It receive two arguments(ip and family) and should return true or false to identified the address is legal or not.
18
+ * It rely on lookup and have the same version requirement.
19
+ */
20
+ checkAddress?: CheckAddressFunction;
21
+ connect?: {
22
+ key?: string | Buffer;
23
+ /**
24
+ * A string or Buffer containing the certificate key of the client in PEM format.
25
+ * Notes: This is necessary only if using the client certificate authentication
26
+ */
27
+ cert?: string | Buffer;
28
+ /**
29
+ * If true, the server certificate is verified against the list of supplied CAs.
30
+ * An 'error' event is emitted if verification fails.Default: true.
31
+ */
32
+ rejectUnauthorized?: boolean;
33
+ };
34
+ };
35
+ export declare class HttpClient extends EventEmitter {
36
+ #private;
37
+ constructor(clientOptions?: ClientOptions);
38
+ request(url: RequestURL, options?: RequestOptions): Promise<HttpClientResponse>;
39
+ }
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+ var _a, _b, _c;
3
+ var _BlobFromStream_stream, _BlobFromStream_type, _HttpClient_instances, _HttpClient_defaultArgs, _HttpClient_dispatcher, _HttpClient_requestInternal;
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.HttpClient = void 0;
6
+ const tslib_1 = require("tslib");
7
+ const events_1 = require("events");
8
+ const util_1 = require("util");
9
+ const zlib_1 = require("zlib");
10
+ const buffer_1 = require("buffer");
11
+ const stream_1 = require("stream");
12
+ const stream_2 = tslib_1.__importDefault(require("stream"));
13
+ const path_1 = require("path");
14
+ const fs_1 = require("fs");
15
+ const perf_hooks_1 = require("perf_hooks");
16
+ const undici_1 = require("undici");
17
+ const formdata_node_1 = require("formdata-node");
18
+ const form_data_encoder_1 = require("form-data-encoder");
19
+ const default_user_agent_1 = tslib_1.__importDefault(require("default-user-agent"));
20
+ const mime_types_1 = tslib_1.__importDefault(require("mime-types"));
21
+ const pump_1 = tslib_1.__importDefault(require("pump"));
22
+ const HttpAgent_1 = require("./HttpAgent");
23
+ const utils_1 = require("./utils");
24
+ const FormData = undici_1.FormData !== null && undici_1.FormData !== void 0 ? undici_1.FormData : formdata_node_1.FormData;
25
+ // impl isReadable on Node.js 14
26
+ const isReadable = (_a = stream_2.default.isReadable) !== null && _a !== void 0 ? _a : function isReadable(stream) {
27
+ return stream && typeof stream.read === 'function';
28
+ };
29
+ // impl promise pipeline on Node.js 14
30
+ const pipelinePromise = (_c = (_b = stream_2.default.promises) === null || _b === void 0 ? void 0 : _b.pipeline) !== null && _c !== void 0 ? _c : function pipeline(...args) {
31
+ return new Promise((resolve, reject) => {
32
+ (0, pump_1.default)(...args, (err) => {
33
+ if (err)
34
+ return reject(err);
35
+ resolve();
36
+ });
37
+ });
38
+ };
39
+ function noop() {
40
+ // noop
41
+ }
42
+ const MAX_REQURE_ID_VALUE = Math.pow(2, 31) - 10;
43
+ let globalRequestId = 0;
44
+ const debug = (0, util_1.debuglog)('urllib');
45
+ // https://github.com/octet-stream/form-data
46
+ class BlobFromStream {
47
+ constructor(stream, type) {
48
+ _BlobFromStream_stream.set(this, void 0);
49
+ _BlobFromStream_type.set(this, void 0);
50
+ tslib_1.__classPrivateFieldSet(this, _BlobFromStream_stream, stream, "f");
51
+ tslib_1.__classPrivateFieldSet(this, _BlobFromStream_type, type, "f");
52
+ }
53
+ stream() {
54
+ return tslib_1.__classPrivateFieldGet(this, _BlobFromStream_stream, "f");
55
+ }
56
+ get type() {
57
+ return tslib_1.__classPrivateFieldGet(this, _BlobFromStream_type, "f");
58
+ }
59
+ get [(_BlobFromStream_stream = new WeakMap(), _BlobFromStream_type = new WeakMap(), Symbol.toStringTag)]() {
60
+ return 'Blob';
61
+ }
62
+ }
63
+ class HttpClientRequestTimeoutError extends Error {
64
+ constructor(timeout, options) {
65
+ const message = `Request timeout for ${timeout} ms`;
66
+ super(message, options);
67
+ this.name = this.constructor.name;
68
+ Error.captureStackTrace(this, this.constructor);
69
+ }
70
+ }
71
+ const HEADER_USER_AGENT = (0, default_user_agent_1.default)('node-urllib', '3.0.0');
72
+ function getFileName(stream) {
73
+ const filePath = stream.path;
74
+ if (filePath) {
75
+ return (0, path_1.basename)(filePath);
76
+ }
77
+ return '';
78
+ }
79
+ function defaultIsRetry(response) {
80
+ return response.status >= 500;
81
+ }
82
+ function performanceTime(startTime) {
83
+ return Math.floor((perf_hooks_1.performance.now() - startTime) * 1000) / 1000;
84
+ }
85
+ class HttpClient extends events_1.EventEmitter {
86
+ constructor(clientOptions) {
87
+ super();
88
+ _HttpClient_instances.add(this);
89
+ _HttpClient_defaultArgs.set(this, void 0);
90
+ _HttpClient_dispatcher.set(this, void 0);
91
+ tslib_1.__classPrivateFieldSet(this, _HttpClient_defaultArgs, clientOptions === null || clientOptions === void 0 ? void 0 : clientOptions.defaultArgs, "f");
92
+ if ((clientOptions === null || clientOptions === void 0 ? void 0 : clientOptions.lookup) || (clientOptions === null || clientOptions === void 0 ? void 0 : clientOptions.checkAddress) || (clientOptions === null || clientOptions === void 0 ? void 0 : clientOptions.connect)) {
93
+ tslib_1.__classPrivateFieldSet(this, _HttpClient_dispatcher, new HttpAgent_1.HttpAgent({
94
+ lookup: clientOptions.lookup,
95
+ checkAddress: clientOptions.checkAddress,
96
+ connect: clientOptions.connect,
97
+ }), "f");
98
+ }
99
+ }
100
+ async request(url, options) {
101
+ return await tslib_1.__classPrivateFieldGet(this, _HttpClient_instances, "m", _HttpClient_requestInternal).call(this, url, options);
102
+ }
103
+ }
104
+ exports.HttpClient = HttpClient;
105
+ _HttpClient_defaultArgs = new WeakMap(), _HttpClient_dispatcher = new WeakMap(), _HttpClient_instances = new WeakSet(), _HttpClient_requestInternal = async function _HttpClient_requestInternal(url, options, requestContext) {
106
+ var _a, _b, _c, _d, _e, _f;
107
+ if (globalRequestId >= MAX_REQURE_ID_VALUE) {
108
+ globalRequestId = 0;
109
+ }
110
+ const requestId = ++globalRequestId;
111
+ const requestUrl = typeof url === 'string' ? new URL(url) : url;
112
+ const args = {
113
+ retry: 0,
114
+ ...tslib_1.__classPrivateFieldGet(this, _HttpClient_defaultArgs, "f"),
115
+ ...options,
116
+ };
117
+ requestContext = {
118
+ retries: 0,
119
+ ...requestContext,
120
+ };
121
+ const requestStartTime = perf_hooks_1.performance.now();
122
+ const reqMeta = {
123
+ requestId,
124
+ url: requestUrl.href,
125
+ args,
126
+ ctx: args.ctx,
127
+ };
128
+ // keep urllib createCallbackResponse style
129
+ const resHeaders = {};
130
+ const res = {
131
+ status: -1,
132
+ statusCode: -1,
133
+ headers: resHeaders,
134
+ size: 0,
135
+ aborted: false,
136
+ rt: 0,
137
+ keepAliveSocket: true,
138
+ requestUrls: [],
139
+ timing: {
140
+ waiting: 0,
141
+ contentDownload: 0,
142
+ },
143
+ };
144
+ let headersTimeout = 5000;
145
+ let bodyTimeout = 5000;
146
+ if (args.timeout) {
147
+ if (Array.isArray(args.timeout)) {
148
+ headersTimeout = (_a = args.timeout[0]) !== null && _a !== void 0 ? _a : headersTimeout;
149
+ bodyTimeout = (_b = args.timeout[1]) !== null && _b !== void 0 ? _b : bodyTimeout;
150
+ }
151
+ else {
152
+ headersTimeout = bodyTimeout = args.timeout;
153
+ }
154
+ }
155
+ const method = ((_c = args.method) !== null && _c !== void 0 ? _c : 'GET').toUpperCase();
156
+ const headers = {};
157
+ if (args.headers) {
158
+ // convert headers to lower-case
159
+ for (const name in args.headers) {
160
+ headers[name.toLowerCase()] = args.headers[name];
161
+ }
162
+ }
163
+ // hidden user-agent
164
+ const hiddenUserAgent = 'user-agent' in headers && !headers['user-agent'];
165
+ if (hiddenUserAgent) {
166
+ delete headers['user-agent'];
167
+ }
168
+ else if (!headers['user-agent']) {
169
+ // need to set user-agent
170
+ headers['user-agent'] = HEADER_USER_AGENT;
171
+ }
172
+ // Alias to dataType = 'stream'
173
+ if (args.streaming || args.customResponse) {
174
+ args.dataType = 'stream';
175
+ }
176
+ if (args.dataType === 'json' && !headers.accept) {
177
+ headers.accept = 'application/json';
178
+ }
179
+ // gzip alias to compressed
180
+ if (args.gzip && args.compressed !== false) {
181
+ args.compressed = true;
182
+ }
183
+ if (args.compressed && !headers['accept-encoding']) {
184
+ headers['accept-encoding'] = 'gzip, br';
185
+ }
186
+ if (requestContext.retries > 0) {
187
+ headers['x-urllib-retry'] = `${requestContext.retries}/${args.retry}`;
188
+ }
189
+ if (args.auth && !headers.authorization) {
190
+ headers.authorization = `Basic ${Buffer.from(args.auth).toString('base64')}`;
191
+ }
192
+ let opaque = args.opaque;
193
+ try {
194
+ const requestOptions = {
195
+ method,
196
+ keepalive: true,
197
+ maxRedirections: (_d = args.maxRedirects) !== null && _d !== void 0 ? _d : 10,
198
+ headersTimeout,
199
+ bodyTimeout,
200
+ opaque,
201
+ dispatcher: tslib_1.__classPrivateFieldGet(this, _HttpClient_dispatcher, "f"),
202
+ };
203
+ if (args.followRedirect === false) {
204
+ requestOptions.maxRedirections = 0;
205
+ }
206
+ const isGETOrHEAD = requestOptions.method === 'GET' || requestOptions.method === 'HEAD';
207
+ // alias to args.content
208
+ if (args.stream && !args.content) {
209
+ args.content = args.stream;
210
+ }
211
+ if (args.files) {
212
+ if (isGETOrHEAD) {
213
+ requestOptions.method = 'POST';
214
+ }
215
+ const formData = new FormData();
216
+ const uploadFiles = [];
217
+ if (Array.isArray(args.files)) {
218
+ for (const [index, file] of args.files.entries()) {
219
+ const field = index === 0 ? 'file' : `file${index}`;
220
+ uploadFiles.push([field, file]);
221
+ }
222
+ }
223
+ else if (args.files instanceof stream_1.Readable || isReadable(args.files)) {
224
+ uploadFiles.push(['file', args.files]);
225
+ }
226
+ else if (typeof args.files === 'string' || Buffer.isBuffer(args.files)) {
227
+ uploadFiles.push(['file', args.files]);
228
+ }
229
+ else if (typeof args.files === 'object') {
230
+ for (const field in args.files) {
231
+ uploadFiles.push([field, args.files[field]]);
232
+ }
233
+ }
234
+ // set normal fields first
235
+ if (args.data) {
236
+ for (const field in args.data) {
237
+ formData.append(field, args.data[field]);
238
+ }
239
+ }
240
+ for (const [index, [field, file]] of uploadFiles.entries()) {
241
+ if (typeof file === 'string') {
242
+ // FIXME: support non-ascii filename
243
+ // const fileName = encodeURIComponent(basename(file));
244
+ // formData.append(field, await fileFromPath(file, `utf-8''${fileName}`, { type: mime.lookup(fileName) || '' }));
245
+ const fileName = (0, path_1.basename)(file);
246
+ const fileReadable = (0, fs_1.createReadStream)(file);
247
+ formData.append(field, new BlobFromStream(fileReadable, mime_types_1.default.lookup(fileName) || ''), fileName);
248
+ }
249
+ else if (Buffer.isBuffer(file)) {
250
+ formData.append(field, new buffer_1.Blob([file]), `bufferfile${index}`);
251
+ }
252
+ else if (file instanceof stream_1.Readable || isReadable(file)) {
253
+ const fileName = getFileName(file) || `streamfile${index}`;
254
+ formData.append(field, new BlobFromStream(file, mime_types_1.default.lookup(fileName) || ''), fileName);
255
+ }
256
+ }
257
+ if (undici_1.FormData) {
258
+ requestOptions.body = formData;
259
+ }
260
+ else {
261
+ // Node.js 14 does not support spec-compliant FormData
262
+ // https://github.com/octet-stream/form-data#usage
263
+ const encoder = new form_data_encoder_1.FormDataEncoder(formData);
264
+ Object.assign(headers, encoder.headers);
265
+ // fix "Content-Length":"NaN"
266
+ delete headers['Content-Length'];
267
+ requestOptions.body = stream_1.Readable.from(encoder);
268
+ }
269
+ }
270
+ else if (args.content) {
271
+ if (!isGETOrHEAD) {
272
+ // handle content
273
+ requestOptions.body = args.content;
274
+ if (args.contentType) {
275
+ headers['content-type'] = args.contentType;
276
+ }
277
+ if (typeof args.content === 'string' && !headers['content-type']) {
278
+ headers['content-type'] = 'text/plain;charset=UTF-8';
279
+ }
280
+ }
281
+ }
282
+ else if (args.data) {
283
+ const isStringOrBufferOrReadable = typeof args.data === 'string'
284
+ || Buffer.isBuffer(args.data)
285
+ || isReadable(args.data);
286
+ if (isGETOrHEAD) {
287
+ if (!isStringOrBufferOrReadable) {
288
+ for (const field in args.data) {
289
+ requestUrl.searchParams.append(field, args.data[field]);
290
+ }
291
+ }
292
+ }
293
+ else {
294
+ if (isStringOrBufferOrReadable) {
295
+ requestOptions.body = args.data;
296
+ }
297
+ else {
298
+ if (args.contentType === 'json'
299
+ || args.contentType === 'application/json'
300
+ || ((_e = headers['content-type']) === null || _e === void 0 ? void 0 : _e.startsWith('application/json'))) {
301
+ requestOptions.body = JSON.stringify(args.data);
302
+ if (!headers['content-type']) {
303
+ headers['content-type'] = 'application/json';
304
+ }
305
+ }
306
+ else {
307
+ headers['content-type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
308
+ requestOptions.body = new URLSearchParams(args.data).toString();
309
+ }
310
+ }
311
+ }
312
+ }
313
+ debug('Request#%d %s %s, headers: %j, headersTimeout: %s, bodyTimeout: %s', requestId, requestOptions.method, requestUrl.href, headers, headersTimeout, bodyTimeout);
314
+ requestOptions.headers = headers;
315
+ if (this.listenerCount('request') > 0) {
316
+ this.emit('request', reqMeta);
317
+ }
318
+ const response = await (0, undici_1.request)(requestUrl, requestOptions);
319
+ opaque = response.opaque;
320
+ if (args.timing) {
321
+ res.timing.waiting = performanceTime(requestStartTime);
322
+ }
323
+ const context = response.context;
324
+ let lastUrl = '';
325
+ if (context === null || context === void 0 ? void 0 : context.history) {
326
+ for (const urlObject of context === null || context === void 0 ? void 0 : context.history) {
327
+ res.requestUrls.push(urlObject.href);
328
+ lastUrl = urlObject.href;
329
+ }
330
+ }
331
+ else {
332
+ res.requestUrls.push(requestUrl.href);
333
+ lastUrl = requestUrl.href;
334
+ }
335
+ const contentEncoding = response.headers['content-encoding'];
336
+ const isCompressedContent = contentEncoding === 'gzip' || contentEncoding === 'br';
337
+ res.headers = response.headers;
338
+ res.status = res.statusCode = response.statusCode;
339
+ if (res.headers['content-length']) {
340
+ res.size = parseInt(res.headers['content-length']);
341
+ }
342
+ let data = null;
343
+ let responseBodyStream;
344
+ if (args.dataType === 'stream') {
345
+ // streaming mode will disable retry
346
+ args.retry = 0;
347
+ const meta = {
348
+ status: res.status,
349
+ statusCode: res.statusCode,
350
+ headers: res.headers,
351
+ };
352
+ if (isCompressedContent) {
353
+ // gzip or br
354
+ const decoder = contentEncoding === 'gzip' ? (0, zlib_1.createGunzip)() : (0, zlib_1.createBrotliDecompress)();
355
+ responseBodyStream = Object.assign((0, stream_1.pipeline)(response.body, decoder, noop), meta);
356
+ }
357
+ else {
358
+ responseBodyStream = Object.assign(response.body, meta);
359
+ }
360
+ }
361
+ else if (args.writeStream) {
362
+ // streaming mode will disable retry
363
+ args.retry = 0;
364
+ if (isCompressedContent) {
365
+ const decoder = contentEncoding === 'gzip' ? (0, zlib_1.createGunzip)() : (0, zlib_1.createBrotliDecompress)();
366
+ await pipelinePromise(response.body, decoder, args.writeStream);
367
+ }
368
+ else {
369
+ await pipelinePromise(response.body, args.writeStream);
370
+ }
371
+ }
372
+ else {
373
+ // buffer
374
+ data = Buffer.from(await response.body.arrayBuffer());
375
+ if (isCompressedContent) {
376
+ try {
377
+ data = contentEncoding === 'gzip' ? (0, zlib_1.gunzipSync)(data) : (0, zlib_1.brotliDecompressSync)(data);
378
+ }
379
+ catch (err) {
380
+ if (err.name === 'Error') {
381
+ err.name = 'UnzipError';
382
+ }
383
+ throw err;
384
+ }
385
+ }
386
+ if (args.dataType === 'text') {
387
+ data = data.toString();
388
+ }
389
+ else if (args.dataType === 'json') {
390
+ if (data.length === 0) {
391
+ data = null;
392
+ }
393
+ else {
394
+ data = (0, utils_1.parseJSON)(data.toString(), args.fixJSONCtlChars);
395
+ }
396
+ }
397
+ }
398
+ res.rt = performanceTime(requestStartTime);
399
+ if (args.timing) {
400
+ res.timing.contentDownload = res.rt;
401
+ }
402
+ const clientResponse = {
403
+ opaque,
404
+ data,
405
+ status: res.status,
406
+ headers: res.headers,
407
+ url: lastUrl,
408
+ redirected: res.requestUrls.length > 1,
409
+ requestUrls: res.requestUrls,
410
+ res: responseBodyStream !== null && responseBodyStream !== void 0 ? responseBodyStream : res,
411
+ };
412
+ if (args.retry > 0 && requestContext.retries < args.retry) {
413
+ const isRetry = (_f = args.isRetry) !== null && _f !== void 0 ? _f : defaultIsRetry;
414
+ if (isRetry(clientResponse)) {
415
+ if (args.retryDelay) {
416
+ await (0, utils_1.sleep)(args.retryDelay);
417
+ }
418
+ requestContext.retries++;
419
+ return await tslib_1.__classPrivateFieldGet(this, _HttpClient_instances, "m", _HttpClient_requestInternal).call(this, url, options, requestContext);
420
+ }
421
+ }
422
+ if (this.listenerCount('response') > 0) {
423
+ this.emit('response', {
424
+ requestId,
425
+ error: null,
426
+ ctx: args.ctx,
427
+ req: reqMeta,
428
+ res,
429
+ });
430
+ }
431
+ return clientResponse;
432
+ }
433
+ catch (e) {
434
+ debug('Request#%d throw error: %s', requestId, e);
435
+ let err = e;
436
+ if (err.name === 'HeadersTimeoutError') {
437
+ err = new HttpClientRequestTimeoutError(headersTimeout, { cause: e });
438
+ }
439
+ else if (err.name === 'BodyTimeoutError') {
440
+ err = new HttpClientRequestTimeoutError(bodyTimeout, { cause: e });
441
+ }
442
+ err.opaque = opaque;
443
+ err.status = res.status;
444
+ err.headers = res.headers;
445
+ err.res = res;
446
+ // make sure requestUrls not empty
447
+ if (res.requestUrls.length === 0) {
448
+ res.requestUrls.push(requestUrl.href);
449
+ }
450
+ res.rt = performanceTime(requestStartTime);
451
+ if (args.timing) {
452
+ res.timing.contentDownload = res.rt;
453
+ }
454
+ if (this.listenerCount('response') > 0) {
455
+ this.emit('response', {
456
+ requestId,
457
+ error: err,
458
+ ctx: args.ctx,
459
+ req: reqMeta,
460
+ res,
461
+ });
462
+ }
463
+ throw err;
464
+ }
465
+ };
466
+ //# sourceMappingURL=HttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../HttpClient.ts"],"names":[],"mappings":"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"}