UNPKG

24.9 kBTypeScriptView Raw
1declare module 'http' {
2 import * as stream from 'stream';
3 import { URL } from 'url';
4 import { Socket, Server as NetServer } from 'net';
5
6 // incoming headers will never contain number
7 interface IncomingHttpHeaders extends NodeJS.Dict<string | string[]> {
8 'accept'?: string;
9 'accept-language'?: string;
10 'accept-patch'?: string;
11 'accept-ranges'?: string;
12 'access-control-allow-credentials'?: string;
13 'access-control-allow-headers'?: string;
14 'access-control-allow-methods'?: string;
15 'access-control-allow-origin'?: string;
16 'access-control-expose-headers'?: string;
17 'access-control-max-age'?: string;
18 'access-control-request-headers'?: string;
19 'access-control-request-method'?: string;
20 'age'?: string;
21 'allow'?: string;
22 'alt-svc'?: string;
23 'authorization'?: string;
24 'cache-control'?: string;
25 'connection'?: string;
26 'content-disposition'?: string;
27 'content-encoding'?: string;
28 'content-language'?: string;
29 'content-length'?: string;
30 'content-location'?: string;
31 'content-range'?: string;
32 'content-type'?: string;
33 'cookie'?: string;
34 'date'?: string;
35 'etag'?: string;
36 'expect'?: string;
37 'expires'?: string;
38 'forwarded'?: string;
39 'from'?: string;
40 'host'?: string;
41 'if-match'?: string;
42 'if-modified-since'?: string;
43 'if-none-match'?: string;
44 'if-unmodified-since'?: string;
45 'last-modified'?: string;
46 'location'?: string;
47 'origin'?: string;
48 'pragma'?: string;
49 'proxy-authenticate'?: string;
50 'proxy-authorization'?: string;
51 'public-key-pins'?: string;
52 'range'?: string;
53 'referer'?: string;
54 'retry-after'?: string;
55 'sec-websocket-accept'?: string;
56 'sec-websocket-extensions'?: string;
57 'sec-websocket-key'?: string;
58 'sec-websocket-protocol'?: string;
59 'sec-websocket-version'?: string;
60 'set-cookie'?: string[];
61 'strict-transport-security'?: string;
62 'tk'?: string;
63 'trailer'?: string;
64 'transfer-encoding'?: string;
65 'upgrade'?: string;
66 'user-agent'?: string;
67 'vary'?: string;
68 'via'?: string;
69 'warning'?: string;
70 'www-authenticate'?: string;
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 abort?: AbortSignal;
81 protocol?: string | null;
82 host?: string | null;
83 hostname?: string | null;
84 family?: number;
85 port?: number | string | null;
86 defaultPort?: number | string;
87 localAddress?: string;
88 socketPath?: string;
89 /**
90 * @default 8192
91 */
92 maxHeaderSize?: number;
93 method?: string;
94 path?: string | null;
95 headers?: OutgoingHttpHeaders;
96 auth?: string | null;
97 agent?: Agent | boolean;
98 _defaultAgent?: Agent;
99 timeout?: number;
100 setHost?: boolean;
101 // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278
102 createConnection?: (options: ClientRequestArgs, oncreate: (err: Error, socket: Socket) => void) => Socket;
103 }
104
105 interface ServerOptions {
106 IncomingMessage?: typeof IncomingMessage;
107 ServerResponse?: typeof ServerResponse;
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;
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;
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 readonly req: IncomingMessage;
222
223 chunkedEncoding: boolean;
224 shouldKeepAlive: boolean;
225 useChunkedEncodingByDefault: boolean;
226 sendDate: boolean;
227 /**
228 * @deprecated Use `writableEnded` instead.
229 */
230 finished: boolean;
231 readonly headersSent: boolean;
232 /**
233 * @deprecated Use `socket` instead.
234 */
235 readonly connection: Socket | null;
236 readonly socket: Socket | null;
237
238 constructor();
239
240 setTimeout(msecs: number, callback?: () => void): this;
241 setHeader(name: string, value: number | string | ReadonlyArray<string>): this;
242 getHeader(name: string): number | string | string[] | undefined;
243 getHeaders(): OutgoingHttpHeaders;
244 getHeaderNames(): string[];
245 hasHeader(name: string): boolean;
246 removeHeader(name: string): void;
247 addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>): void;
248 flushHeaders(): void;
249 }
250
251 // https://github.com/nodejs/node/blob/master/lib/_http_server.js#L108-L256
252 class ServerResponse extends OutgoingMessage {
253 statusCode: number;
254 statusMessage: string;
255
256 constructor(req: IncomingMessage);
257
258 assignSocket(socket: Socket): void;
259 detachSocket(socket: Socket): void;
260 // https://github.com/nodejs/node/blob/master/test/parallel/test-http-write-callbacks.js#L53
261 // no args in writeContinue callback
262 writeContinue(callback?: () => void): void;
263 writeHead(statusCode: number, statusMessage?: string, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
264 writeHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
265 writeProcessing(): void;
266 }
267
268 interface InformationEvent {
269 statusCode: number;
270 statusMessage: string;
271 httpVersion: string;
272 httpVersionMajor: number;
273 httpVersionMinor: number;
274 headers: IncomingHttpHeaders;
275 rawHeaders: string[];
276 }
277
278 // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77
279 class ClientRequest extends OutgoingMessage {
280 aborted: boolean;
281 host: string;
282 protocol: string;
283
284 constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void);
285
286 method: string;
287 path: string;
288 /** @deprecated since v14.1.0 Use `request.destroy()` instead. */
289 abort(): void;
290 onSocket(socket: Socket): void;
291 setTimeout(timeout: number, callback?: () => void): this;
292 setNoDelay(noDelay?: boolean): void;
293 setSocketKeepAlive(enable?: boolean, initialDelay?: number): void;
294 /**
295 * Returns an array containing the unique names of the current outgoing raw headers.
296 * Header names are returned with their exact casing being set.
297 */
298 getRawHeaderNames(): string[];
299
300 addListener(event: 'abort', listener: () => void): this;
301 addListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
302 addListener(event: 'continue', listener: () => void): this;
303 addListener(event: 'information', listener: (info: InformationEvent) => void): this;
304 addListener(event: 'response', listener: (response: IncomingMessage) => void): this;
305 addListener(event: 'socket', listener: (socket: Socket) => void): this;
306 addListener(event: 'timeout', listener: () => void): this;
307 addListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
308 addListener(event: 'close', listener: () => void): this;
309 addListener(event: 'drain', listener: () => void): this;
310 addListener(event: 'error', listener: (err: Error) => void): this;
311 addListener(event: 'finish', listener: () => void): this;
312 addListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
313 addListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
314 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
315
316 on(event: 'abort', listener: () => void): this;
317 on(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
318 on(event: 'continue', listener: () => void): this;
319 on(event: 'information', listener: (info: InformationEvent) => void): this;
320 on(event: 'response', listener: (response: IncomingMessage) => void): this;
321 on(event: 'socket', listener: (socket: Socket) => void): this;
322 on(event: 'timeout', listener: () => void): this;
323 on(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
324 on(event: 'close', listener: () => void): this;
325 on(event: 'drain', listener: () => void): this;
326 on(event: 'error', listener: (err: Error) => void): this;
327 on(event: 'finish', listener: () => void): this;
328 on(event: 'pipe', listener: (src: stream.Readable) => void): this;
329 on(event: 'unpipe', listener: (src: stream.Readable) => void): this;
330 on(event: string | symbol, listener: (...args: any[]) => void): this;
331
332 once(event: 'abort', listener: () => void): this;
333 once(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
334 once(event: 'continue', listener: () => void): this;
335 once(event: 'information', listener: (info: InformationEvent) => void): this;
336 once(event: 'response', listener: (response: IncomingMessage) => void): this;
337 once(event: 'socket', listener: (socket: Socket) => void): this;
338 once(event: 'timeout', listener: () => void): this;
339 once(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
340 once(event: 'close', listener: () => void): this;
341 once(event: 'drain', listener: () => void): this;
342 once(event: 'error', listener: (err: Error) => void): this;
343 once(event: 'finish', listener: () => void): this;
344 once(event: 'pipe', listener: (src: stream.Readable) => void): this;
345 once(event: 'unpipe', listener: (src: stream.Readable) => void): this;
346 once(event: string | symbol, listener: (...args: any[]) => void): this;
347
348 prependListener(event: 'abort', listener: () => void): this;
349 prependListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
350 prependListener(event: 'continue', listener: () => void): this;
351 prependListener(event: 'information', listener: (info: InformationEvent) => void): this;
352 prependListener(event: 'response', listener: (response: IncomingMessage) => void): this;
353 prependListener(event: 'socket', listener: (socket: Socket) => void): this;
354 prependListener(event: 'timeout', listener: () => void): this;
355 prependListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
356 prependListener(event: 'close', listener: () => void): this;
357 prependListener(event: 'drain', listener: () => void): this;
358 prependListener(event: 'error', listener: (err: Error) => void): this;
359 prependListener(event: 'finish', listener: () => void): this;
360 prependListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
361 prependListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
362 prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
363
364 prependOnceListener(event: 'abort', listener: () => void): this;
365 prependOnceListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
366 prependOnceListener(event: 'continue', listener: () => void): this;
367 prependOnceListener(event: 'information', listener: (info: InformationEvent) => void): this;
368 prependOnceListener(event: 'response', listener: (response: IncomingMessage) => void): this;
369 prependOnceListener(event: 'socket', listener: (socket: Socket) => void): this;
370 prependOnceListener(event: 'timeout', listener: () => void): this;
371 prependOnceListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
372 prependOnceListener(event: 'close', listener: () => void): this;
373 prependOnceListener(event: 'drain', listener: () => void): this;
374 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
375 prependOnceListener(event: 'finish', listener: () => void): this;
376 prependOnceListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
377 prependOnceListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
378 prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
379 }
380
381 class IncomingMessage extends stream.Readable {
382 constructor(socket: Socket);
383
384 aborted: boolean;
385 httpVersion: string;
386 httpVersionMajor: number;
387 httpVersionMinor: number;
388 complete: boolean;
389 /**
390 * @deprecated since v13.0.0 - Use `socket` instead.
391 */
392 connection: Socket;
393 socket: Socket;
394 headers: IncomingHttpHeaders;
395 rawHeaders: string[];
396 trailers: NodeJS.Dict<string>;
397 rawTrailers: string[];
398 setTimeout(msecs: number, callback?: () => void): this;
399 /**
400 * Only valid for request obtained from http.Server.
401 */
402 method?: string;
403 /**
404 * Only valid for request obtained from http.Server.
405 */
406 url?: string;
407 /**
408 * Only valid for response obtained from http.ClientRequest.
409 */
410 statusCode?: number;
411 /**
412 * Only valid for response obtained from http.ClientRequest.
413 */
414 statusMessage?: string;
415 destroy(error?: Error): void;
416 }
417
418 interface AgentOptions {
419 /**
420 * Keep sockets around in a pool to be used by other requests in the future. Default = false
421 */
422 keepAlive?: boolean;
423 /**
424 * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000.
425 * Only relevant if keepAlive is set to true.
426 */
427 keepAliveMsecs?: number;
428 /**
429 * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity
430 */
431 maxSockets?: number;
432 /**
433 * Maximum number of sockets allowed for all hosts in total. Each request will use a new socket until the maximum is reached. Default: Infinity.
434 */
435 maxTotalSockets?: number;
436 /**
437 * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256.
438 */
439 maxFreeSockets?: number;
440 /**
441 * Socket timeout in milliseconds. This will set the timeout after the socket is connected.
442 */
443 timeout?: number;
444 /**
445 * Scheduling strategy to apply when picking the next free socket to use.
446 * @default `lifo`
447 */
448 scheduling?: 'fifo' | 'lifo';
449 }
450
451 class Agent {
452 maxFreeSockets: number;
453 maxSockets: number;
454 maxTotalSockets: number;
455 readonly freeSockets: NodeJS.ReadOnlyDict<Socket[]>;
456 readonly sockets: NodeJS.ReadOnlyDict<Socket[]>;
457 readonly requests: NodeJS.ReadOnlyDict<IncomingMessage[]>;
458
459 constructor(opts?: AgentOptions);
460
461 /**
462 * Destroy any sockets that are currently in use by the agent.
463 * It is usually not necessary to do this. However, if you are using an agent with KeepAlive enabled,
464 * then it is best to explicitly shut down the agent when you know that it will no longer be used. Otherwise,
465 * sockets may hang open for quite a long time before the server terminates them.
466 */
467 destroy(): void;
468 }
469
470 const METHODS: string[];
471
472 const STATUS_CODES: {
473 [errorCode: number]: string | undefined;
474 [errorCode: string]: string | undefined;
475 };
476
477 function createServer(requestListener?: RequestListener): Server;
478 function createServer(options: ServerOptions, requestListener?: RequestListener): Server;
479
480 // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly,
481 // create interface RequestOptions would make the naming more clear to developers
482 interface RequestOptions extends ClientRequestArgs { }
483 function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
484 function request(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
485 function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
486 function get(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
487 let globalAgent: Agent;
488
489 /**
490 * Read-only property specifying the maximum allowed size of HTTP headers in bytes.
491 * Defaults to 16KB. Configurable using the `--max-http-header-size` CLI option.
492 */
493 const maxHeaderSize: number;
494
495 /**
496 *
497 * This utility function converts a URL object into an ordinary options object as
498 * expected by the `http.request()` and `https.request()` APIs.
499 */
500 function urlToHttpOptions(url: URL): ClientRequestArgs;
501}