Spaces:
Building
Building
| <p align="center"> | |
| <img src="https://raw.github.com/nodejitsu/node-http-proxy/master/doc/logo.png"/> | |
| </p> | |
| node-http-proxy | |
| ======= | |
| `node-http-proxy` is an HTTP programmable proxying library that supports | |
| websockets. It is suitable for implementing components such as | |
| proxies and load balancers. | |
| ### Build Status | |
| <p align="center"> | |
| <a href="https://travis-ci.org/nodejitsu/node-http-proxy" target="_blank"> | |
| <img src="https://travis-ci.org/nodejitsu/node-http-proxy.png"/></a> | |
| <a href="https://coveralls.io/r/nodejitsu/node-http-proxy" target="_blank"> | |
| <img src="https://coveralls.io/repos/nodejitsu/node-http-proxy/badge.png"/></a> | |
| </p> | |
| ### Looking to Upgrade from 0.8.x ? Click [here](UPGRADING.md) | |
| ### Core Concept | |
| A new proxy is created by calling `createProxyServer` and passing | |
| an `options` object as argument ([valid properties are available here](lib/http-proxy.js#L33-L50)) | |
| ```javascript | |
| var httpProxy = require('http-proxy'); | |
| var proxy = httpProxy.createProxyServer(options); | |
| ``` | |
| An object will be returned with four values: | |
| * web `req, res, [options]` (used for proxying regular HTTP(S) requests) | |
| * ws `req, socket, head, [options]` (used for proxying WS(S) requests) | |
| * listen `port` (a function that wraps the object in a webserver, for your convenience) | |
| * close `[callback]` (a function that closes the inner webserver and stops listening on given port) | |
| It is then possible to proxy requests by calling these functions | |
| ```javascript | |
| http.createServer(function(req, res) { | |
| proxy.web(req, res, { target: 'http://mytarget.com:8080' }); | |
| }); | |
| ``` | |
| Errors can be listened on either using the Event Emitter API | |
| ```javascript | |
| proxy.on('error', function(e) { | |
| ... | |
| }); | |
| ``` | |
| or using the callback API | |
| ```javascript | |
| proxy.web(req, res, { target: 'http://mytarget.com:8080' }, function(e) { ... }); | |
| ``` | |
| When a request is proxied it follows two different pipelines ([available here](lib/http-proxy/passes)) | |
| which apply transformations to both the `req` and `res` object. | |
| The first pipeline (ingoing) is responsible for the creation and manipulation of the stream that connects your client to the target. | |
| The second pipeline (outgoing) is responsible for the creation and manipulation of the stream that, from your target, returns data | |
| to the client. | |
| #### Setup a basic stand-alone proxy server | |
| ```js | |
| var http = require('http'), | |
| httpProxy = require('http-proxy'); | |
| // | |
| // Create your proxy server and set the target in the options. | |
| // | |
| httpProxy.createProxyServer({target:'http://localhost:9000'}).listen(8000); | |
| // | |
| // Create your target server | |
| // | |
| http.createServer(function (req, res) { | |
| res.writeHead(200, { 'Content-Type': 'text/plain' }); | |
| res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2)); | |
| res.end(); | |
| }).listen(9000); | |
| ``` | |
| #### Setup a stand-alone proxy server with custom server logic | |
| This example show how you can proxy a request using your own HTTP server | |
| and also you can put your own logic to handle the request. | |
| ```js | |
| var http = require('http'), | |
| httpProxy = require('http-proxy'); | |
| // | |
| // Create a proxy server with custom application logic | |
| // | |
| var proxy = httpProxy.createProxyServer({}); | |
| // | |
| // Create your custom server and just call `proxy.web()` to proxy | |
| // a web request to the target passed in the options | |
| // also you can use `proxy.ws()` to proxy a websockets request | |
| // | |
| var server = http.createServer(function(req, res) { | |
| // You can define here your custom logic to handle the request | |
| // and then proxy the request. | |
| proxy.web(req, res, { target: 'http://127.0.0.1:5060' }); | |
| }); | |
| console.log("listening on port 5050") | |
| server.listen(5050); | |
| ``` | |
| #### Modify a response from a proxied server | |
| Sometimes when you have received a HTML/XML document from the server of origin you would like to modify it before forwarding it on. | |
| [Harmon](https://github.com/No9/harmon) allows you to do this in a streaming style so as to keep the pressure on the proxy to a minimum. | |
| #### Setup a stand-alone proxy server with proxy request header re-writing | |
| This example shows how you can proxy a request using your own HTTP server that | |
| modifies the outgoing proxy request by adding a special header. | |
| ```js | |
| var http = require('http'), | |
| httpProxy = require('http-proxy'); | |
| // | |
| // Create a proxy server with custom application logic | |
| // | |
| var proxy = httpProxy.createProxyServer({}); | |
| // To modify the proxy connection before data is sent, you can listen | |
| // for the 'proxyReq' event. When the event is fired, you will receive | |
| // the following arguments: | |
| // (http.ClientRequest proxyReq, http.IncomingMessage req, | |
| // http.ServerResponse res, Object options). This mechanism is useful when | |
| // you need to modify the proxy request before the proxy connection | |
| // is made to the target. | |
| // | |
| proxy.on('proxyReq', function(proxyReq, req, res, options) { | |
| proxyReq.setHeader('X-Special-Proxy-Header', 'foobar'); | |
| }); | |
| var server = http.createServer(function(req, res) { | |
| // You can define here your custom logic to handle the request | |
| // and then proxy the request. | |
| proxy.web(req, res, { | |
| target: 'http://127.0.0.1:5060' | |
| }); | |
| }); | |
| console.log("listening on port 5050") | |
| server.listen(5050); | |
| ``` | |
| #### Setup a stand-alone proxy server with latency | |
| ```js | |
| var http = require('http'), | |
| httpProxy = require('http-proxy'); | |
| // | |
| // Create a proxy server with latency | |
| // | |
| var proxy = httpProxy.createProxyServer(); | |
| // | |
| // Create your server that makes an operation that waits a while | |
| // and then proxies the request | |
| // | |
| http.createServer(function (req, res) { | |
| // This simulates an operation that takes 500ms to execute | |
| setTimeout(function () { | |
| proxy.web(req, res, { | |
| target: 'http://localhost:9008' | |
| }); | |
| }, 500); | |
| }).listen(8008); | |
| // | |
| // Create your target server | |
| // | |
| http.createServer(function (req, res) { | |
| res.writeHead(200, { 'Content-Type': 'text/plain' }); | |
| res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2)); | |
| res.end(); | |
| }).listen(9008); | |
| ``` | |
| #### Listening for proxy events | |
| * `error`: The error event is emitted if the request to the target fail. | |
| * `proxyRes`: This event is emitted if the request to the target got a response. | |
| * `open`: This event is emitted once the proxy websocket was created and piped into the target websocket. | |
| * `close`: This event is emitted once the proxy websocket was closed. | |
| * (DEPRECATED) `proxySocket`: Deprecated in favor of `open`. | |
| ```js | |
| var httpProxy = require('http-proxy'); | |
| // Error example | |
| // | |
| // Http Proxy Server with bad target | |
| // | |
| var proxy = httpProxy.createServer({ | |
| target:'http://localhost:9005' | |
| }); | |
| proxy.listen(8005); | |
| // | |
| // Listen for the `error` event on `proxy`. | |
| proxy.on('error', function (err, req, res) { | |
| res.writeHead(500, { | |
| 'Content-Type': 'text/plain' | |
| }); | |
| res.end('Something went wrong. And we are reporting a custom error message.'); | |
| }); | |
| // | |
| // Listen for the `proxyRes` event on `proxy`. | |
| // | |
| proxy.on('proxyRes', function (proxyRes, req, res) { | |
| console.log('RAW Response from the target', JSON.stringify(proxyRes.headers, true, 2)); | |
| }); | |
| // | |
| // Listen for the `open` event on `proxy`. | |
| // | |
| proxy.on('open', function (proxySocket) { | |
| // listen for messages coming FROM the target here | |
| proxySocket.on('data', hybiParseAndLogMessage); | |
| }); | |
| // | |
| // Listen for the `close` event on `proxy`. | |
| // | |
| proxy.on('close', function (req, socket, head) { | |
| // view disconnected websocket connections | |
| console.log('Client disconnected'); | |
| }); | |
| ``` | |
| #### Using HTTPS | |
| You can activate the validation of a secure SSL certificate to the target connection (avoid self signed certs), just set `secure: true` in the options. | |
| ##### HTTPS -> HTTP | |
| ```js | |
| // | |
| // Create the HTTPS proxy server in front of a HTTP server | |
| // | |
| httpProxy.createServer({ | |
| target: { | |
| host: 'localhost', | |
| port: 9009 | |
| }, | |
| ssl: { | |
| key: fs.readFileSync('valid-ssl-key.pem', 'utf8'), | |
| cert: fs.readFileSync('valid-ssl-cert.pem', 'utf8') | |
| } | |
| }).listen(8009); | |
| ``` | |
| ##### HTTPS -> HTTPS | |
| ```js | |
| // | |
| // Create the proxy server listening on port 443 | |
| // | |
| httpProxy.createServer({ | |
| ssl: { | |
| key: fs.readFileSync('valid-ssl-key.pem', 'utf8'), | |
| cert: fs.readFileSync('valid-ssl-cert.pem', 'utf8') | |
| }, | |
| target: 'https://localhost:9010', | |
| secure: true // Depends on your needs, could be false. | |
| }).listen(443); | |
| ``` | |
| #### Proxying WebSockets | |
| You can activate the websocket support for the proxy using `ws:true` in the options. | |
| ```js | |
| // | |
| // Create a proxy server for websockets | |
| // | |
| httpProxy.createServer({ | |
| target: 'ws://localhost:9014', | |
| ws: true | |
| }).listen(8014); | |
| ``` | |
| Also you can proxy the websocket requests just calling the `ws(req, socket, head)` method. | |
| ```js | |
| // | |
| // Setup our server to proxy standard HTTP requests | |
| // | |
| var proxy = new httpProxy.createProxyServer({ | |
| target: { | |
| host: 'localhost', | |
| port: 9015 | |
| } | |
| }); | |
| var proxyServer = http.createServer(function (req, res) { | |
| proxy.web(req, res); | |
| }); | |
| // | |
| // Listen to the `upgrade` event and proxy the | |
| // WebSocket requests as well. | |
| // | |
| proxyServer.on('upgrade', function (req, socket, head) { | |
| proxy.ws(req, socket, head); | |
| }); | |
| proxyServer.listen(8015); | |
| ``` | |
| ### Contributing and Issues | |
| * Search on Google/Github | |
| * If you can't find anything, open an issue | |
| * If you feel comfortable about fixing the issue, fork the repo | |
| * Commit to your local branch (which must be different from `master`) | |
| * Submit your Pull Request (be sure to include tests and update documentation) | |
| ### Options | |
| `httpProxy.createProxyServer` supports the following options: | |
| * **target**: url string to be parsed with the url module | |
| * **forward**: url string to be parsed with the url module | |
| * **agent**: object to be passed to http(s).request (see Node's [https agent](http://nodejs.org/api/https.html#https_class_https_agent) and [http agent](http://nodejs.org/api/http.html#http_class_http_agent) objects) | |
| * **secure**: true/false, if you want to verify the SSL Certs | |
| * **xfwd**: true/false, adds x-forward headers | |
| * **toProxy**: passes the absolute URL as the `path` (useful for proxying to proxies) | |
| * **hostRewrite**: rewrites the location hostname on (301/302/307/308) redirects. | |
| If you are using the `proxyServer.listen` method, the following options are also applicable: | |
| * **ssl**: object to be passed to https.createServer() | |
| * **ws**: true/false, if you want to proxy websockets | |
| ### Shutdown | |
| * When testing or running server within another program it may be necessary to close the proxy. | |
| * This will stop the proxy from accepting new connections. | |
| ```js | |
| var proxy = new httpProxy.createProxyServer({ | |
| target: { | |
| host: 'localhost', | |
| port: 1337 | |
| } | |
| }); | |
| proxy.close(); | |
| ``` | |
| ### Test | |
| ``` | |
| $ npm test | |
| ``` | |
| ### Logo | |
| Logo created by [Diego Pasquali](http://dribbble.com/diegopq) | |
| ### License | |
| >The MIT License (MIT) | |
| > | |
| >Copyright (c) 2010 - 2013 Nodejitsu Inc. | |
| > | |
| >Permission is hereby granted, free of charge, to any person obtaining a copy | |
| >of this software and associated documentation files (the "Software"), to deal | |
| >in the Software without restriction, including without limitation the rights | |
| >to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| >copies of the Software, and to permit persons to whom the Software is | |
| >furnished to do so, subject to the following conditions: | |
| > | |
| >The above copyright notice and this permission notice shall be included in | |
| >all copies or substantial portions of the Software. | |
| > | |
| >THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| >IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| >FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| >AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| >LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| >OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| >THE SOFTWARE. | |