UNPKG

17 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 method?: string;
81 path?: string | null;
82 headers?: OutgoingHttpHeaders;
83 auth?: string | null;
84 agent?: Agent | boolean;
85 _defaultAgent?: Agent;
86 timeout?: number;
87 setHost?: boolean;
88 // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278
89 createConnection?: (options: ClientRequestArgs, oncreate: (err: Error, socket: Socket) => void) => Socket;
90 }
91
92 interface ServerOptions {
93 IncomingMessage?: typeof IncomingMessage;
94 ServerResponse?: typeof ServerResponse;
95 }
96
97 type RequestListener = (req: IncomingMessage, res: ServerResponse) => void;
98
99 class Server extends NetServer {
100 constructor(requestListener?: RequestListener);
101 constructor(options: ServerOptions, requestListener?: RequestListener);
102
103 setTimeout(msecs?: number, callback?: () => void): this;
104 setTimeout(callback: () => void): this;
105 /**
106 * Limits maximum incoming headers count. If set to 0, no limit will be applied.
107 * @default 2000
108 * {@link https://nodejs.org/api/http.html#http_server_maxheaderscount}
109 */
110 maxHeadersCount: number | null;
111 timeout: number;
112 /**
113 * Limit the amount of time the parser will wait to receive the complete HTTP headers.
114 * @default 40000
115 * {@link https://nodejs.org/api/http.html#http_server_headerstimeout}
116 */
117 headersTimeout: number;
118 keepAliveTimeout: number;
119 }
120
121 // https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js
122 class OutgoingMessage extends stream.Writable {
123 upgrading: boolean;
124 chunkedEncoding: boolean;
125 shouldKeepAlive: boolean;
126 useChunkedEncodingByDefault: boolean;
127 sendDate: boolean;
128 finished: boolean;
129 headersSent: boolean;
130 /**
131 * @deprecate Use `socket` instead.
132 */
133 connection: Socket;
134 socket: Socket;
135
136 constructor();
137
138 setTimeout(msecs: number, callback?: () => void): this;
139 setHeader(name: string, value: number | string | string[]): void;
140 getHeader(name: string): number | string | string[] | undefined;
141 getHeaders(): OutgoingHttpHeaders;
142 getHeaderNames(): string[];
143 hasHeader(name: string): boolean;
144 removeHeader(name: string): void;
145 addTrailers(headers: OutgoingHttpHeaders | Array<[string, string]>): void;
146 flushHeaders(): void;
147 }
148
149 // https://github.com/nodejs/node/blob/master/lib/_http_server.js#L108-L256
150 class ServerResponse extends OutgoingMessage {
151 statusCode: number;
152 statusMessage: string;
153 writableFinished: boolean;
154
155 constructor(req: IncomingMessage);
156
157 assignSocket(socket: Socket): void;
158 detachSocket(socket: Socket): void;
159 // https://github.com/nodejs/node/blob/master/test/parallel/test-http-write-callbacks.js#L53
160 // no args in writeContinue callback
161 writeContinue(callback?: () => void): void;
162 writeHead(statusCode: number, reasonPhrase?: string, headers?: OutgoingHttpHeaders): this;
163 writeHead(statusCode: number, headers?: OutgoingHttpHeaders): this;
164 writeProcessing(): void;
165 }
166
167 interface InformationEvent {
168 statusCode: number;
169 statusMessage: string;
170 httpVersion: string;
171 httpVersionMajor: number;
172 httpVersionMinor: number;
173 headers: IncomingHttpHeaders;
174 rawHeaders: string[];
175 }
176
177 // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77
178 class ClientRequest extends OutgoingMessage {
179 connection: Socket;
180 socket: Socket;
181 aborted: number;
182
183 constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void);
184
185 method: string;
186 path: string;
187 abort(): void;
188 onSocket(socket: Socket): void;
189 setTimeout(timeout: number, callback?: () => void): this;
190 setNoDelay(noDelay?: boolean): void;
191 setSocketKeepAlive(enable?: boolean, initialDelay?: number): void;
192
193 addListener(event: 'abort', listener: () => void): this;
194 addListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
195 addListener(event: 'continue', listener: () => void): this;
196 addListener(event: 'information', listener: (info: InformationEvent) => void): this;
197 addListener(event: 'response', listener: (response: IncomingMessage) => void): this;
198 addListener(event: 'socket', listener: (socket: Socket) => void): this;
199 addListener(event: 'timeout', listener: () => void): this;
200 addListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
201 addListener(event: 'close', listener: () => void): this;
202 addListener(event: 'drain', listener: () => void): this;
203 addListener(event: 'error', listener: (err: Error) => void): this;
204 addListener(event: 'finish', listener: () => void): this;
205 addListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
206 addListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
207 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
208
209 on(event: 'abort', listener: () => void): this;
210 on(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
211 on(event: 'continue', listener: () => void): this;
212 on(event: 'information', listener: (info: InformationEvent) => void): this;
213 on(event: 'response', listener: (response: IncomingMessage) => void): this;
214 on(event: 'socket', listener: (socket: Socket) => void): this;
215 on(event: 'timeout', listener: () => void): this;
216 on(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
217 on(event: 'close', listener: () => void): this;
218 on(event: 'drain', listener: () => void): this;
219 on(event: 'error', listener: (err: Error) => void): this;
220 on(event: 'finish', listener: () => void): this;
221 on(event: 'pipe', listener: (src: stream.Readable) => void): this;
222 on(event: 'unpipe', listener: (src: stream.Readable) => void): this;
223 on(event: string | symbol, listener: (...args: any[]) => void): this;
224
225 once(event: 'abort', listener: () => void): this;
226 once(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
227 once(event: 'continue', listener: () => void): this;
228 once(event: 'information', listener: (info: InformationEvent) => void): this;
229 once(event: 'response', listener: (response: IncomingMessage) => void): this;
230 once(event: 'socket', listener: (socket: Socket) => void): this;
231 once(event: 'timeout', listener: () => void): this;
232 once(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
233 once(event: 'close', listener: () => void): this;
234 once(event: 'drain', listener: () => void): this;
235 once(event: 'error', listener: (err: Error) => void): this;
236 once(event: 'finish', listener: () => void): this;
237 once(event: 'pipe', listener: (src: stream.Readable) => void): this;
238 once(event: 'unpipe', listener: (src: stream.Readable) => void): this;
239 once(event: string | symbol, listener: (...args: any[]) => void): this;
240
241 prependListener(event: 'abort', listener: () => void): this;
242 prependListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
243 prependListener(event: 'continue', listener: () => void): this;
244 prependListener(event: 'information', listener: (info: InformationEvent) => void): this;
245 prependListener(event: 'response', listener: (response: IncomingMessage) => void): this;
246 prependListener(event: 'socket', listener: (socket: Socket) => void): this;
247 prependListener(event: 'timeout', listener: () => void): this;
248 prependListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
249 prependListener(event: 'close', listener: () => void): this;
250 prependListener(event: 'drain', listener: () => void): this;
251 prependListener(event: 'error', listener: (err: Error) => void): this;
252 prependListener(event: 'finish', listener: () => void): this;
253 prependListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
254 prependListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
255 prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
256
257 prependOnceListener(event: 'abort', listener: () => void): this;
258 prependOnceListener(event: 'connect', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
259 prependOnceListener(event: 'continue', listener: () => void): this;
260 prependOnceListener(event: 'information', listener: (info: InformationEvent) => void): this;
261 prependOnceListener(event: 'response', listener: (response: IncomingMessage) => void): this;
262 prependOnceListener(event: 'socket', listener: (socket: Socket) => void): this;
263 prependOnceListener(event: 'timeout', listener: () => void): this;
264 prependOnceListener(event: 'upgrade', listener: (response: IncomingMessage, socket: Socket, head: Buffer) => void): this;
265 prependOnceListener(event: 'close', listener: () => void): this;
266 prependOnceListener(event: 'drain', listener: () => void): this;
267 prependOnceListener(event: 'error', listener: (err: Error) => void): this;
268 prependOnceListener(event: 'finish', listener: () => void): this;
269 prependOnceListener(event: 'pipe', listener: (src: stream.Readable) => void): this;
270 prependOnceListener(event: 'unpipe', listener: (src: stream.Readable) => void): this;
271 prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
272 }
273
274 class IncomingMessage extends stream.Readable {
275 constructor(socket: Socket);
276
277 httpVersion: string;
278 httpVersionMajor: number;
279 httpVersionMinor: number;
280 complete: boolean;
281 /**
282 * @deprecate Use `socket` instead.
283 */
284 connection: Socket;
285 socket: Socket;
286 headers: IncomingHttpHeaders;
287 rawHeaders: string[];
288 trailers: { [key: string]: string | undefined };
289 rawTrailers: string[];
290 setTimeout(msecs: number, callback?: () => void): this;
291 /**
292 * Only valid for request obtained from http.Server.
293 */
294 method?: string;
295 /**
296 * Only valid for request obtained from http.Server.
297 */
298 url?: string;
299 /**
300 * Only valid for response obtained from http.ClientRequest.
301 */
302 statusCode?: number;
303 /**
304 * Only valid for response obtained from http.ClientRequest.
305 */
306 statusMessage?: string;
307 destroy(error?: Error): void;
308 }
309
310 interface AgentOptions {
311 /**
312 * Keep sockets around in a pool to be used by other requests in the future. Default = false
313 */
314 keepAlive?: boolean;
315 /**
316 * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000.
317 * Only relevant if keepAlive is set to true.
318 */
319 keepAliveMsecs?: number;
320 /**
321 * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity
322 */
323 maxSockets?: number;
324 /**
325 * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256.
326 */
327 maxFreeSockets?: number;
328 /**
329 * Socket timeout in milliseconds. This will set the timeout after the socket is connected.
330 */
331 timeout?: number;
332 }
333
334 class Agent {
335 maxFreeSockets: number;
336 maxSockets: number;
337 readonly sockets: {
338 readonly [key: string]: Socket[];
339 };
340 readonly requests: {
341 readonly [key: string]: IncomingMessage[];
342 };
343
344 constructor(opts?: AgentOptions);
345
346 /**
347 * Destroy any sockets that are currently in use by the agent.
348 * It is usually not necessary to do this. However, if you are using an agent with KeepAlive enabled,
349 * then it is best to explicitly shut down the agent when you know that it will no longer be used. Otherwise,
350 * sockets may hang open for quite a long time before the server terminates them.
351 */
352 destroy(): void;
353 }
354
355 const METHODS: string[];
356
357 const STATUS_CODES: {
358 [errorCode: number]: string | undefined;
359 [errorCode: string]: string | undefined;
360 };
361
362 function createServer(requestListener?: RequestListener): Server;
363 function createServer(options: ServerOptions, requestListener?: RequestListener): Server;
364
365 // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly,
366 // create interface RequestOptions would make the naming more clear to developers
367 interface RequestOptions extends ClientRequestArgs { }
368 function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
369 function request(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
370 function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest;
371 function get(url: string | URL, options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest;
372 let globalAgent: Agent;
373
374 /**
375 * Read-only property specifying the maximum allowed size of HTTP headers in bytes.
376 * Defaults to 8KB. Configurable using the [`--max-http-header-size`][] CLI option.
377 */
378 const maxHeaderSize: number;
379}