nlcurl 0.1.0 → 0.2.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.
- package/README.md +5 -13
- package/dist/cli/args.d.ts +37 -5
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +6 -17
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +25 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +24 -7
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +24 -12
- package/dist/cli/output.js.map +1 -1
- package/dist/cookies/jar.d.ts +45 -13
- package/dist/cookies/jar.d.ts.map +1 -1
- package/dist/cookies/jar.js +88 -29
- package/dist/cookies/jar.js.map +1 -1
- package/dist/cookies/parser.d.ts +25 -3
- package/dist/cookies/parser.d.ts.map +1 -1
- package/dist/cookies/parser.js +12 -7
- package/dist/cookies/parser.js.map +1 -1
- package/dist/core/client.d.ts +49 -33
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +64 -38
- package/dist/core/client.js.map +1 -1
- package/dist/core/errors.d.ts +94 -6
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +95 -6
- package/dist/core/errors.js.map +1 -1
- package/dist/core/request.d.ts +96 -30
- package/dist/core/request.d.ts.map +1 -1
- package/dist/core/request.js +0 -3
- package/dist/core/request.js.map +1 -1
- package/dist/core/response.d.ts +92 -8
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +92 -7
- package/dist/core/response.js.map +1 -1
- package/dist/core/session.d.ts +109 -14
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +124 -46
- package/dist/core/session.js.map +1 -1
- package/dist/fingerprints/akamai.d.ts +11 -11
- package/dist/fingerprints/akamai.d.ts.map +1 -1
- package/dist/fingerprints/akamai.js +10 -14
- package/dist/fingerprints/akamai.js.map +1 -1
- package/dist/fingerprints/database.d.ts +14 -15
- package/dist/fingerprints/database.d.ts.map +1 -1
- package/dist/fingerprints/database.js +14 -19
- package/dist/fingerprints/database.js.map +1 -1
- package/dist/fingerprints/extensions.d.ts +121 -27
- package/dist/fingerprints/extensions.d.ts.map +1 -1
- package/dist/fingerprints/extensions.js +132 -49
- package/dist/fingerprints/extensions.js.map +1 -1
- package/dist/fingerprints/ja3.d.ts +34 -18
- package/dist/fingerprints/ja3.d.ts.map +1 -1
- package/dist/fingerprints/ja3.js +34 -18
- package/dist/fingerprints/ja3.js.map +1 -1
- package/dist/fingerprints/profiles/chrome.d.ts +21 -10
- package/dist/fingerprints/profiles/chrome.d.ts.map +1 -1
- package/dist/fingerprints/profiles/chrome.js +25 -22
- package/dist/fingerprints/profiles/chrome.js.map +1 -1
- package/dist/fingerprints/profiles/edge.d.ts +10 -7
- package/dist/fingerprints/profiles/edge.d.ts.map +1 -1
- package/dist/fingerprints/profiles/edge.js +10 -10
- package/dist/fingerprints/profiles/edge.js.map +1 -1
- package/dist/fingerprints/profiles/firefox.d.ts +11 -3
- package/dist/fingerprints/profiles/firefox.d.ts.map +1 -1
- package/dist/fingerprints/profiles/firefox.js +15 -14
- package/dist/fingerprints/profiles/firefox.js.map +1 -1
- package/dist/fingerprints/profiles/safari.d.ts +14 -3
- package/dist/fingerprints/profiles/safari.d.ts.map +1 -1
- package/dist/fingerprints/profiles/safari.js +16 -13
- package/dist/fingerprints/profiles/safari.js.map +1 -1
- package/dist/fingerprints/profiles/tor.d.ts +8 -7
- package/dist/fingerprints/profiles/tor.d.ts.map +1 -1
- package/dist/fingerprints/profiles/tor.js +8 -14
- package/dist/fingerprints/profiles/tor.js.map +1 -1
- package/dist/fingerprints/types.d.ts +70 -47
- package/dist/fingerprints/types.d.ts.map +1 -1
- package/dist/fingerprints/types.js +0 -7
- package/dist/fingerprints/types.js.map +1 -1
- package/dist/http/h1/client.d.ts +30 -9
- package/dist/http/h1/client.d.ts.map +1 -1
- package/dist/http/h1/client.js +152 -15
- package/dist/http/h1/client.js.map +1 -1
- package/dist/http/h1/encoder.d.ts +9 -6
- package/dist/http/h1/encoder.d.ts.map +1 -1
- package/dist/http/h1/encoder.js +8 -12
- package/dist/http/h1/encoder.js.map +1 -1
- package/dist/http/h1/parser.d.ts +68 -14
- package/dist/http/h1/parser.d.ts.map +1 -1
- package/dist/http/h1/parser.js +92 -37
- package/dist/http/h1/parser.js.map +1 -1
- package/dist/http/h2/client.d.ts +81 -14
- package/dist/http/h2/client.d.ts.map +1 -1
- package/dist/http/h2/client.js +465 -63
- package/dist/http/h2/client.js.map +1 -1
- package/dist/http/h2/frames.d.ts +103 -6
- package/dist/http/h2/frames.d.ts.map +1 -1
- package/dist/http/h2/frames.js +96 -17
- package/dist/http/h2/frames.js.map +1 -1
- package/dist/http/h2/hpack.d.ts +30 -5
- package/dist/http/h2/hpack.d.ts.map +1 -1
- package/dist/http/h2/hpack.js +39 -35
- package/dist/http/h2/hpack.js.map +1 -1
- package/dist/http/negotiator.d.ts +35 -12
- package/dist/http/negotiator.d.ts.map +1 -1
- package/dist/http/negotiator.js +89 -24
- package/dist/http/negotiator.js.map +1 -1
- package/dist/http/pool.d.ts +66 -17
- package/dist/http/pool.d.ts.map +1 -1
- package/dist/http/pool.js +47 -20
- package/dist/http/pool.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -13
- package/dist/index.js.map +1 -1
- package/dist/middleware/interceptor.d.ts +40 -8
- package/dist/middleware/interceptor.d.ts.map +1 -1
- package/dist/middleware/interceptor.js +28 -6
- package/dist/middleware/interceptor.js.map +1 -1
- package/dist/middleware/rate-limiter.d.ts +18 -5
- package/dist/middleware/rate-limiter.d.ts.map +1 -1
- package/dist/middleware/rate-limiter.js +12 -7
- package/dist/middleware/rate-limiter.js.map +1 -1
- package/dist/middleware/retry.d.ts +17 -5
- package/dist/middleware/retry.d.ts.map +1 -1
- package/dist/middleware/retry.js +13 -11
- package/dist/middleware/retry.js.map +1 -1
- package/dist/proxy/http-proxy.d.ts +17 -9
- package/dist/proxy/http-proxy.d.ts.map +1 -1
- package/dist/proxy/http-proxy.js +9 -13
- package/dist/proxy/http-proxy.js.map +1 -1
- package/dist/proxy/socks.d.ts +20 -9
- package/dist/proxy/socks.d.ts.map +1 -1
- package/dist/proxy/socks.js +20 -31
- package/dist/proxy/socks.js.map +1 -1
- package/dist/tls/constants.d.ts +74 -4
- package/dist/tls/constants.d.ts.map +1 -1
- package/dist/tls/constants.js +75 -21
- package/dist/tls/constants.js.map +1 -1
- package/dist/tls/node-engine.d.ts +17 -16
- package/dist/tls/node-engine.d.ts.map +1 -1
- package/dist/tls/node-engine.js +20 -27
- package/dist/tls/node-engine.js.map +1 -1
- package/dist/tls/stealth/client-hello.d.ts +32 -16
- package/dist/tls/stealth/client-hello.d.ts.map +1 -1
- package/dist/tls/stealth/client-hello.js +13 -37
- package/dist/tls/stealth/client-hello.js.map +1 -1
- package/dist/tls/stealth/engine.d.ts +18 -10
- package/dist/tls/stealth/engine.d.ts.map +1 -1
- package/dist/tls/stealth/engine.js +18 -24
- package/dist/tls/stealth/engine.js.map +1 -1
- package/dist/tls/stealth/handshake.d.ts +31 -17
- package/dist/tls/stealth/handshake.d.ts.map +1 -1
- package/dist/tls/stealth/handshake.js +173 -74
- package/dist/tls/stealth/handshake.js.map +1 -1
- package/dist/tls/stealth/key-schedule.d.ts +89 -32
- package/dist/tls/stealth/key-schedule.d.ts.map +1 -1
- package/dist/tls/stealth/key-schedule.js +62 -42
- package/dist/tls/stealth/key-schedule.js.map +1 -1
- package/dist/tls/stealth/record-layer.d.ts +76 -25
- package/dist/tls/stealth/record-layer.d.ts.map +1 -1
- package/dist/tls/stealth/record-layer.js +66 -36
- package/dist/tls/stealth/record-layer.js.map +1 -1
- package/dist/tls/types.d.ts +33 -25
- package/dist/tls/types.d.ts.map +1 -1
- package/dist/tls/types.js +0 -4
- package/dist/tls/types.js.map +1 -1
- package/dist/utils/buffer-reader.d.ts +99 -7
- package/dist/utils/buffer-reader.d.ts.map +1 -1
- package/dist/utils/buffer-reader.js +99 -7
- package/dist/utils/buffer-reader.js.map +1 -1
- package/dist/utils/buffer-writer.d.ts +99 -10
- package/dist/utils/buffer-writer.d.ts.map +1 -1
- package/dist/utils/buffer-writer.js +101 -12
- package/dist/utils/buffer-writer.js.map +1 -1
- package/dist/utils/encoding.d.ts +33 -8
- package/dist/utils/encoding.d.ts.map +1 -1
- package/dist/utils/encoding.js +58 -13
- package/dist/utils/encoding.js.map +1 -1
- package/dist/utils/logger.d.ts +61 -2
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +52 -4
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/url.d.ts +47 -7
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +47 -7
- package/dist/utils/url.js.map +1 -1
- package/dist/ws/client.d.ts +59 -15
- package/dist/ws/client.d.ts.map +1 -1
- package/dist/ws/client.js +34 -27
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frame.d.ts +43 -9
- package/dist/ws/frame.d.ts.map +1 -1
- package/dist/ws/frame.js +35 -19
- package/dist/ws/frame.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP/1.1 request encoder.
|
|
3
|
-
*
|
|
4
|
-
* Serializes NLcURLRequest objects into raw HTTP/1.1 wire format.
|
|
5
|
-
*/
|
|
6
1
|
import type { NLcURLRequest } from '../../core/request.js';
|
|
7
2
|
/**
|
|
8
|
-
*
|
|
3
|
+
* Serializes an HTTP/1.1 request into a `Buffer` ready to be written to a
|
|
4
|
+
* socket. Merges `defaultHeaders` (lowest priority) with `request.headers`
|
|
5
|
+
* (highest priority), computes `Content-Length` when a body is present,
|
|
6
|
+
* and validates header names and values for forbidden characters.
|
|
7
|
+
*
|
|
8
|
+
* @param {NLcURLRequest} request - The request to encode.
|
|
9
|
+
* @param {Array<[string,string]>} defaultHeaders - Profile-level default headers.
|
|
10
|
+
* @returns {Buffer} Encoded HTTP/1.1 request bytes including headers and body.
|
|
11
|
+
* @throws {Error} If any header name or value contains CR, LF, or NUL characters.
|
|
9
12
|
*/
|
|
10
13
|
export declare function encodeRequest(request: NLcURLRequest, defaultHeaders: Array<[string, string]>): Buffer;
|
|
11
14
|
//# sourceMappingURL=encoder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../src/http/h1/encoder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../src/http/h1/encoder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,uBAAuB,CAAC;AAExE;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,cAAc,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACtC,MAAM,CAoDR"}
|
package/dist/http/h1/encoder.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP/1.1 request
|
|
2
|
+
* Serializes an HTTP/1.1 request into a `Buffer` ready to be written to a
|
|
3
|
+
* socket. Merges `defaultHeaders` (lowest priority) with `request.headers`
|
|
4
|
+
* (highest priority), computes `Content-Length` when a body is present,
|
|
5
|
+
* and validates header names and values for forbidden characters.
|
|
3
6
|
*
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*
|
|
7
|
+
* @param {NLcURLRequest} request - The request to encode.
|
|
8
|
+
* @param {Array<[string,string]>} defaultHeaders - Profile-level default headers.
|
|
9
|
+
* @returns {Buffer} Encoded HTTP/1.1 request bytes including headers and body.
|
|
10
|
+
* @throws {Error} If any header name or value contains CR, LF, or NUL characters.
|
|
8
11
|
*/
|
|
9
12
|
export function encodeRequest(request, defaultHeaders) {
|
|
10
13
|
const url = new URL(request.url);
|
|
@@ -14,23 +17,18 @@ export function encodeRequest(request, defaultHeaders) {
|
|
|
14
17
|
: url.hostname;
|
|
15
18
|
const lines = [];
|
|
16
19
|
lines.push(`${request.method} ${path} HTTP/1.1`);
|
|
17
|
-
// Collect headers -- merge defaults under request headers
|
|
18
20
|
const headerMap = new Map();
|
|
19
|
-
// Apply default headers first (lowercase keys)
|
|
20
21
|
for (const [k, v] of defaultHeaders) {
|
|
21
22
|
headerMap.set(k.toLowerCase(), v);
|
|
22
23
|
}
|
|
23
|
-
// Host header
|
|
24
24
|
if (!headerMap.has('host')) {
|
|
25
25
|
headerMap.set('host', host);
|
|
26
26
|
}
|
|
27
|
-
// Apply request headers (override defaults)
|
|
28
27
|
if (request.headers) {
|
|
29
28
|
for (const [k, v] of Object.entries(request.headers)) {
|
|
30
29
|
headerMap.set(k.toLowerCase(), v);
|
|
31
30
|
}
|
|
32
31
|
}
|
|
33
|
-
// Body handling
|
|
34
32
|
let bodyBuffer;
|
|
35
33
|
if (request.body !== undefined && request.body !== null) {
|
|
36
34
|
bodyBuffer = serializeBody(request.body);
|
|
@@ -41,7 +39,6 @@ export function encodeRequest(request, defaultHeaders) {
|
|
|
41
39
|
headerMap.set('content-type', 'application/x-www-form-urlencoded');
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
|
-
// Emit headers (validate against CRLF injection)
|
|
45
42
|
for (const [k, v] of headerMap) {
|
|
46
43
|
if (/[\r\n\0]/.test(k) || /[\r\n\0]/.test(v)) {
|
|
47
44
|
throw new Error(`Invalid header: name or value contains forbidden characters`);
|
|
@@ -69,7 +66,6 @@ function serializeBody(body) {
|
|
|
69
66
|
if (typeof body === 'object' && !(body instanceof ReadableStream)) {
|
|
70
67
|
return Buffer.from(JSON.stringify(body), 'utf-8');
|
|
71
68
|
}
|
|
72
|
-
// ReadableStream: not supported in synchronous encoding
|
|
73
69
|
return Buffer.alloc(0);
|
|
74
70
|
}
|
|
75
71
|
//# sourceMappingURL=encoder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../src/http/h1/encoder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../src/http/h1/encoder.ts"],"names":[],"mappings":"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"}
|
package/dist/http/h1/parser.d.ts
CHANGED
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP/1.1 response
|
|
2
|
+
* Represents a fully parsed HTTP/1.1 response, including status, headers, and
|
|
3
|
+
* the buffered body.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
* @typedef {Object} ParsedResponse
|
|
6
|
+
* @property {string} httpVersion - HTTP version string (e.g. `"HTTP/1.1"`).
|
|
7
|
+
* @property {number} statusCode - HTTP status code.
|
|
8
|
+
* @property {string} statusMessage - HTTP status text.
|
|
9
|
+
* @property {Map<string,string>} headers - Normalized, lowercase header map.
|
|
10
|
+
* @property {Array<[string,string]>} rawHeaders - Original header pairs in transmission order.
|
|
11
|
+
* @property {Buffer} body - Fully buffered, unchunked response body.
|
|
6
12
|
*/
|
|
7
13
|
export interface ParsedResponse {
|
|
8
14
|
httpVersion: string;
|
|
9
15
|
statusCode: number;
|
|
10
16
|
statusMessage: string;
|
|
11
17
|
headers: Map<string, string>;
|
|
12
|
-
/** Raw header entries preserving order and case. */
|
|
13
18
|
rawHeaders: Array<[string, string]>;
|
|
14
19
|
body: Buffer;
|
|
15
20
|
}
|
|
16
21
|
/**
|
|
17
|
-
* Incremental HTTP/1.1 response parser.
|
|
22
|
+
* Incremental HTTP/1.1 response parser. Feed data buffers via {@link HttpResponseParser.feed}
|
|
23
|
+
* until it returns `true`, then retrieve the result via {@link HttpResponseParser.getResult}.
|
|
24
|
+
* Supports chunked transfer encoding, content-length delimited bodies, and
|
|
25
|
+
* connection-close terminated bodies.
|
|
18
26
|
*/
|
|
19
27
|
export declare class HttpResponseParser {
|
|
20
28
|
private requestMethod;
|
|
@@ -30,31 +38,77 @@ export declare class HttpResponseParser {
|
|
|
30
38
|
private bodyChunks;
|
|
31
39
|
private bodyBytesRead;
|
|
32
40
|
private result;
|
|
33
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* Optional callback invoked for each body chunk received in streaming mode.
|
|
43
|
+
* When set, each chunk is forwarded here in addition to being buffered
|
|
44
|
+
* internally.
|
|
45
|
+
*
|
|
46
|
+
* @type {((chunk: Buffer) => void) | undefined}
|
|
47
|
+
*/
|
|
48
|
+
onBodyChunk?: (chunk: Buffer) => void;
|
|
34
49
|
private static readonly MAX_HEADER_SIZE;
|
|
35
|
-
/** Maximum body size (128 MB). */
|
|
36
50
|
private static readonly MAX_BODY_SIZE;
|
|
51
|
+
/**
|
|
52
|
+
* Creates a new HttpResponseParser.
|
|
53
|
+
*
|
|
54
|
+
* @param {string} [requestMethod='GET'] - HTTP method of the originating request.
|
|
55
|
+
* Required to correctly determine whether a body is expected (e.g. HEAD has no body).
|
|
56
|
+
*/
|
|
37
57
|
constructor(requestMethod?: string);
|
|
38
58
|
/**
|
|
39
|
-
*
|
|
59
|
+
* Appends `data` to the internal buffer and advances the parser state
|
|
60
|
+
* machine. Returns `true` when a complete response has been parsed.
|
|
40
61
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
62
|
+
* @param {Buffer} data - Bytes received from the transport stream.
|
|
63
|
+
* @returns {boolean} `true` if the response is complete and
|
|
64
|
+
* {@link HttpResponseParser.getResult} may be called; `false` if more data is needed.
|
|
65
|
+
* @throws {Error} If any parse error is encountered (malformed status line, invalid header, etc.).
|
|
44
66
|
*/
|
|
45
67
|
feed(data: Buffer): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Returns the fully parsed response. Must only be called after
|
|
70
|
+
* {@link HttpResponseParser.feed} has returned `true`.
|
|
71
|
+
*
|
|
72
|
+
* @returns {ParsedResponse} The complete parsed response.
|
|
73
|
+
* @throws {Error} If the response has not been fully parsed yet.
|
|
74
|
+
*/
|
|
46
75
|
getResult(): ParsedResponse;
|
|
47
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Returns `true` once all response headers have been parsed, regardless
|
|
78
|
+
* of whether the body is complete.
|
|
79
|
+
*
|
|
80
|
+
* @returns {boolean} Whether headers have been fully parsed.
|
|
81
|
+
*/
|
|
82
|
+
get headersParsed(): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Returns the parsed status line and headers without requiring a complete
|
|
85
|
+
* body. May be called as soon as {@link HttpResponseParser.headersParsed} is `true`.
|
|
86
|
+
*
|
|
87
|
+
* @returns {Omit<ParsedResponse, 'body'>} Status and header data without the body.
|
|
88
|
+
* @throws {Error} If headers have not been fully parsed yet.
|
|
89
|
+
*/
|
|
90
|
+
getHeadersResult(): Omit<ParsedResponse, 'body'>;
|
|
91
|
+
/**
|
|
92
|
+
* Returns any bytes remaining in the internal buffer after the last
|
|
93
|
+
* complete response. Useful when the transport stream carries pipelined
|
|
94
|
+
* responses.
|
|
95
|
+
*
|
|
96
|
+
* @returns {Buffer} Unconsumed bytes beyond the end of the current response.
|
|
97
|
+
*/
|
|
48
98
|
getRemainder(): Buffer;
|
|
49
99
|
private parseStatusLine;
|
|
50
100
|
private parseHeaders;
|
|
51
101
|
private finalizeHeaders;
|
|
52
102
|
private parseBody;
|
|
53
103
|
private parseChunkedBody;
|
|
104
|
+
private emitOrAccumulate;
|
|
54
105
|
private finalize;
|
|
55
106
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
107
|
+
* Signals the parser that the underlying TCP connection was closed by the
|
|
108
|
+
* remote peer — used for HTTP/1.x responses whose body is delimited by
|
|
109
|
+
* connection closure rather than a `Content-Length` header or chunked
|
|
110
|
+
* transfer encoding. Triggers finalization so callers can retrieve the
|
|
111
|
+
* accumulated body via {@link getResult}.
|
|
58
112
|
*/
|
|
59
113
|
connectionClosed(): void;
|
|
60
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/http/h1/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/http/h1/parser.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAUD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAA+B;IAE7C;;;;;;OAMG;IACI,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAU;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAa;IAElD;;;;;OAKG;gBACS,aAAa,SAAQ;IAIjC;;;;;;;;OAQG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAuB3B;;;;;;OAMG;IACH,SAAS,IAAI,cAAc;IAO3B;;;;;OAKG;IACH,IAAI,aAAa,IAAI,OAAO,CAI3B;IAED;;;;;;OAMG;IACH,gBAAgB,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC;IAahD;;;;;;OAMG;IACH,YAAY,IAAI,MAAM;IAItB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,YAAY;IAsCpB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,QAAQ;IAYhB;;;;;;OAMG;IACH,gBAAgB,IAAI,IAAI;CAKzB"}
|
package/dist/http/h1/parser.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP/1.1 response parser.
|
|
3
|
-
*
|
|
4
|
-
* Incrementally parses HTTP/1.1 responses from a byte stream.
|
|
5
|
-
* Handles chunked transfer encoding and content-length framing.
|
|
6
|
-
*/
|
|
7
1
|
var ParserState;
|
|
8
2
|
(function (ParserState) {
|
|
9
3
|
ParserState[ParserState["StatusLine"] = 0] = "StatusLine";
|
|
@@ -13,7 +7,10 @@ var ParserState;
|
|
|
13
7
|
ParserState[ParserState["Complete"] = 4] = "Complete";
|
|
14
8
|
})(ParserState || (ParserState = {}));
|
|
15
9
|
/**
|
|
16
|
-
* Incremental HTTP/1.1 response parser.
|
|
10
|
+
* Incremental HTTP/1.1 response parser. Feed data buffers via {@link HttpResponseParser.feed}
|
|
11
|
+
* until it returns `true`, then retrieve the result via {@link HttpResponseParser.getResult}.
|
|
12
|
+
* Supports chunked transfer encoding, content-length delimited bodies, and
|
|
13
|
+
* connection-close terminated bodies.
|
|
17
14
|
*/
|
|
18
15
|
export class HttpResponseParser {
|
|
19
16
|
requestMethod;
|
|
@@ -29,19 +26,33 @@ export class HttpResponseParser {
|
|
|
29
26
|
bodyChunks = [];
|
|
30
27
|
bodyBytesRead = 0;
|
|
31
28
|
result = null;
|
|
32
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Optional callback invoked for each body chunk received in streaming mode.
|
|
31
|
+
* When set, each chunk is forwarded here in addition to being buffered
|
|
32
|
+
* internally.
|
|
33
|
+
*
|
|
34
|
+
* @type {((chunk: Buffer) => void) | undefined}
|
|
35
|
+
*/
|
|
36
|
+
onBodyChunk;
|
|
33
37
|
static MAX_HEADER_SIZE = 262144;
|
|
34
|
-
/** Maximum body size (128 MB). */
|
|
35
38
|
static MAX_BODY_SIZE = 134217728;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a new HttpResponseParser.
|
|
41
|
+
*
|
|
42
|
+
* @param {string} [requestMethod='GET'] - HTTP method of the originating request.
|
|
43
|
+
* Required to correctly determine whether a body is expected (e.g. HEAD has no body).
|
|
44
|
+
*/
|
|
36
45
|
constructor(requestMethod = 'GET') {
|
|
37
46
|
this.requestMethod = requestMethod.toUpperCase();
|
|
38
47
|
}
|
|
39
48
|
/**
|
|
40
|
-
*
|
|
49
|
+
* Appends `data` to the internal buffer and advances the parser state
|
|
50
|
+
* machine. Returns `true` when a complete response has been parsed.
|
|
41
51
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
52
|
+
* @param {Buffer} data - Bytes received from the transport stream.
|
|
53
|
+
* @returns {boolean} `true` if the response is complete and
|
|
54
|
+
* {@link HttpResponseParser.getResult} may be called; `false` if more data is needed.
|
|
55
|
+
* @throws {Error} If any parse error is encountered (malformed status line, invalid header, etc.).
|
|
45
56
|
*/
|
|
46
57
|
feed(data) {
|
|
47
58
|
this.buffer = Buffer.concat([this.buffer, data]);
|
|
@@ -67,13 +78,56 @@ export class HttpResponseParser {
|
|
|
67
78
|
}
|
|
68
79
|
return true;
|
|
69
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Returns the fully parsed response. Must only be called after
|
|
83
|
+
* {@link HttpResponseParser.feed} has returned `true`.
|
|
84
|
+
*
|
|
85
|
+
* @returns {ParsedResponse} The complete parsed response.
|
|
86
|
+
* @throws {Error} If the response has not been fully parsed yet.
|
|
87
|
+
*/
|
|
70
88
|
getResult() {
|
|
71
89
|
if (!this.result) {
|
|
72
90
|
throw new Error('Response not fully parsed');
|
|
73
91
|
}
|
|
74
92
|
return this.result;
|
|
75
93
|
}
|
|
76
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* Returns `true` once all response headers have been parsed, regardless
|
|
96
|
+
* of whether the body is complete.
|
|
97
|
+
*
|
|
98
|
+
* @returns {boolean} Whether headers have been fully parsed.
|
|
99
|
+
*/
|
|
100
|
+
get headersParsed() {
|
|
101
|
+
return this.state === ParserState.Body
|
|
102
|
+
|| this.state === ParserState.ChunkedBody
|
|
103
|
+
|| this.state === ParserState.Complete;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Returns the parsed status line and headers without requiring a complete
|
|
107
|
+
* body. May be called as soon as {@link HttpResponseParser.headersParsed} is `true`.
|
|
108
|
+
*
|
|
109
|
+
* @returns {Omit<ParsedResponse, 'body'>} Status and header data without the body.
|
|
110
|
+
* @throws {Error} If headers have not been fully parsed yet.
|
|
111
|
+
*/
|
|
112
|
+
getHeadersResult() {
|
|
113
|
+
if (!this.headersParsed) {
|
|
114
|
+
throw new Error('Headers not fully parsed');
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
httpVersion: this.httpVersion,
|
|
118
|
+
statusCode: this.statusCode,
|
|
119
|
+
statusMessage: this.statusMessage,
|
|
120
|
+
headers: this.headers,
|
|
121
|
+
rawHeaders: this.rawHeaders,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Returns any bytes remaining in the internal buffer after the last
|
|
126
|
+
* complete response. Useful when the transport stream carries pipelined
|
|
127
|
+
* responses.
|
|
128
|
+
*
|
|
129
|
+
* @returns {Buffer} Unconsumed bytes beyond the end of the current response.
|
|
130
|
+
*/
|
|
77
131
|
getRemainder() {
|
|
78
132
|
return this.buffer;
|
|
79
133
|
}
|
|
@@ -109,7 +163,6 @@ export class HttpResponseParser {
|
|
|
109
163
|
const line = this.buffer.subarray(0, idx).toString('latin1');
|
|
110
164
|
this.buffer = this.buffer.subarray(idx + 2);
|
|
111
165
|
if (line === '') {
|
|
112
|
-
// End of headers
|
|
113
166
|
this.finalizeHeaders();
|
|
114
167
|
return true;
|
|
115
168
|
}
|
|
@@ -123,7 +176,8 @@ export class HttpResponseParser {
|
|
|
123
176
|
const lower = name.toLowerCase();
|
|
124
177
|
const existing = this.headers.get(lower);
|
|
125
178
|
if (existing !== undefined) {
|
|
126
|
-
|
|
179
|
+
const sep = lower === 'set-cookie' ? '; ' : ', ';
|
|
180
|
+
this.headers.set(lower, existing + sep + value);
|
|
127
181
|
}
|
|
128
182
|
else {
|
|
129
183
|
this.headers.set(lower, value);
|
|
@@ -131,12 +185,10 @@ export class HttpResponseParser {
|
|
|
131
185
|
}
|
|
132
186
|
}
|
|
133
187
|
finalizeHeaders() {
|
|
134
|
-
// HEAD responses never have a body (RFC 9110 §9.3.2)
|
|
135
188
|
if (this.requestMethod === 'HEAD') {
|
|
136
189
|
this.finalize();
|
|
137
190
|
return;
|
|
138
191
|
}
|
|
139
|
-
// Determine body framing
|
|
140
192
|
const te = this.headers.get('transfer-encoding');
|
|
141
193
|
if (te && te.toLowerCase().includes('chunked')) {
|
|
142
194
|
this.isChunked = true;
|
|
@@ -156,16 +208,12 @@ export class HttpResponseParser {
|
|
|
156
208
|
this.state = ParserState.Body;
|
|
157
209
|
return;
|
|
158
210
|
}
|
|
159
|
-
// No content-length, no chunked -- could be:
|
|
160
|
-
// 1xx, 204, 304 → no body
|
|
161
|
-
// Everything else → read until connection close
|
|
162
211
|
if (this.statusCode === 204 ||
|
|
163
212
|
this.statusCode === 304 ||
|
|
164
213
|
(this.statusCode >= 100 && this.statusCode < 200)) {
|
|
165
214
|
this.finalize();
|
|
166
215
|
return;
|
|
167
216
|
}
|
|
168
|
-
// Read until close -- set contentLength to a sentinel
|
|
169
217
|
this.contentLength = -1;
|
|
170
218
|
this.state = ParserState.Body;
|
|
171
219
|
}
|
|
@@ -173,23 +221,24 @@ export class HttpResponseParser {
|
|
|
173
221
|
if (this.contentLength >= 0) {
|
|
174
222
|
const needed = this.contentLength - this.bodyBytesRead;
|
|
175
223
|
if (this.buffer.length >= needed) {
|
|
176
|
-
this.
|
|
224
|
+
const chunk = this.buffer.subarray(0, needed);
|
|
225
|
+
this.emitOrAccumulate(chunk);
|
|
177
226
|
this.bodyBytesRead += needed;
|
|
178
227
|
this.buffer = this.buffer.subarray(needed);
|
|
179
228
|
this.finalize();
|
|
180
229
|
return true;
|
|
181
230
|
}
|
|
182
|
-
|
|
183
|
-
this.
|
|
231
|
+
const chunk = Buffer.from(this.buffer);
|
|
232
|
+
this.emitOrAccumulate(chunk);
|
|
184
233
|
this.bodyBytesRead += this.buffer.length;
|
|
185
234
|
this.buffer = Buffer.alloc(0);
|
|
186
235
|
return false;
|
|
187
236
|
}
|
|
188
|
-
// Read until close -- accumulate everything
|
|
189
237
|
if (this.buffer.length > 0) {
|
|
190
|
-
|
|
238
|
+
const chunk = Buffer.from(this.buffer);
|
|
239
|
+
this.emitOrAccumulate(chunk);
|
|
191
240
|
this.bodyBytesRead += this.buffer.length;
|
|
192
|
-
if (this.bodyBytesRead > HttpResponseParser.MAX_BODY_SIZE) {
|
|
241
|
+
if (!this.onBodyChunk && this.bodyBytesRead > HttpResponseParser.MAX_BODY_SIZE) {
|
|
193
242
|
throw new Error('Response body exceeds maximum size');
|
|
194
243
|
}
|
|
195
244
|
this.buffer = Buffer.alloc(0);
|
|
@@ -198,26 +247,21 @@ export class HttpResponseParser {
|
|
|
198
247
|
}
|
|
199
248
|
parseChunkedBody() {
|
|
200
249
|
while (true) {
|
|
201
|
-
// Read chunk size line
|
|
202
250
|
const idx = this.buffer.indexOf('\r\n');
|
|
203
251
|
if (idx === -1)
|
|
204
252
|
return false;
|
|
205
253
|
const sizeLine = this.buffer.subarray(0, idx).toString('latin1').trim();
|
|
206
|
-
// Chunk extensions are ignored (per spec)
|
|
207
254
|
const semiIdx = sizeLine.indexOf(';');
|
|
208
255
|
const sizeStr = semiIdx >= 0 ? sizeLine.substring(0, semiIdx) : sizeLine;
|
|
209
256
|
const chunkSize = parseInt(sizeStr, 16);
|
|
210
257
|
if (Number.isNaN(chunkSize)) {
|
|
211
258
|
throw new Error(`Invalid chunk size: ${sizeLine.substring(0, 20)}`);
|
|
212
259
|
}
|
|
213
|
-
// Need: chunk-size-line + \r\n + chunk-data + \r\n
|
|
214
260
|
const totalNeeded = idx + 2 + chunkSize + 2;
|
|
215
261
|
if (this.buffer.length < totalNeeded)
|
|
216
262
|
return false;
|
|
217
263
|
if (chunkSize === 0) {
|
|
218
|
-
// Terminal chunk
|
|
219
264
|
this.buffer = this.buffer.subarray(totalNeeded);
|
|
220
|
-
// Skip optional trailers
|
|
221
265
|
const trailerEnd = this.buffer.indexOf('\r\n');
|
|
222
266
|
if (trailerEnd >= 0) {
|
|
223
267
|
this.buffer = this.buffer.subarray(trailerEnd + 2);
|
|
@@ -226,14 +270,22 @@ export class HttpResponseParser {
|
|
|
226
270
|
return true;
|
|
227
271
|
}
|
|
228
272
|
const chunkData = this.buffer.subarray(idx + 2, idx + 2 + chunkSize);
|
|
229
|
-
this.
|
|
273
|
+
this.emitOrAccumulate(Buffer.from(chunkData));
|
|
230
274
|
this.bodyBytesRead += chunkSize;
|
|
231
|
-
if (this.bodyBytesRead > HttpResponseParser.MAX_BODY_SIZE) {
|
|
275
|
+
if (!this.onBodyChunk && this.bodyBytesRead > HttpResponseParser.MAX_BODY_SIZE) {
|
|
232
276
|
throw new Error('Response body exceeds maximum size');
|
|
233
277
|
}
|
|
234
278
|
this.buffer = this.buffer.subarray(totalNeeded);
|
|
235
279
|
}
|
|
236
280
|
}
|
|
281
|
+
emitOrAccumulate(chunk) {
|
|
282
|
+
if (this.onBodyChunk) {
|
|
283
|
+
this.onBodyChunk(chunk);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
this.bodyChunks.push(chunk);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
237
289
|
finalize() {
|
|
238
290
|
this.state = ParserState.Complete;
|
|
239
291
|
this.result = {
|
|
@@ -246,8 +298,11 @@ export class HttpResponseParser {
|
|
|
246
298
|
};
|
|
247
299
|
}
|
|
248
300
|
/**
|
|
249
|
-
*
|
|
250
|
-
*
|
|
301
|
+
* Signals the parser that the underlying TCP connection was closed by the
|
|
302
|
+
* remote peer — used for HTTP/1.x responses whose body is delimited by
|
|
303
|
+
* connection closure rather than a `Content-Length` header or chunked
|
|
304
|
+
* transfer encoding. Triggers finalization so callers can retrieve the
|
|
305
|
+
* accumulated body via {@link getResult}.
|
|
251
306
|
*/
|
|
252
307
|
connectionClosed() {
|
|
253
308
|
if (this.state === ParserState.Body && this.contentLength === -1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/http/h1/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/http/h1/parser.ts"],"names":[],"mappings":"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"}
|