mirror of
https://github.com/http-party/node-http-proxy.git
synced 2025-12-08 20:59:18 +00:00
[minor] Style updates and whitespace cleaning for consistency
This commit is contained in:
parent
8eaec35074
commit
f0917a3f97
@ -1,11 +1,34 @@
|
|||||||
#!/usr/local/bin/node
|
/*
|
||||||
|
body-decoder.js: Example of body-decoder middleware with node-http-proxy
|
||||||
|
|
||||||
|
Copyright (c) 2010 Charlie Robbins, Mikeal Rogers, Fedor Indutny, & Marak Squires.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
var httpProxy = require('http-proxy'),
|
var httpProxy = require('http-proxy'),
|
||||||
http = require('http'),
|
http = require('http'),
|
||||||
util = require('util'),
|
util = require('util'),
|
||||||
colors = require('colors');
|
colors = require('colors');
|
||||||
|
|
||||||
|
|
||||||
exports.bodyMod = function () {
|
exports.bodyMod = function () {
|
||||||
console.log('middleware has been started.'.green);
|
console.log('middleware has been started.'.green);
|
||||||
return function (req, res, next) {
|
return function (req, res, next) {
|
||||||
@ -16,16 +39,22 @@ exports.bodyMod = function () {
|
|||||||
console.log('ON DATA')
|
console.log('ON DATA')
|
||||||
total += data;
|
total += data;
|
||||||
});
|
});
|
||||||
|
|
||||||
req.on('end', function () {
|
req.on('end', function () {
|
||||||
console.log('ON END')
|
console.log('ON END')
|
||||||
console.log(total);
|
console.log(total);
|
||||||
|
//
|
||||||
// This line, uncommented, hangs forever.
|
// This line, uncommented, hangs forever.
|
||||||
// proxy.proxyRequest(req, res, { port: 9000, host: 'localhost' });
|
// proxy.proxyRequest(req, res, { port: 9000, host: 'localhost' });
|
||||||
// The following also hangs forever.
|
// The following also hangs forever.
|
||||||
// next.proxyRequest(req, res, { port: 9000, host: 'localhost' });
|
// next.proxyRequest(req, res, { port: 9000, host: 'localhost' });
|
||||||
})
|
//
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
// The following fires just fine.
|
// The following fires just fine.
|
||||||
//proxy.proxyRequest(req, res, { port: 9000, host: 'localhost' });
|
//proxy.proxyRequest(req, res, { port: 9000, host: 'localhost' });
|
||||||
|
//
|
||||||
console.log('request proxied...'.blue);
|
console.log('request proxied...'.blue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
gzip-middleware.js: Basic example of middleware in node-http-proxy
|
gzip-middleware.js: Basic example of `connect-gzip` middleware in node-http-proxy
|
||||||
|
|
||||||
Copyright (c) 2010 Charlie Robbins, Mikeal Rogers, Fedor Indutny, Marak Squires, & Dominic Tarr.
|
Copyright (c) 2010 Charlie Robbins, Mikeal Rogers, Fedor Indutny, Marak Squires, & Dominic Tarr.
|
||||||
|
|
||||||
@ -32,7 +32,6 @@ var util = require('util'),
|
|||||||
//
|
//
|
||||||
// Basic Http Proxy Server
|
// Basic Http Proxy Server
|
||||||
//
|
//
|
||||||
|
|
||||||
httpProxy.createServer(
|
httpProxy.createServer(
|
||||||
require('connect-gzip').gzip({ matchType: /.?/ }),
|
require('connect-gzip').gzip({ matchType: /.?/ }),
|
||||||
9000, 'localhost'
|
9000, 'localhost'
|
||||||
@ -41,12 +40,11 @@ httpProxy.createServer(
|
|||||||
//
|
//
|
||||||
// Target Http Server
|
// Target Http Server
|
||||||
//
|
//
|
||||||
http.createServer(
|
http.createServer(function (req, res) {
|
||||||
function (req, res) {
|
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
||||||
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
|
||||||
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
|
res.end();
|
||||||
res.end();
|
}).listen(9000);
|
||||||
}).listen(9000);
|
|
||||||
|
|
||||||
util.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow);
|
util.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow);
|
||||||
util.puts('http server '.blue + 'started '.green.bold + 'on port '.blue + '9000 '.yellow);
|
util.puts('http server '.blue + 'started '.green.bold + 'on port '.blue + '9000 '.yellow);
|
||||||
|
|||||||
@ -1,3 +1,29 @@
|
|||||||
|
/*
|
||||||
|
url-middleware.js: Example of a simple url routing middleware for node-http-proxy
|
||||||
|
|
||||||
|
Copyright (c) 2010 Charlie Robbins, Mikeal Rogers, Fedor Indutny, & Marak Squires.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
var util = require('util'),
|
var util = require('util'),
|
||||||
colors = require('colors'),
|
colors = require('colors'),
|
||||||
http = require('http'),
|
http = require('http'),
|
||||||
@ -10,13 +36,18 @@ var util = require('util'),
|
|||||||
//
|
//
|
||||||
|
|
||||||
function matcher (url, dest) {
|
function matcher (url, dest) {
|
||||||
|
//
|
||||||
// First, turn the URL into a regex.
|
// First, turn the URL into a regex.
|
||||||
// NOTE: Turning user input directly into a Regular Expression is NOT SAFE.
|
// NOTE: Turning user input directly into a Regular Expression is NOT SAFE.
|
||||||
|
//
|
||||||
var r = new RegExp(url.replace(/\//, '\\/'));
|
var r = new RegExp(url.replace(/\//, '\\/'));
|
||||||
|
|
||||||
|
//
|
||||||
// This next block of code may look a little confusing.
|
// This next block of code may look a little confusing.
|
||||||
// It returns a closure (anonymous function) for each URL to be matched,
|
// It returns a closure (anonymous function) for each URL to be matched,
|
||||||
// storing them in an array - on each request, if the URL matches one that has
|
// storing them in an array - on each request, if the URL matches one that has
|
||||||
// a function stored for it, the function will be called.
|
// a function stored for it, the function will be called.
|
||||||
|
//
|
||||||
return function (url) {
|
return function (url) {
|
||||||
var m = r(url)
|
var m = r(url)
|
||||||
if (!m) {
|
if (!m) {
|
||||||
@ -24,7 +55,10 @@ function matcher (url, dest) {
|
|||||||
}
|
}
|
||||||
var path = url.slice(m[0].length);
|
var path = url.slice(m[0].length);
|
||||||
console.log('proxy:', url, '->', dest);
|
console.log('proxy:', url, '->', dest);
|
||||||
return {url: path, dest: dest};
|
return {
|
||||||
|
url: path,
|
||||||
|
dest: dest
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,26 +95,29 @@ exports.urls = function (urls) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
// Now we set up our proxy.
|
// Now we set up our proxy.
|
||||||
|
//
|
||||||
httpProxy.createServer(
|
httpProxy.createServer(
|
||||||
|
//
|
||||||
// This is where our middlewares go, with any options desired - in this case,
|
// This is where our middlewares go, with any options desired - in this case,
|
||||||
// the list of routes/URLs and their destinations.
|
// the list of routes/URLs and their destinations.
|
||||||
|
//
|
||||||
exports.urls({
|
exports.urls({
|
||||||
'/hello': { port: 9000, host: 'localhost' },
|
'/hello': { port: 9000, host: 'localhost' },
|
||||||
'/charlie': { port: 80, host: 'charlieistheman.com' },
|
'/charlie': { port: 80, host: 'charlieistheman.com' },
|
||||||
'/google': { port: 80, host: 'google.com' }
|
'/google': { port: 80, host: 'google.com' }
|
||||||
})
|
});
|
||||||
).listen(8000);
|
).listen(8000);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Target Http Server (to listen for requests on 'localhost')
|
// Target Http Server (to listen for requests on 'localhost')
|
||||||
//
|
//
|
||||||
http.createServer(
|
http.createServer(function (req, res) {
|
||||||
function (req, res) {
|
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
||||||
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
|
||||||
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
|
res.end();
|
||||||
res.end();
|
}).listen(9000);
|
||||||
}).listen(9000);
|
|
||||||
|
|
||||||
// And finally, some colored startup output.
|
// And finally, some colored startup output.
|
||||||
util.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow);
|
util.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow);
|
||||||
|
|||||||
@ -47,6 +47,7 @@ var server = http.createServer(function (req, res) {
|
|||||||
res.writeHead(200);
|
res.writeHead(200);
|
||||||
res.end();
|
res.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
server.listen(8080);
|
server.listen(8080);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@ -117,25 +117,27 @@ exports.setMaxSockets = function (value) {
|
|||||||
// stack
|
// stack
|
||||||
// adapted from https://github.com/creationix/stack
|
// adapted from https://github.com/creationix/stack
|
||||||
//
|
//
|
||||||
|
|
||||||
function stack (middlewares, proxy) {
|
function stack (middlewares, proxy) {
|
||||||
var handle;
|
var handle;
|
||||||
middlewares.reverse().forEach(function (layer) {
|
middlewares.reverse().forEach(function (layer) {
|
||||||
|
|
||||||
var child = handle;
|
var child = handle;
|
||||||
handle = function (req, res) {
|
handle = function (req, res) {
|
||||||
var next = function (err) {
|
var next = function (err) {
|
||||||
if (err) {
|
if (err) {
|
||||||
throw err;
|
throw err;
|
||||||
//TODO: figure out where to send errors.
|
//
|
||||||
//return error(req, res, err);
|
// TODO: figure out where to send errors.
|
||||||
}
|
// return error(req, res, err);
|
||||||
child(req, res);
|
//
|
||||||
}
|
}
|
||||||
|
child(req, res);
|
||||||
|
}
|
||||||
|
|
||||||
next.__proto__ = proxy;
|
next.__proto__ = proxy;
|
||||||
layer(req, res, next);
|
layer(req, res, next);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,47 +155,59 @@ function stack (middlewares, proxy) {
|
|||||||
//
|
//
|
||||||
exports.createServer = function () {
|
exports.createServer = function () {
|
||||||
var args = Array.prototype.slice.call(arguments),
|
var args = Array.prototype.slice.call(arguments),
|
||||||
callback,
|
callback, forward,
|
||||||
options = {}, port, host, forward, silent, proxy, server, middleware = [];
|
port, host,
|
||||||
|
proxy, server,
|
||||||
|
options = {},
|
||||||
|
middleware = [],
|
||||||
|
silent;
|
||||||
|
|
||||||
args.forEach(function (arg) {
|
args.forEach(function (arg) {
|
||||||
|
|
||||||
switch (typeof arg) {
|
switch (typeof arg) {
|
||||||
case 'string': host = arg; break;
|
case 'string': host = arg; break;
|
||||||
case 'number': port = arg; break;
|
case 'number': port = arg; break;
|
||||||
case 'function': middleware.push(arg); break;
|
case 'function': middleware.push(arg); break;
|
||||||
case 'object': options = arg; break;
|
case 'object': options = arg; break;
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var proxy = new HttpProxy(options);
|
var proxy = new HttpProxy(options);
|
||||||
|
|
||||||
if (port && host) {
|
if (port && host) {
|
||||||
//
|
//
|
||||||
// If we have a target host and port for the request
|
// If we have a target host and port for the request
|
||||||
// then proxy to the specified location.
|
// then proxy to the specified location.
|
||||||
//
|
//
|
||||||
handler = function (req, res) {
|
handler = function (req, res) {
|
||||||
proxy.proxyRequest(req, res, {
|
proxy.proxyRequest(req, res, {
|
||||||
port: port,
|
port: port,
|
||||||
host: host
|
host: host
|
||||||
});
|
});
|
||||||
}
|
|
||||||
if(middleware.length) middleware.push(handler)
|
|
||||||
}
|
|
||||||
else if (proxy.proxyTable) {
|
|
||||||
//
|
|
||||||
// If the proxy is configured with a ProxyTable
|
|
||||||
// instance then use that before failing.
|
|
||||||
//
|
|
||||||
handler = function (req, res) {
|
|
||||||
proxy.proxyRequest(req, res);
|
|
||||||
}
|
|
||||||
if(middleware.length) middleware.push(handler)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(middleware.length) handler = stack(middleware, proxy);
|
if (middleware.length) {
|
||||||
|
middleware.push(handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (proxy.proxyTable) {
|
||||||
|
//
|
||||||
|
// If the proxy is configured with a ProxyTable
|
||||||
|
// instance then use that before failing.
|
||||||
|
//
|
||||||
|
handler = function (req, res) {
|
||||||
|
proxy.proxyRequest(req, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (middleware.length) {
|
||||||
|
middleware.push(handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (middleware.length) {
|
||||||
|
//handler = callback = middleware.shift()
|
||||||
|
//else if (middleware.length)
|
||||||
|
handler = callback = stack(middleware, proxy);
|
||||||
|
}
|
||||||
|
|
||||||
if (!handler) {
|
if (!handler) {
|
||||||
//
|
//
|
||||||
@ -219,7 +233,6 @@ exports.createServer = function () {
|
|||||||
// websocket request automatically
|
// websocket request automatically
|
||||||
server.on('upgrade', function (req, socket, head) {
|
server.on('upgrade', function (req, socket, head) {
|
||||||
// Tunnel websocket requests too
|
// Tunnel websocket requests too
|
||||||
|
|
||||||
proxy.proxyWebSocketRequest(req, socket, head, {
|
proxy.proxyWebSocketRequest(req, socket, head, {
|
||||||
port: port,
|
port: port,
|
||||||
host: host
|
host: host
|
||||||
@ -340,7 +353,9 @@ HttpProxy.prototype.buffer = function (obj) {
|
|||||||
// if they exist.
|
// if they exist.
|
||||||
//
|
//
|
||||||
HttpProxy.prototype.close = function () {
|
HttpProxy.prototype.close = function () {
|
||||||
if (this.proxyTable) this.proxyTable.close();
|
if (this.proxyTable) {
|
||||||
|
this.proxyTable.close();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -407,7 +422,7 @@ HttpProxy.prototype.proxyRequest = function (req, res, options) {
|
|||||||
// * `x-forwarded-proto`: Protocol of the original request
|
// * `x-forwarded-proto`: Protocol of the original request
|
||||||
// * `x-forwarded-port`: Port of the original request.
|
// * `x-forwarded-port`: Port of the original request.
|
||||||
//
|
//
|
||||||
if (options.enableXForwarded == true) {
|
if (options.enableXForwarded === true) {
|
||||||
req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress;
|
req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress;
|
||||||
req.headers['x-forwarded-port'] = req.connection.remotePort || req.connection.socket.remotePort;
|
req.headers['x-forwarded-port'] = req.connection.remotePort || req.connection.socket.remotePort;
|
||||||
req.headers['x-forwarded-proto'] = res.connection.pair ? 'https' : 'http';
|
req.headers['x-forwarded-proto'] = res.connection.pair ? 'https' : 'http';
|
||||||
@ -624,9 +639,11 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
|
|||||||
res.writeHead(404);
|
res.writeHead(404);
|
||||||
return res.end();
|
return res.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
options.port = location.port;
|
options.port = location.port;
|
||||||
options.host = location.host;
|
options.host = location.host;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// WebSocket requests must have the `GET` method and
|
// WebSocket requests must have the `GET` method and
|
||||||
// the `upgrade:websocket` header
|
// the `upgrade:websocket` header
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user