UNPKG

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