From c8d9e0f139d0a4b501bfdbb1ec48b636f0b7d086 Mon Sep 17 00:00:00 2001 From: yawnt Date: Mon, 24 Jun 2013 12:01:28 +0200 Subject: [PATCH] [refactor] start working on forwardStream --- lib/node-http-proxy.js | 8 +-- lib/node-http-proxy/http-proxy.js | 82 ++++++++++---------------- lib/node-http-proxy/streams/forward.js | 43 ++++++++++++++ 3 files changed, 77 insertions(+), 56 deletions(-) create mode 100644 lib/node-http-proxy/streams/forward.js diff --git a/lib/node-http-proxy.js b/lib/node-http-proxy.js index 956a5f3..d71c589 100644 --- a/lib/node-http-proxy.js +++ b/lib/node-http-proxy.js @@ -24,10 +24,10 @@ */ -var util = require('util'), - http = require('http'), - https = require('https'), - events = require('events'), +var util = require('util'), + http = require('http'), + https = require('https'), + events = require('events'), maxSockets = 100; // diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index f481ccf..d766919 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -24,10 +24,10 @@ */ -var events = require('events'), - http = require('http'), - util = require('util'), - url = require('url'), +var events = require('events'), + http = require('http'), + util = require('util'), + url = require('url'), httpProxy = require('../node-http-proxy'); // @@ -91,10 +91,12 @@ var HttpProxy = exports.HttpProxy = function (options) { // // Setup opt-in features // - this.enable = options.enable || {}; - this.enable.xforward = typeof this.enable.xforward === 'boolean' - ? this.enable.xforward - : true; + this.enable = options.enable || {}; + + if(typeof this.enable.xforward !== 'boolean') { + this.enable.xforward = true; + } + // // Setup additional options for WebSocket proxying. When forcing @@ -140,29 +142,17 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { // * `x-forwarded-port`: Port of the original request. // if (this.enable.xforward && req.connection && req.socket) { - if (req.headers['x-forwarded-for']) { - var addressToAppend = "," + req.connection.remoteAddress || req.socket.remoteAddress; - req.headers['x-forwarded-for'] += addressToAppend; - } - else { - req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.socket.remoteAddress; - } + req.headers['x-forwarded-for'] = (req.headers['x-forwarded-for'] || '') + + (req.headers['x-forwarded-for'] ? ',' : '') + + (req.connection.remoteAddress || socket.remoteAddress); + + req.headers['x-forwarded-port'] = (req.headers['x-forwarded-port'] || '') + + (req.headers['x-forwarded-port'] ? ',' : '') + + (req.connection.remotePort || socket.remotePort); - if (req.headers['x-forwarded-port']) { - var portToAppend = "," + req.connection.remotePort || req.socket.remotePort; - req.headers['x-forwarded-port'] += portToAppend; - } - else { - req.headers['x-forwarded-port'] = req.connection.remotePort || req.socket.remotePort; - } - - if (req.headers['x-forwarded-proto']) { - var protoToAppend = "," + getProto(req); - req.headers['x-forwarded-proto'] += protoToAppend; - } - else { - req.headers['x-forwarded-proto'] = getProto(req); - } + req.headers['x-forwarded-proto'] = (req.headers['x-forwarded-proto'] || '') + + (req.headers['x-forwarded-proto'] ? ',' : '') + + getProto(req); } if (this.timeout) { @@ -469,29 +459,17 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, upgradeHead, // * `x-forwarded-port`: Port of the original request. // if (this.enable.xforward && req.connection) { - if (req.headers['x-forwarded-for']) { - var addressToAppend = "," + req.connection.remoteAddress || socket.remoteAddress; - req.headers['x-forwarded-for'] += addressToAppend; - } - else { - req.headers['x-forwarded-for'] = req.connection.remoteAddress || socket.remoteAddress; - } + req.headers['x-forwarded-for'] = (req.headers['x-forwarded-for'] || '') + + (req.headers['x-forwarded-for'] ? ',' : '') + + (req.connection.remoteAddress || socket.remoteAddress); + + req.headers['x-forwarded-port'] = (req.headers['x-forwarded-port'] || '') + + (req.headers['x-forwarded-port'] ? ',' : '') + + (req.connection.remotePort || socket.remotePort); - if (req.headers['x-forwarded-port']) { - var portToAppend = "," + req.connection.remotePort || socket.remotePort; - req.headers['x-forwarded-port'] += portToAppend; - } - else { - req.headers['x-forwarded-port'] = req.connection.remotePort || socket.remotePort; - } - - if (req.headers['x-forwarded-proto']) { - var protoToAppend = "," + (req.connection.pair ? 'wss' : 'ws'); - req.headers['x-forwarded-proto'] += protoToAppend; - } - else { - req.headers['x-forwarded-proto'] = req.connection.pair ? 'wss' : 'ws'; - } + req.headers['x-forwarded-proto'] = (req.headers['x-forwarded-proto'] || '') + + (req.headers['x-forwarded-proto'] ? ',' : '') + + (req.connection.pair ? 'wss' : 'ws'); } self.emit('websocket:start', req, socket, head, this.target); diff --git a/lib/node-http-proxy/streams/forward.js b/lib/node-http-proxy/streams/forward.js new file mode 100644 index 0000000..55f50d9 --- /dev/null +++ b/lib/node-http-proxy/streams/forward.js @@ -0,0 +1,43 @@ +var Writable = require('stream').Writable, + http = require('http'), + https = require('https'), + util = require('util'); + +var ForwardStream = module.exports = function ForwardStream(options) { + Writable.call(this); + + var self = this; + + this.once('pipe', function(req) { + self.outgoing = options.https ? https : http; + + [ + 'host', + 'hostname', + 'port', + 'socketPath', + 'agent' + ].forEach(function(elem) { + outgoing[elem] = target[elem]; + }); + + [ + 'method', + 'path', + 'headers' + ].forEach(function(elem) { + outgoing[elem] = req[elem]; + }); + + }); + +} + +ForwardStream.prototype._write = function() { + + + +} + +util.inherits(ForwardStream, Writable); +