UNPKG

25.5 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 | 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 }
103
104 interface ServerOptions {
105 IncomingMessage?: typeof IncomingMessage | undefined;
106 ServerResponse?: typeof ServerResponse | undefined;
107 /**
108 * Optionally overrides the value of
109 * [`--max-http-header-size`][] for requests received by this server, i.e.
110 * the maximum length of request headers in bytes.
111 * @default 8192
112 */
113 maxHeaderSize?: number | undefined;
114 /**
115 * Use an insecure HTTP parser that accepts invalid HTTP headers when true.
116 * Using the insecure parser should be avoided.
117 * See --insecure-http-parser for more information.
118 * @default false
119 */
120 insecureHTTPParser?: boolean | undefined;
121 }
122
123 type RequestListener = (req: IncomingMessage, res: ServerResponse) => void;
124
125 class Server extends NetServer {
126 constructor(requestListener?: RequestListener);
127 constructor(options: ServerOptions, requestListener?: RequestListener);
128 setTimeout(msecs?: number, callback?: () => void): this;
129 setTimeout(callback: () => void): this;
130 /**
131 * Limits maximum incoming headers count. If set to 0, no limit will be applied.
132 * @default 2000
133 * {@link https://nodejs.org/api/http.html#http_server_maxheaderscount}
134 */
135 maxHeadersCount: number | null;
136 timeout: number;
137 /**
138 * Limit the amount of time the parser will wait to receive the complete HTTP headers.
139 * @default 60000
140 * {@link https://nodejs.org/api/http.html#http_server_headerstimeout}
141 */
142 headersTimeout: number;
143 keepAliveTimeout: number;
144 /**
145 * Sets the timeout value in milliseconds for receiving the entire request from the client.
146 * @default 0
147 * {@link https://nodejs.org/api/http.html#http_server_requesttimeout}
148 */
149 requestTimeout: number;
150 addListener(event: string, listener: (...args: any[]) => void): this;
151 addListener(event: 'close', listener: () => void): this;
152 addListener(event: 'connection', listener: (socket: Socket) => void): this;
153 addListener(event: 'error', listener: (err: Error) => void): this;
154 addListener(event: 'listening', listener: () => void): this;
155 addListener(event: 'checkContinue', listener: RequestListener): this;
156 addListener(event: 'checkExpectation', listener: RequestListener): this;
157 addListener(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
158 addListener(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
159 addListener(event: 'request', listener: RequestListener): this;
160 addListener(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
161 emit(event: string, ...args: any[]): boolean;
162 emit(event: 'close'): boolean;
163 emit(event: 'connection', socket: Socket): boolean;
164 emit(event: 'error', err: Error): boolean;
165 emit(event: 'listening'): boolean;
166 emit(event: 'checkContinue', req: IncomingMessage, res: ServerResponse): boolean;
167 emit(event: 'checkExpectation', req: IncomingMessage, res: ServerResponse): boolean;
168 emit(event: 'clientError', err: Error, socket: stream.Duplex): boolean;
169 emit(event: 'connect', req: IncomingMessage, socket: stream.Duplex, head: Buffer): boolean;
170 emit(event: 'request', req: IncomingMessage, res: ServerResponse): boolean;
171 emit(event: 'upgrade', req: IncomingMessage, socket: stream.Duplex, head: Buffer): boolean;
172 on(event: string, listener: (...args: any[]) => void): this;
173 on(event: 'close', listener: () => void): this;
174 on(event: 'connection', listener: (socket: Socket) => void): this;
175 on(event: 'error', listener: (err: Error) => void): this;
176 on(event: 'listening', listener: () => void): this;
177 on(event: 'checkContinue', listener: RequestListener): this;
178 on(event: 'checkExpectation', listener: RequestListener): this;
179 on(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
180 on(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
181 on(event: 'request', listener: RequestListener): this;
182 on(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
183 once(event: string, listener: (...args: any[]) => void): this;
184 once(event: 'close', listener: () => void): this;
185 once(event: 'connection', listener: (socket: Socket) => void): this;
186 once(event: 'error', listener: (err: Error) => void): this;
187 once(event: 'listening', listener: () => void): this;
188 once(event: 'checkContinue', listener: RequestListener): this;
189 once(event: 'checkExpectation', listener: RequestListener): this;
190 once(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
191 once(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
192 once(event: 'request', listener: RequestListener): this;
193 once(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
194 prependListener(event: string, listener: (...args: any[]) => void): this;
195 prependListener(event: 'close', listener: () => void): this;
196 prependListener(event: 'connection', listener: (socket: Socket) => void): this;
197 prependListener(event: 'error', listener: (err: Error) => void): this;
198 prependListener(event: 'listening', listener: () => void): this;
199 prependListener(event: 'checkContinue', listener: RequestListener): this;
200 prependListener(event: 'checkExpectation', listener: RequestListener): this;
201 prependListener(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
202 prependListener(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
203 prependListener(event: 'request', listener: RequestListener): this;
204 prependListener(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
205 prependOnceListener(event: string, listener: (...args: any[]) => void): this;
206 prependOnceListener(event: 'close', listener: () => void): this;
207 prependOnceListener(event: 'connection', listener: (socket: Socket) => void): this;
208 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
209 prependOnceListener(event: 'listening', listener: () => void): this;
210 prependOnceListener(event: 'checkContinue', listener: RequestListener): this;
211 prependOnceListener(event: 'checkExpectation', listener: RequestListener): this;
212 prependOnceListener(event: 'clientError', listener: (err: Error, socket: stream.Duplex) => void): this;
213 prependOnceListener(event: 'connect', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
214 prependOnceListener(event: 'request', listener: RequestListener): this;
215 prependOnceListener(event: 'upgrade', listener: (req: IncomingMessage, socket: stream.Duplex, head: Buffer) => void): this;
216 }
217
218 // https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js
219 class OutgoingMessage extends stream.Writable {
220 upgrading: boolean;
221 chunkedEncoding: boolean;
222 shouldKeepAlive: boolean;
223 useChunkedEncodingByDefault: boolean;
224 sendDate: boolean;
225 /**
226 * @deprecated Use `writableEnded` instead.
227 */
228 finished: boolean;
229 headersSent: boolean;
230 /**
231 * @deprecated Use `socket` instead.
232 */
233 connection: Socket | null;
234 socket: Socket | null;
235
236 constructor();
237
238 setTimeout(msecs: number, callback?: () => void): this;
239 setHeader(name: string, value: number | string | ReadonlyArray<string>): void;
240 getHeader(name: string): number | string | string[] | undefined;
241 getHeaders(): OutgoingHttpHeaders;
242 getHeaderNames(): string[];
243 hasHeader(name: string): boolean;
244 removeHeader(name: string): void;
245 addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>): void;
246 flushHeaders(): void;
247 }
248
249 // https://github.com/nodejs/node/blob/master/lib/_http_server.js#L108-L256
250 class ServerResponse extends OutgoingMessage {
251 statusCode: number;
252 statusMessage: string;
253
254 constructor(req: IncomingMessage);
255
256 assignSocket(socket: Socket): void;
257 detachSocket(socket: Socket): void;
258 // https://github.com/nodejs/node/blob/master/test/parallel/test-http-write-callbacks.js#L53
259 // no args in writeContinue callback
260 writeContinue(callback?: () => void): void;
261 writeHead(statusCode: number, statusMessage?: string, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
262 writeHead(statusCode: number, headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
263 writeProcessing(): void;
264 }
265
266 interface InformationEvent {
267 statusCode: number;
268 statusMessage: string;
269 httpVersion: string;
270 httpVersionMajor: number;
271 httpVersionMinor: number;
272 headers: IncomingHttpHeaders;
273 rawHeaders: string[];
274 }
275
276 // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77
277 class ClientRequest extends OutgoingMessage {
278 aborted: boolean;
279 host: string;
280 protocol: string;
281
282 constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void);
283
284 method: string;
285 path: string;
286 /** @deprecated since v14.1.0 Use `request.destroy()` instead. */
287 abort(): void;
288 onSocket(socket: Socket): void;
289 setTimeout(timeout: number, callback?: () => void): this;
290 setNoDelay(noDelay?: boolean): void;
291 setSocketKeepAlive(enable?: boolean, initialDelay?: number): void;
292
293 addListener(event: 'abort', listener: () => void): this;
294 addListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
295 addListener(event: 'continue', listener: () => void): this;
296 addListener(event: 'information', listener: (info: InformationEvent) => void): this;
297 addListener(event: 'response', listener: (response: IncomingMessage) => void): this;
298 addListener(event: 'socket', listener: (socket: Socket) => void): this;
299 addListener(event: 'timeout', listener: () => void): this;
300 addListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
301 addListener(event: 'close', listener: () => void): this;
302 addListener(event: 'drain', listener: () => void): this;
303 addListener(event: 'error', listener: (err: Error) => void): this;
304 addListener(event: 'finish', listener: () => void): this;
305 addListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
306 addListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
307 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
308
309 on(event: 'abort', listener: () => void): this;
310 on(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
311 on(event: 'continue', listener: () => void): this;
312 on(event: 'information', listener: (info: InformationEvent) => void): this;
313 on(event: 'response', listener: (response: IncomingMessage) => void): this;
314 on(event: 'socket', listener: (socket: Socket) => void): this;
315 on(event: 'timeout', listener: () => void): this;
316 on(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
317 on(event: 'close', listener: () => void): this;
318 on(event: 'drain', listener: () => void): this;
319 on(event: 'error', listener: (err: Error) => void): this;
320 on(event: 'finish', listener: () => void): this;
321 on(event: 'pipe', listener: (src: stream.Readable) => void): this;
322 on(event: 'unpipe', listener: (src: stream.Readable) => void): this;
323 on(event: string | symbol, listener: (...args: any[]) => void): this;
324
325 once(event: 'abort', listener: () => void): this;
326 once(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
327 once(event: 'continue', listener: () => void): this;
328 once(event: 'information', listener: (info: InformationEvent) => void): this;
329 once(event: 'response', listener: (response: IncomingMessage) => void): this;
330 once(event: 'socket', listener: (socket: Socket) => void): this;
331 once(event: 'timeout', listener: () => void): this;
332 once(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
333 once(event: 'close', listener: () => void): this;
334 once(event: 'drain', listener: () => void): this;
335 once(event: 'error', listener: (err: Error) => void): this;
336 once(event: 'finish', listener: () => void): this;
337 once(event: 'pipe', listener: (src: stream.Readable) => void): this;
338 once(event: 'unpipe', listener: (src: stream.Readable) => void): this;
339 once(event: string | symbol, listener: (...args: any[]) => void): this;
340
341 prependListener(event: 'abort', listener: () => void): this;
342 prependListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
343 prependListener(event: 'continue', listener: () => void): this;
344 prependListener(event: 'information', listener: (info: InformationEvent) => void): this;
345 prependListener(event: 'response', listener: (response: IncomingMessage) => void): this;
346 prependListener(event: 'socket', listener: (socket: Socket) => void): this;
347 prependListener(event: 'timeout', listener: () => void): this;
348 prependListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
349 prependListener(event: 'close', listener: () => void): this;
350 prependListener(event: 'drain', listener: () => void): this;
351 prependListener(event: 'error', listener: (err: Error) => void): this;
352 prependListener(event: 'finish', listener: () => void): this;
353 prependListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
354 prependListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
355 prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
356
357 prependOnceListener(event: 'abort', listener: () => void): this;
358 prependOnceListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
359 prependOnceListener(event: 'continue', listener: () => void): this;
360 prependOnceListener(event: 'information', listener: (info: InformationEvent) => void): this;
361 prependOnceListener(event: 'response', listener: (response: IncomingMessage) => void): this;
362 prependOnceListener(event: 'socket', listener: (socket: Socket) => void): this;
363 prependOnceListener(event: 'timeout', listener: () => void): this;
364 prependOnceListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
365 prependOnceListener(event: 'close', listener: () => void): this;
366 prependOnceListener(event: 'drain', listener: () => void): this;
367 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
368 prependOnceListener(event: 'finish', listener: () => void): this;
369 prependOnceListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
370 prependOnceListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
371 prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
372 }
373
374 class IncomingMessage extends stream.Readable {
375 constructor(socket: Socket);
376
377 aborted: boolean;
378 httpVersion: string;
379 httpVersionMajor: number;
380 httpVersionMinor: number;
381 complete: boolean;
382 /**
383 * @deprecated since v13.0.0 - Use `socket` instead.
384 */
385 connection: Socket;
386 socket: Socket;
387 headers: IncomingHttpHeaders;
388 rawHeaders: string[];
389 trailers: NodeJS.Dict<string>;
390 rawTrailers: string[];
391 setTimeout(msecs: number, callback?: () => void): this;
392 /**
393 * Only valid for request obtained from http.Server.
394 */
395 method?: string | undefined;
396 /**
397 * Only valid for request obtained from http.Server.
398 */
399 url?: string | undefined;
400 /**
401 * Only valid for response obtained from http.ClientRequest.
402 */
403 statusCode?: number | undefined;
404 /**
405 * Only valid for response obtained from http.ClientRequest.
406 */
407 statusMessage?: string | undefined;
408 destroy(error?: Error): void;
409 }
410
411 interface AgentOptions {
412 /**
413 * Keep sockets around in a pool to be used by other requests in the future. Default = false
414 */
415 keepAlive?: boolean | undefined;
416 /**
417 * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000.
418 * Only relevant if keepAlive is set to true.
419 */
420 keepAliveMsecs?: number | undefined;
421 /**
422 * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity
423 */
424 maxSockets?: number | undefined;
425 /**
426 * Maximum number of sockets allowed for all hosts in total. Each request will use a new socket until the maximum is reached. Default: Infinity.
427 */
428 maxTotalSockets?: number | undefined;
429 /**
430 * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256.
431 */
432 maxFreeSockets?: number | undefined;
433 /**
434 * Socket timeout in milliseconds. This will set the timeout after the socket is connected.
435 */
436 timeout?: number | undefined;
437 /**
438 * Scheduling strategy to apply when picking the next free socket to use. Default: 'fifo'.
439 */
440 scheduling?: 'fifo' | 'lifo' | undefined;
441 }
442
443 class Agent {
444 maxFreeSockets: number;
445 maxSockets: number;
446 maxTotalSockets: number;
447 readonly freeSockets: NodeJS.ReadOnlyDict<Socket[]>;
448 readonly sockets: NodeJS.ReadOnlyDict<Socket[]>;
449 readonly requests: NodeJS.ReadOnlyDict<IncomingMessage[]>;
450
451 constructor(opts?: AgentOptions);
452
453 /**
454 * Destroy any sockets that are currently in use by the agent.
455 * It is usually not necessary to do this. However, if you are using an agent with KeepAlive enabled,
456 * then it is best to explicitly shut down the agent when you know that it will no longer be used. Otherwise,
457 * sockets may hang open for quite a long time before the server terminates them.
458 */
459 destroy(): void;
460 }
461
462 const METHODS: string[];
463
464 const STATUS_CODES: {
465 [errorCode: number]: string | undefined;
466 [errorCode: string]: string | undefined;
467 };
468
469 function createServer(requestListener?: RequestListener): Server;
470 function createServer(options: ServerOptions, requestListener?: RequestListener): Server;
471
472 // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly,
473 // create interface RequestOptions would make the naming more clear to developers
474 interface RequestOptions extends ClientRequestArgs { }
475 function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
476 function request(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
477 function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
478 function get(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
479 let globalAgent: Agent;
480
481 /**
482 * Read-only property specifying the maximum allowed size of HTTP headers in bytes.
483 * Defaults to 16KB. Configurable using the [`--max-http-header-size`][] CLI option.
484 */
485 const maxHeaderSize: number;
486}