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
+}