diff --git a/docs/node-http-proxy.html b/docs/node-http-proxy.html index 2bbe638a7..7ef31c953 100644 --- a/docs/node-http-proxy.html +++ b/docs/node-http-proxy.html @@ -27,7 +27,6 @@ var util = require('util'), http = require('http'), events = require('events'), - winston = require('winston'), ProxyTable = require('./proxy-table').ProxyTable, maxSockets = 100;

Version 0.4.2

exports.version = [0, 4, 2];

function _getAgent (host, port)

@@ -88,16 +87,14 @@

@handler {function} Optional Request handler for the server proxy = new HttpProxy(options); server = http.createServer(function (req, res) { - winston.verbose('Incoming HTTP request to: ' + req.headers.host + req.url);

If we were passed a callback to process the request + proxy.emit('request', req, request.headers.host, req.url);

If we were passed a callback to process the request or response in some way, then call it.

    if (callback) {
       callback(req, res, proxy);
     } 
     else if (port && host) {
-      winston.verbose('Proxying HTTP request to: ' + host + ':' + port);
       proxy.proxyRequest(req, res, port, host);
     }
     else if (proxy.proxyTable) {
-      winston.verbose('Proxying request using proxy table');
       proxy.proxyRequest(req, res);
     }
     else {
@@ -233,12 +230,13 @@ 

@buffer {Object} Optional Result from httpProxy.buffe port = location.port; host = location.host; } -

If forwarding is enabled for this instance, foward proxy the +

Emit the start event indicating that we have begun the proxy operation.

  this.emit('start', req, res, host, port);
+  

If forwarding is enabled for this instance, foward proxy the specified request to the address provided in this.options.forward

  if (this.options.forward) {
-    winston.verbose('Forwarding HTTP request to: ' + this.options.forward.host + ':' + this.options.forward.port);
+    this.emit('forward', req, res, this.options.forward.host, this.options.forward.port);
     this._forwardRequest(req);
   }
-  

function proxyError (err)

+

function proxyError (err)

@err {Error} Error contacting the proxy target

@@ -262,20 +260,20 @@

@err {Error} Error contacting the proxy target

path: req.url, headers: req.headers }; -

Force the connection header to be 'close' until +

Force the connection header to be 'close' until node.js core re-implements 'keep-alive'.

  opts.headers['connection'] = 'close';
-  

Open new HTTP request to internal resource with will act as a reverse proxy pass

  reverseProxy = http.request(opts, function (response) {
-    

Process the reverseProxy response when it's received.

    if (response.headers.connection) {
+  

Open new HTTP request to internal resource with will act as a reverse proxy pass

  reverseProxy = http.request(opts, function (response) {
+    

Process the reverseProxy response when it's received.

    if (response.headers.connection) {
       if (req.headers.connection) response.headers.connection = req.headers.connection;
       else response.headers.connection = 'close';
-    }

Set the headers of the client response

    res.writeHead(response.statusCode, response.headers);

response.statusCode === 304: No 'data' event and no 'end'

    if (response.statusCode === 304) {
+    }

Set the headers of the client response

    res.writeHead(response.statusCode, response.headers);

response.statusCode === 304: No 'data' event and no 'end'

    if (response.statusCode === 304) {
       return res.end();
-    }

For each data chunk received from the reverseProxy + }

For each data chunk received from the reverseProxy response write it to the outgoing res.

    response.on('data', function (chunk) {
       if (req.method !== 'HEAD') {
         res.write(chunk);
       }
-    });

When the reverseProxy response ends, end the + });

When the reverseProxy response ends, end the corresponding outgoing res unless we have entered an error state. In which case, assume res.end() has already been called and the 'error' event listener @@ -286,22 +284,22 @@

@err {Error} Error contacting the proxy target

} }); }); -

Handle 'error' events from the reverseProxy.

  reverseProxy.once('error', proxyError);
-  

For each data chunk received from the incoming +

Handle 'error' events from the reverseProxy.

  reverseProxy.once('error', proxyError);
+  

For each data chunk received from the incoming req write it to the reverseProxy request.

  req.on('data', function (chunk) {
     if (!errState) {
       reverseProxy.write(chunk);
     }
-  });

When the incoming req ends, end the corresponding reverseProxy + });

When the incoming req ends, end the corresponding reverseProxy request unless we have entered an error state.

  req.on('end', function () {
     if (!errState) {
       reverseProxy.end();
     }
-  });

If we have been passed buffered data, resume it.

  if (buffer && !errState) {
+  });

If we have been passed buffered data, resume it.

  if (buffer && !errState) {
     buffer.resume();
   }
 };
-  

@private function _forwardRequest (req)

+

@private function _forwardRequest (req)

@req {ServerRequest} Incoming HTTP Request to proxy.

@@ -320,31 +318,31 @@

@req {ServerRequest} Incoming HTTP Request to proxy.

path: req.url, headers: req.headers }; -

Force the connection header to be 'close' until +

Force the connection header to be 'close' until node.js core re-implements 'keep-alive'.

  opts.headers['connection'] = 'close';
-  

Open new HTTP request to internal resource with will act as a reverse proxy pass

  forwardProxy = http.request(opts, function (response) {

Ignore the response from the forward proxy since this is a 'fire-and-forget' proxy. +

Open new HTTP request to internal resource with will act as a reverse proxy pass

  forwardProxy = http.request(opts, function (response) {

Ignore the response from the forward proxy since this is a 'fire-and-forget' proxy. Remark (indexzero): We will eventually emit a 'forward' event here for performance tuning.

  });
-  

Add a listener for the connection timeout event.

+

Add a listener for the connection timeout event.

Remark: Ignoring this error in the event - forward target doesn't exist.

  forwardProxy.once('error', function (err) { });

Chunk the client request body as chunks from the proxied request come in

  req.on('data', function (chunk) {
+        forward target doesn't exist.

  forwardProxy.once('error', function (err) { });

Chunk the client request body as chunks from the proxied request come in

  req.on('data', function (chunk) {
     forwardProxy.write(chunk);
-  })

At the end of the client request, we are going to stop the proxied request

  req.on('end', function () {
+  })

At the end of the client request, we are going to stop the proxied request

  req.on('end', function () {
     forwardProxy.end();
   });
 };
 
 HttpProxy.prototype.proxyWebSocketRequest = function (port, server, host, data) {
   var self = this, req = self.req, socket = self.sock, head = self.head, 
-      headers = new _headers(req.headers), CRLF = '\r\n';

Will generate clone of headers + headers = new _headers(req.headers), CRLF = '\r\n';

Will generate clone of headers To not change original

  function _headers(headers) {
     var h = {};
     for (var i in headers) {
       h[i] = headers[i];
     }
     return h;
-  }

WebSocket requests has method = GET

  if (req.method !== 'GET' || headers.upgrade.toLowerCase() !== 'websocket') {

This request is not WebSocket request

    return;
-  }

Turn of all bufferings + }

WebSocket requests has method = GET

  if (req.method !== 'GET' || headers.upgrade.toLowerCase() !== 'websocket') {

This request is not WebSocket request

    return;
+  }

Turn of all bufferings For server set KeepAlive For client set encoding

  function _socket(socket, server) {
     socket.setTimeout(0);
@@ -355,20 +353,20 @@ 

@req {ServerRequest} Incoming HTTP Request to proxy.

else { socket.setEncoding('utf8'); } - }

Client socket

  _socket(socket);

If host is undefined + }

Client socket

  _socket(socket);

If host is undefined Get it from headers

  if (!host) {
     host = headers.Host;
   }
-  

Remote host address

  var remote_host = server + (port - 80 === 0 ? '' : ':' + port);

Change headers

  headers.Host = remote_host;
-  headers.Origin = 'http://' + remote_host;

Open request

  var p = manager.getPool(port, server);
+  

Remote host address

  var remote_host = server + (port - 80 === 0 ? '' : ':' + port);

Change headers

  headers.Host = remote_host;
+  headers.Origin = 'http://' + remote_host;

Open request

  var p = manager.getPool(port, server);
 
-  p.getClient(function(client) {

Based on 'pool/main.js'

    var request = client.request('GET', req.url, headers);
+  p.getClient(function(client) {

Based on 'pool/main.js'

    var request = client.request('GET', req.url, headers);
 
     var errorListener = function (error) {
       client.removeListener('error', errorListener);
-      

Remove the client from the pool's available clients since it has errored

      p.clients.splice(p.clients.indexOf(client), 1);
+      

Remove the client from the pool's available clients since it has errored

      p.clients.splice(p.clients.indexOf(client), 1);
       socket.end();
-    }

Not disconnect on update

    client.on('upgrade', function(request, remote_socket, head) {

Prepare socket

      _socket(remote_socket, true);

Emit event

      onUpgrade(remote_socket);
+    }

Not disconnect on update

    client.on('upgrade', function(request, remote_socket, head) {

Prepare socket

      _socket(remote_socket, true);

Emit event

      onUpgrade(remote_socket);
     });
 
     client.on('error', errorListener);
@@ -382,23 +380,23 @@ 

@req {ServerRequest} Incoming HTTP Request to proxy.

client.busy = true; var handshake; - request.socket.on('data', handshake = function(data) {

Handshaking

Ok, kind of harmfull part of code + request.socket.on('data', handshake = function(data) {

Handshaking

Ok, kind of harmfull part of code Socket.IO is sending hash at the end of handshake If protocol = 76 But we need to replace 'host' and 'origin' in response So we split data to printable data and to non-printable -(Non-printable will come after double-CRLF)

      var sdata = data.toString();

Get Printable

      sdata = sdata.substr(0, sdata.search(CRLF + CRLF));

Get Non-Printable

      data = data.slice(Buffer.byteLength(sdata), data.length);

Replace host and origin

      sdata = sdata.replace(remote_host, host)
+(Non-printable will come after double-CRLF)

      var sdata = data.toString();

Get Printable

      sdata = sdata.substr(0, sdata.search(CRLF + CRLF));

Get Non-Printable

      data = data.slice(Buffer.byteLength(sdata), data.length);

Replace host and origin

      sdata = sdata.replace(remote_host, host)
                    .replace(remote_host, host);
 
-      try {

Write printable

        socket.write(sdata);

Write non-printable

        socket.write(data);
+      try {

Write printable

        socket.write(sdata);

Write non-printable

        socket.write(data);
       } 
       catch (e) {
         request.end();
         socket.end();
-      }

Catch socket errors

      socket.on('error', function() {
+      }

Catch socket errors

      socket.on('error', function() {
         request.end();
-      });

Remove data listener now that the 'handshake' is complete

      request.socket.removeListener('data', handshake);
-    });

Write upgrade-head

    try {
+      });

Remove data listener now that the 'handshake' is complete

      request.socket.removeListener('data', handshake);
+    });

Write upgrade-head

    try {
       request.write(head);
     } 
     catch(e) {
@@ -406,9 +404,9 @@ 

@req {ServerRequest} Incoming HTTP Request to proxy.

socket.end(); } self.unwatch(socket); - });

Request

  function onUpgrade(reverse_proxy) {
+  });

Request

  function onUpgrade(reverse_proxy) {
     var listeners = {};
-    

We're now connected to the server, so lets change server socket

    reverse_proxy.on('data', listeners._r_data = function(data) {

Pass data to client

      if (socket.writable) {
+    

We're now connected to the server, so lets change server socket

    reverse_proxy.on('data', listeners._r_data = function(data) {

Pass data to client

      if (socket.writable) {
         try {
           socket.write(data);
         } 
@@ -419,19 +417,19 @@ 

@req {ServerRequest} Incoming HTTP Request to proxy.

} }); - socket.on('data', listeners._data = function(data) {

Pass data from client to server

      try {
+    socket.on('data', listeners._data = function(data) {

Pass data from client to server

      try {
         reverse_proxy.write(data);
       } 
       catch (e) {
         reverse_proxy.end();
         socket.end();
       }
-    });

Detach event listeners from reverse_proxy

    function detach() {
+    });

Detach event listeners from reverse_proxy

    function detach() {
       reverse_proxy.removeListener('close', listeners._r_close);
       reverse_proxy.removeListener('data', listeners._r_data);
       socket.removeListener('data', listeners._data);
       socket.removeListener('close', listeners._close);
-    }

Hook disconnections

    reverse_proxy.on('end', listeners._r_close = function() {
+    }

Hook disconnections

    reverse_proxy.on('end', listeners._r_close = function() {
       socket.end();
       detach();
     });
diff --git a/docs/proxy-table.html b/docs/proxy-table.html
index d8462fb03..d03364740 100644
--- a/docs/proxy-table.html
+++ b/docs/proxy-table.html
@@ -26,8 +26,7 @@
 
 var util = require('util'),
     events = require('events'),
-    fs = require('fs'),
-    winston = require('winston');

function ProxyTable (router, silent)

+ fs = require('fs');

function ProxyTable (router, silent)

@router {Object} Object containing the host based routes

@@ -101,8 +100,6 @@

@req {ServerRequest} The incoming server request to get proxy information ab host = location[0], port = location.length === 1 ? 80 : location[1]; - winston.verbose('Proxy Table proxying request to: ' + host + ':' + port); - return { port: port, host: host @@ -118,8 +115,6 @@

@req {ServerRequest} The incoming server request to get proxy information ab host = location[0], port = location.length === 1 ? 80 : location[1]; - winston.verbose('Proxy Table proxying request to: ' + host + ':' + port); - return { port: port, host: host