diff --git a/types/http-proxy/http-proxy-tests.ts b/types/http-proxy/http-proxy-tests.ts new file mode 100644 index 0000000000..e691b48ed0 --- /dev/null +++ b/types/http-proxy/http-proxy-tests.ts @@ -0,0 +1,26 @@ +import * as http from "http"; +import * as HttpProxy from "http-proxy"; + +const proxy = new HttpProxy({ + changeOrigin: true +}); + +proxy.on("error", (err) => { + console.error("An error occured:", err); +}); + +/** + * Test type inference of event listener parameters: + */ +proxy.on("start", (req, res, target) => { + const headers = req.headers; // defined; + const status = res.statusCode; // defined; + const partial = + typeof target === "string" + ? target.substr(0) // defined; + : target.protocol; // defined; +}); + +http.createServer((req, res) => { + proxy.web(req, res); +}); diff --git a/types/http-proxy/index.d.ts b/types/http-proxy/index.d.ts new file mode 100644 index 0000000000..5ff6d5f32c --- /dev/null +++ b/types/http-proxy/index.d.ts @@ -0,0 +1,201 @@ +// Type definitions for node-http-proxy 1.12 +// Project: https://github.com/nodejitsu/node-http-proxy +// Definitions by: Maxime LUCE +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// + +import * as net from "net"; +import * as http from "http"; +import * as https from "https"; +import * as events from "events"; +import * as url from "url"; + +type ProxyTargetUrl = string | url.Url; + +type ErrorCallback = ( + err: Error, + req: http.IncomingMessage, + res: http.ServerResponse, + target?: ProxyTargetUrl +) => void; + +declare class Server extends events.EventEmitter { + /** + * Creates the proxy server with specified options. + * @param options - Config object passed to the proxy + */ + constructor(options?: Server.ServerOptions); + + /** + * Used for proxying regular HTTP(S) requests + * @param req - Client request. + * @param res - Client response. + * @param options - Additionnal options. + * @param + */ + web( + req: http.IncomingMessage, + res: http.ServerResponse, + options?: Server.ServerOptions, + callback?: ErrorCallback + ): void; + + /** + * Used for proxying regular HTTP(S) requests + * @param req - Client request. + * @param socket - Client socket. + * @param head - Client head. + * @param options - Additionnal options. + */ + ws( + req: http.IncomingMessage, + socket: any, + head: any, + options?: Server.ServerOptions + ): void; + + /** + * A function that wraps the object in a webserver, for your convenience + * @param port - Port to listen on + */ + listen(port: number): Server; + + /** + * A function that closes the inner webserver and stops listening on given port + */ + close(callback?: () => void): void; + + /** + * Creates the proxy server with specified options. + * @param options Config object passed to the proxy + * @returns Proxy object with handlers for `ws` and `web` requests + */ + static createProxyServer(options?: Server.ServerOptions): Server; + + /** + * Creates the proxy server with specified options. + * @param options Config object passed to the proxy + * @returns Proxy object with handlers for `ws` and `web` requests + */ + static createServer(options?: Server.ServerOptions): Server; + + /** + * Creates the proxy server with specified options. + * @param options Config object passed to the proxy + * @returns Proxy object with handlers for `ws` and `web` requests + */ + static createProxy(options?: Server.ServerOptions): Server; + + addListener(event: string, listener: () => void): this; + on(event: string, listener: () => void): this; + on(event: "error", listener: ErrorCallback): this; + on( + event: "start", + listener: ( + req: http.IncomingMessage, + res: http.ServerResponse, + target: ProxyTargetUrl + ) => void + ): this; + on( + event: "proxyReq", + listener: ( + proxyReq: http.ClientRequest, + req: http.IncomingMessage, + res: http.ServerResponse, + options: Server.ServerOptions + ) => void + ): this; + on( + event: "proxyRes", + listener: ( + proxyRes: http.IncomingMessage, + req: http.IncomingMessage, + res: http.ServerResponse + ) => void + ): this; + on( + event: "proxyReqWs", + listener: ( + proxyReq: http.ClientRequest, + req: http.IncomingMessage, + socket: net.Socket, + options: Server.ServerOptions, + head: any + ) => void + ): this; + on( + event: "econnreset", + listener: ( + err: Error, + req: http.IncomingMessage, + res: http.ServerResponse, + target: ProxyTargetUrl + ) => void + ): this; + on( + event: "end", + listener: ( + req: http.IncomingMessage, + res: http.ServerResponse, + proxyRes: http.IncomingMessage + ) => void + ): this; + on( + event: "close", + listener: ( + proxyRes: http.IncomingMessage, + proxySocket: net.Socket, + proxyHead: any + ) => void + ): this; + + once(event: string, listener: () => void): this; + removeListener(event: string, listener: () => void): this; + removeAllListeners(event?: string): this; + getMaxListeners(): number; + setMaxListeners(n: number): this; + listeners(event: string): Array<() => void>; + emit(event: string, ...args: any[]): boolean; + listenerCount(type: string): number; +} + +declare namespace Server { + interface ServerOptions { + /** URL string to be parsed with the url module. */ + target?: string; + /** URL string to be parsed with the url module. */ + forward?: string; + /** Object to be passed to http(s).request. */ + agent?: any; + /** Object to be passed to https.createServer(). */ + ssl?: any; + /** If you want to proxy websockets. */ + ws?: boolean; + /** Adds x- forward headers. */ + xfwd?: boolean; + /** Verify SSL certificate. */ + secure?: boolean; + /** Explicitly specify if we are proxying to another proxy. */ + toProxy?: boolean; + /** Specify whether you want to prepend the target's path to the proxy path. */ + prependPath?: boolean; + /** Specify whether you want to ignore the proxy path of the incoming request. */ + ignorePath?: boolean; + /** Local interface string to bind for outgoing connections. */ + localAddress?: boolean; + /** Changes the origin of the host header to the target URL. */ + changeOrigin?: boolean; + /** Basic authentication i.e. 'user:password' to compute an Authorization header. */ + auth?: string; + /** Rewrites the location hostname on (301 / 302 / 307 / 308) redirects, Default: null. */ + hostRewrite?: string; + /** Rewrites the location host/ port on (301 / 302 / 307 / 308) redirects based on requested host/ port.Default: false. */ + autoRewrite?: boolean; + /** Rewrites the location protocol on (301 / 302 / 307 / 308) redirects to 'http' or 'https'.Default: null. */ + protocolRewrite?: string; + } +} + +export = Server; diff --git a/types/http-proxy/tsconfig.json b/types/http-proxy/tsconfig.json new file mode 100644 index 0000000000..fe722af931 --- /dev/null +++ b/types/http-proxy/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "http-proxy-tests.ts" + ] +} diff --git a/types/http-proxy/tslint.json b/types/http-proxy/tslint.json new file mode 100644 index 0000000000..d88586e5bd --- /dev/null +++ b/types/http-proxy/tslint.json @@ -0,0 +1,3 @@ +{ + "extends": "dtslint/dt.json" +} diff --git a/types/http-status/tsconfig.json b/types/http-status/tsconfig.json index 11a8a8d963..42d5e2ed18 100644 --- a/types/http-status/tsconfig.json +++ b/types/http-status/tsconfig.json @@ -19,4 +19,4 @@ "index.d.ts", "http-status-tests.ts" ] -} \ No newline at end of file +}