UNPKG

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