UNPKG

25.7 kBTypeScriptView Raw
1declare module 'http' {
2 import * as stream from 'stream';
3 import { URL } from 'url';
4 import { Socket, Server as NetServer, LookupFunction } from 'net';
5
6 // incoming headers will never contain number
7 interface IncomingHttpHeaders extends NodeJS.Dict<string | string[]> {
8 'accept'?: string | undefined;
9 'accept-language'?: string | undefined;
10 'accept-patch'?: string | undefined;
11 'accept-ranges'?: string | undefined;
12 'access-control-allow-credentials'?: string | undefined;
13 'access-control-allow-headers'?: string | undefined;
14 'access-control-allow-methods'?: string | undefined;
15 'access-control-allow-origin'?: string | undefined;
16 'access-control-expose-headers'?: string | undefined;
17 'access-control-max-age'?: string | undefined;
18 'access-control-request-headers'?: string | undefined;
19 'access-control-request-method'?: string | undefined;
20 'age'?: string | undefined;
21 'allow'?: string | undefined;
22 'alt-svc'?: string | undefined;
23 'authorization'?: string | undefined;
24 'cache-control'?: string | undefined;
25 'connection'?: string | undefined;
26 'content-disposition'?: string | undefined;
27 'content-encoding'?: string | undefined;
28 'content-language'?: string | undefined;
29 'content-length'?: string | undefined;
30 'content-location'?: string | undefined;
31 'content-range'?: string | undefined;
32 'content-type'?: string | undefined;
33 'cookie'?: string | undefined;
34 'date'?: string | undefined;
35 'etag'?: string | undefined;
36 'expect'?: string | undefined;
37 'expires'?: string | undefined;
38 'forwarded'?: string | undefined;
39 'from'?: string | undefined;
40 'host'?: string | undefined;
41 'if-match'?: string | undefined;
42 'if-modified-since'?: string | undefined;
43 'if-none-match'?: string | undefined;
44 'if-unmodified-since'?: string | undefined;
45 'last-modified'?: string | undefined;
46 'location'?: string | undefined;
47 'origin'?: string | undefined;
48 'pragma'?: string | undefined;
49 'proxy-authenticate'?: string | undefined;
50 'proxy-authorization'?: string | undefined;
51 'public-key-pins'?: string | undefined;
52 'range'?: string | undefined;
53 'referer'?: string | undefined;
54 'retry-after'?: string | undefined;
55 'sec-websocket-accept'?: string | undefined;
56 'sec-websocket-extensions'?: string | undefined;
57 'sec-websocket-key'?: string | undefined;
58 'sec-websocket-protocol'?: string | undefined;
59 'sec-websocket-version'?: string | undefined;
60 'set-cookie'?: string[] | undefined;
61 'strict-transport-security'?: string | undefined;
62 'tk'?: string | undefined;
63 'trailer'?: string | undefined;
64 'transfer-encoding'?: string | undefined;
65 'upgrade'?: string | undefined;
66 'user-agent'?: string | undefined;
67 'vary'?: string | undefined;
68 'via'?: string | undefined;
69 'warning'?: string | undefined;
70 'www-authenticate'?: string | undefined;
71 }
72
73 // outgoing headers allows numbers (as they are converted internally to strings)
74 type OutgoingHttpHeader = number | string | string[];
75
76 interface OutgoingHttpHeaders extends NodeJS.Dict<OutgoingHttpHeader> {
77 }
78
79 interface ClientRequestArgs {
80 protocol?: string | null | undefined;
81 host?: string | null | undefined;
82 hostname?: string | null | undefined;
83 family?: number | undefined;
84 port?: number | string | null | undefined;
85 defaultPort?: number | string | undefined;
86 localAddress?: string | undefined;
87 socketPath?: string | undefined;
88 /**
89 * @default 8192
90 */
91 maxHeaderSize?: number | undefined;
92 method?: string | undefined;
93 path?: string | null | undefined;
94 headers?: OutgoingHttpHeaders | undefined;
95 auth?: string | null | undefined;
96 agent?: Agent | boolean | undefined;
97 _defaultAgent?: Agent | undefined;
98 timeout?: number | undefined;
99 setHost?: boolean | undefined;
100 // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278
101 createConnection?: ((options: ClientRequestArgs, oncreate: (err: Error, socket: Socket) => void) => Socket) | undefined;
102 lookup?: LookupFunction | undefined;
103 }
104
105 interface ServerOptions {
106 IncomingMessage?: typeof IncomingMessage | undefined;
107 ServerResponse?: typeof ServerResponse | undefined;
108 /**
109 * Optionally overrides the value of
110 * [`--max-http-header-size`][] for requests received by this server, i.e.
111 * the maximum length of request headers in bytes.
112 * @default 8192
113 */
114 maxHeaderSize?: number | undefined;
115 /**
116 * Use an insecure HTTP parser that accepts invalid HTTP headers when true.
117 * Using the insecure parser should be avoided.
118 * See --insecure-http-parser for more information.
119 * @default false
120 */
121 insecureHTTPParser?: boolean | undefined;
122 }
123
124 type RequestListener = (req: IncomingMessage, res: ServerResponse) => void;
125
126 class Server extends NetServer {
127 constructor(requestListener?: RequestListener);
128 constructor(options: ServerOptions, requestListener?: RequestListener);
129 setTimeout(msecs?: number, callback?: () => void): this;
130 setTimeout(callback: () => void): this;
131 /**
132 * Limits maximum incoming headers count. If set to 0, no limit will be applied.
133 * @default 2000
134 * {@link https://nodejs.org/api/http.html#http_server_maxheaderscount}
135 */
136 maxHeadersCount: number | null;
137 timeout: number;
138 /**
139 * Limit the amount of time the parser will wait to receive the complete HTTP headers.
140 * @default 60000
141 * {@link https://nodejs.org/api/http.html#http_server_headerstimeout}
142 */
143 headersTimeout: number;
144 keepAliveTimeout: number;
145 /**
146 * Sets the timeout value in milliseconds for receiving the entire request from the client.
147 * @default 0
148 * {@link https://nodejs.org/api/http.html#http_server_requesttimeout}
149 */
150 requestTimeout: number;
151 addListener(event: string, listener: (...args: any[]) => void): this;
152 addListener(event: 'close', listener: () => void): this;
153 addListener(event: 'connection', listener: (socket: Socket) => void): this;
154 addListener(event: 'error', listener: (err: Error) => void): this;
155 addListener(event: 'listening', listener: () => void): this;
156 addListener(event: 'checkContinue', listener: RequestListener): this;
157 addListener(event: 'checkExpectation', listener: RequestListener): this;
158 addListener(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
159 addListener(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
160 addListener(event: 'request', listener: RequestListener): this;
161 addListener(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
162 emit(event: string, ...args: any[]): boolean;
163 emit(event: 'close'): boolean;
164 emit(event: 'connection', socket: Socket): boolean;
165 emit(event: 'error', err: Error): boolean;
166 emit(event: 'listening'): boolean;
167 emit(event: 'checkContinue', req: IncomingMessage, res: ServerResponse): boolean;
168 emit(event: 'checkExpectation', req: IncomingMessage, res: ServerResponse): boolean;
169 emit(event: 'clientError', err: Error, socket: stream.Duplex): boolean;
170 emit(event: 'connect', req: IncomingMessage, socket: stream.Duplex, head: Buffer): boolean;
171 emit(event: 'request', req: IncomingMessage, res: ServerResponse): boolean;
172 emit(event: 'upgrade', req: IncomingMessage, socket: stream.Duplex, head: Buffer): boolean;
173 on(event: string, listener: (...args: any[]) => void): this;
174 on(event: 'close', listener: () => void): this;
175 on(event: 'connection', listener: (socket: Socket) => void): this;
176 on(event: 'error', listener: (err: Error) => void): this;
177 on(event: 'listening', listener: () => void): this;
178 on(event: 'checkContinue', listener: RequestListener): this;
179 on(event: 'checkExpectation', listener: RequestListener): this;
180 on(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
181 on(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
182 on(event: 'request', listener: RequestListener): this;
183 on(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
184 once(event: string, listener: (...args: any[]) => void): this;
185 once(event: 'close', listener: () => void): this;
186 once(event: 'connection', listener: (socket: Socket) => void): this;
187 once(event: 'error', listener: (err: Error) => void): this;
188 once(event: 'listening', listener: () => void): this;
189 once(event: 'checkContinue', listener: RequestListener): this;
190 once(event: 'checkExpectation', listener: RequestListener): this;
191 once(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
192 once(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
193 once(event: 'request', listener: RequestListener): this;
194 once(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
195 prependListener(event: string, listener: (...args: any[]) => void): this;
196 prependListener(event: 'close', listener: () => void): this;
197 prependListener(event: 'connection', listener: (socket: Socket) => void): this;
198 prependListener(event: 'error', listener: (err: Error) => void): this;
199 prependListener(event: 'listening', listener: () => void): this;
200 prependListener(event: 'checkContinue', listener: RequestListener): this;
201 prependListener(event: 'checkExpectation', listener: RequestListener): this;
202 prependListener(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
203 prependListener(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
204 prependListener(event: 'request', listener: RequestListener): this;
205 prependListener(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
206 prependOnceListener(event: string, listener: (...args: any[]) => void): this;
207 prependOnceListener(event: 'close', listener: () => void): this;
208 prependOnceListener(event: 'connection', listener: (socket: Socket) => void): this;
209 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
210 prependOnceListener(event: 'listening', listener: () => void): this;
211 prependOnceListener(event: 'checkContinue', listener: RequestListener): this;
212 prependOnceListener(event: 'checkExpectation', listener: RequestListener): this;
213 prependOnceListener(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
214 prependOnceListener(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
215 prependOnceListener(event: 'request', listener: RequestListener): this;
216 prependOnceListener(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
217 }
218
219 // https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js
220 class OutgoingMessage extends stream.Writable {
221 upgrading: boolean;
222 chunkedEncoding: boolean;
223 shouldKeepAlive: boolean;
224 useChunkedEncodingByDefault: boolean;
225 sendDate: boolean;
226 /**
227 * @deprecated Use `writableEnded` instead.
228 */
229 finished: boolean;
230 headersSent: boolean;
231 /**
232 * @deprecated Use `socket` instead.
233 */
234 connection: Socket | null;
235 socket: Socket | null;
236
237 constructor();
238
239 setTimeout(msecs: number, callback?: () => void): this;
240 setHeader(name: string, value: number | string | ReadonlyArray<string>): this;
241 getHeader(name: string): number | string | string[] | undefined;
242 getHeaders(): OutgoingHttpHeaders;
243 getHeaderNames(): string[];
244 hasHeader(name: string): boolean;
245 removeHeader(name: string): void;
246 addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>): void;
247 flushHeaders(): void;
248 }
249
250 // https://github.com/nodejs/node/blob/master/lib/_http_server.js#L108-L256
251 class ServerResponse extends OutgoingMessage {
252 statusCode: number;
253 statusMessage: string;
254
255 constructor(req: IncomingMessage);
256
257 assignSocket(socket: Socket): void;
258 detachSocket(socket: Socket): void;
259 // https://github.com/nodejs/node/blob/master/test/parallel/test-http-write-callbacks.js#L53
260 // no args in writeContinue callback
261 writeContinue(callback?: () => void): void;
262 writeHead(statusCode: number, statusMessage?: string, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
263 writeHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
264 writeProcessing(): void;
265 }
266
267 interface InformationEvent {
268 statusCode: number;
269 statusMessage: string;
270 httpVersion: string;
271 httpVersionMajor: number;
272 httpVersionMinor: number;
273 headers: IncomingHttpHeaders;
274 rawHeaders: string[];
275 }
276
277 // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77
278 class ClientRequest extends OutgoingMessage {
279 aborted: boolean;
280 host: string;
281 protocol: string;
282 reusedSocket: boolean;
283 maxHeadersCount: number;
284
285 constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void);
286
287 method: string;
288 path: string;
289 /** @deprecated since v14.1.0 Use `request.destroy()` instead. */
290 abort(): void;
291 onSocket(socket: Socket): void;
292 setTimeout(timeout: number, callback?: () => void): this;
293 setNoDelay(noDelay?: boolean): void;
294 setSocketKeepAlive(enable?: boolean, initialDelay?: number): void;
295
296 addListener(event: 'abort', listener: () => void): this;
297 addListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
298 addListener(event: 'continue', listener: () => void): this;
299 addListener(event: 'information', listener: (info: InformationEvent) => void): this;
300 addListener(event: 'response', listener: (response: IncomingMessage) => void): this;
301 addListener(event: 'socket', listener: (socket: Socket) => void): this;
302 addListener(event: 'timeout', listener: () => void): this;
303 addListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
304 addListener(event: 'close', listener: () => void): this;
305 addListener(event: 'drain', listener: () => void): this;
306 addListener(event: 'error', listener: (err: Error) => void): this;
307 addListener(event: 'finish', listener: () => void): this;
308 addListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
309 addListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
310 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
311
312 on(event: 'abort', listener: () => void): this;
313 on(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
314 on(event: 'continue', listener: () => void): this;
315 on(event: 'information', listener: (info: InformationEvent) => void): this;
316 on(event: 'response', listener: (response: IncomingMessage) => void): this;
317 on(event: 'socket', listener: (socket: Socket) => void): this;
318 on(event: 'timeout', listener: () => void): this;
319 on(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
320 on(event: 'close', listener: () => void): this;
321 on(event: 'drain', listener: () => void): this;
322 on(event: 'error', listener: (err: Error) => void): this;
323 on(event: 'finish', listener: () => void): this;
324 on(event: 'pipe', listener: (src: stream.Readable) => void): this;
325 on(event: 'unpipe', listener: (src: stream.Readable) => void): this;
326 on(event: string | symbol, listener: (...args: any[]) => void): this;
327
328 once(event: 'abort', listener: () => void): this;
329 once(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
330 once(event: 'continue', listener: () => void): this;
331 once(event: 'information', listener: (info: InformationEvent) => void): this;
332 once(event: 'response', listener: (response: IncomingMessage) => void): this;
333 once(event: 'socket', listener: (socket: Socket) => void): this;
334 once(event: 'timeout', listener: () => void): this;
335 once(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
336 once(event: 'close', listener: () => void): this;
337 once(event: 'drain', listener: () => void): this;
338 once(event: 'error', listener: (err: Error) => void): this;
339 once(event: 'finish', listener: () => void): this;
340 once(event: 'pipe', listener: (src: stream.Readable) => void): this;
341 once(event: 'unpipe', listener: (src: stream.Readable) => void): this;
342 once(event: string | symbol, listener: (...args: any[]) => void): this;
343
344 prependListener(event: 'abort', listener: () => void): this;
345 prependListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
346 prependListener(event: 'continue', listener: () => void): this;
347 prependListener(event: 'information', listener: (info: InformationEvent) => void): this;
348 prependListener(event: 'response', listener: (response: IncomingMessage) => void): this;
349 prependListener(event: 'socket', listener: (socket: Socket) => void): this;
350 prependListener(event: 'timeout', listener: () => void): this;
351 prependListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
352 prependListener(event: 'close', listener: () => void): this;
353 prependListener(event: 'drain', listener: () => void): this;
354 prependListener(event: 'error', listener: (err: Error) => void): this;
355 prependListener(event: 'finish', listener: () => void): this;
356 prependListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
357 prependListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
358 prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
359
360 prependOnceListener(event: 'abort', listener: () => void): this;
361 prependOnceListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
362 prependOnceListener(event: 'continue', listener: () => void): this;
363 prependOnceListener(event: 'information', listener: (info: InformationEvent) => void): this;
364 prependOnceListener(event: 'response', listener: (response: IncomingMessage) => void): this;
365 prependOnceListener(event: 'socket', listener: (socket: Socket) => void): this;
366 prependOnceListener(event: 'timeout', listener: () => void): this;
367 prependOnceListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
368 prependOnceListener(event: 'close', listener: () => void): this;
369 prependOnceListener(event: 'drain', listener: () => void): this;
370 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
371 prependOnceListener(event: 'finish', listener: () => void): this;
372 prependOnceListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
373 prependOnceListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
374 prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
375 }
376
377 class IncomingMessage extends stream.Readable {
378 constructor(socket: Socket);
379
380 aborted: boolean;
381 httpVersion: string;
382 httpVersionMajor: number;
383 httpVersionMinor: number;
384 complete: boolean;
385 /**
386 * @deprecated since v13.0.0 - Use `socket` instead.
387 */
388 connection: Socket;
389 socket: Socket;
390 headers: IncomingHttpHeaders;
391 rawHeaders: string[];
392 trailers: NodeJS.Dict<string>;
393 rawTrailers: string[];
394 setTimeout(msecs: number, callback?: () => void): this;
395 /**
396 * Only valid for request obtained from http.Server.
397 */
398 method?: string | undefined;
399 /**
400 * Only valid for request obtained from http.Server.
401 */
402 url?: string | undefined;
403 /**
404 * Only valid for response obtained from http.ClientRequest.
405 */
406 statusCode?: number | undefined;
407 /**
408 * Only valid for response obtained from http.ClientRequest.
409 */
410 statusMessage?: string | undefined;
411 destroy(error?: Error): this;
412 }
413
414 interface AgentOptions {
415 /**
416 * Keep sockets around in a pool to be used by other requests in the future. Default = false
417 */
418 keepAlive?: boolean | undefined;
419 /**
420 * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000.
421 * Only relevant if keepAlive is set to true.
422 */
423 keepAliveMsecs?: number | undefined;
424 /**
425 * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity
426 */
427 maxSockets?: number | undefined;
428 /**
429 * Maximum number of sockets allowed for all hosts in total. Each request will use a new socket until the maximum is reached. Default: Infinity.
430 */
431 maxTotalSockets?: number | undefined;
432 /**
433 * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256.
434 */
435 maxFreeSockets?: number | undefined;
436 /**
437 * Socket timeout in milliseconds. This will set the timeout after the socket is connected.
438 */
439 timeout?: number | undefined;
440 /**
441 * Scheduling strategy to apply when picking the next free socket to use. Default: 'fifo'.
442 */
443 scheduling?: 'fifo' | 'lifo' | undefined;
444 }
445
446 class Agent {
447 maxFreeSockets: number;
448 maxSockets: number;
449 maxTotalSockets: number;
450 readonly freeSockets: NodeJS.ReadOnlyDict<Socket[]>;
451 readonly sockets: NodeJS.ReadOnlyDict<Socket[]>;
452 readonly requests: NodeJS.ReadOnlyDict<IncomingMessage[]>;
453
454 constructor(opts?: AgentOptions);
455
456 /**
457 * Destroy any sockets that are currently in use by the agent.
458 * It is usually not necessary to do this. However, if you are using an agent with KeepAlive enabled,
459 * then it is best to explicitly shut down the agent when you know that it will no longer be used. Otherwise,
460 * sockets may hang open for quite a long time before the server terminates them.
461 */
462 destroy(): void;
463 }
464
465 const METHODS: string[];
466
467 const STATUS_CODES: {
468 [errorCode: number]: string | undefined;
469 [errorCode: string]: string | undefined;
470 };
471
472 function createServer(requestListener?: RequestListener): Server;
473 function createServer(options: ServerOptions, requestListener?: RequestListener): Server;
474
475 // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly,
476 // create interface RequestOptions would make the naming more clear to developers
477 interface RequestOptions extends ClientRequestArgs { }
478 function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
479 function request(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
480 function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
481 function get(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
482 let globalAgent: Agent;
483
484 /**
485 * Read-only property specifying the maximum allowed size of HTTP headers in bytes.
486 * Defaults to 16KB. Configurable using the [`--max-http-header-size`][] CLI option.
487 */
488 const maxHeaderSize: number;
489}
490declare module 'node:http' {
491 export * from 'http';
492}