diff --git a/.gitignore b/.gitignore
index e49c0e1..c3d3bc0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,6 @@ coverage
tests/.work
dev
*.sublime-*
+config*.json
+*.log
run_tests.sh
diff --git a/HttpMasterWorker.js b/HttpMasterWorker.js
deleted file mode 100644
index 712382c..0000000
--- a/HttpMasterWorker.js
+++ /dev/null
@@ -1,407 +0,0 @@
-'use strict';
-var crypto = require('crypto'),
- extend = require('extend'),
- net = require('net'),
- http = require('http'),
- https = require('https'),
- async = require('async'),
- regexpQuote = require('./DispatchTable').regexpQuote,
- url = require('url'),
- tls = require('tls');
-
-var nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
-
-var EventEmitter = require('events').EventEmitter;
-
-var argv = {}; // will be sent by master
-
-var common = require('./common');
-var runModules = common.runModules;
-var punycode = require('punycode');
-
-var createCredentials;
-if(tls.createSecureContext) {
- createCredentials = tls.createSecureContext;
-} else {
- createCredentials = crypto.createCredentials;
-}
-
-
-function lazyGetTcpServer(port, host, cb) {
- var tcpServers = this.tcpServers;
-
- var entry = (host ? host + ':' + port : port);
- if (tcpServers[entry]) {
- cb(null, tcpServers[entry]);
- } else {
- var tcpServer = tcpServers[entry] = net.createServer();
-
- var handler = function(err) {
- if (err) return cb(err);
- cb(null, tcpServer);
- };
- try {
- if (host)
- tcpServer.listen(port, host, handler);
- else
- tcpServer.listen(port, handler);
- tcpServer.once('error', function(err) {
- delete tcpServers[entry];
- cb(err);
- });
- } catch (err) {
- cb(err);
- }
- }
-}
-
-function loadKeysforConfigEntry(config, callback) {
- var key;
- if (config.ssl) {
- var SNI = config.ssl.SNI;
- var SNImatchers = {};
- if (config.ssl.SNI) {
- for (key in config.ssl.SNI) {
- SNImatchers[key] = new RegExp(regexpQuote(key).replace(/^\\\*\\\./g, '^([^.]+\\.)?'), 'i'); // domain names are case insensitive
- }
- var sniCallback = function(hostname, cb) {
- hostname = punycode.toUnicode(hostname);
- for (var key in SNI) {
- if (hostname.match(SNImatchers[key])) {
- if (cb) // since node 0.11.5
- return cb(null, SNI[key]);
- else
- return SNI[key];
- }
- }
- if (cb)
- return cb(null);
- };
- config.ssl.SNICallback = sniCallback;
- }
-
- // loadKeysForContext(config.ssl, function(err) {
- // if (err) return callback(err);
-
- if (SNI) {
- var todo = [];
- for (key in SNI) {
- todo.push(key);
- }
-
- async.each(todo, function(key, sniLoaded) {
- SNI[key].ciphers = SNI[key].ciphers || config.ssl.ciphers;
- SNI[key].honorCipherOrder = SNI[key].honorCipherOrder || config.ssl.honorCipherOrder;
- SNI[key].ecdhCurve = SNI[key].ecdhCurve || config.ssl.ecdhCurve;
-
- // joyent/node#7249
- if (SNI[key].honorCipherOrder) {
- SNI[key].secureOptions = require('constants').SSL_OP_CIPHER_SERVER_PREFERENCE;
- }
- if (!SNI[key].ecdhCurve) {
- SNI[key].ecdhCurve = require('tls').DEFAULT_ECDH_CURVE;
- }
-
- // loadKeysForContext(SNI[key], function(err) {
- // if (err) return sniLoaded(err);
- try {
- var credentials = createCredentials(SNI[key]);
- SNI[key] = credentials.context;
- sniLoaded();
- } catch (err) {
- sniLoaded(err);
- }
- // });
- }, callback);
- } else { // (!SNI)
- callback();
- }
- // });
- } else { // (!config.ssl)
- callback();
- }
-}
-
-function handleConfigEntry(config, callback) {
- var self = this;
- loadKeysforConfigEntry(config, function(err) {
- if (err) {
- return callback(err);
- }
- handleConfigEntryAfterLoadingKeys.call(self, config, callback);
- });
-}
-
-function patchSslConfig(portEntryConfig) {
- if(nodeVersion >= 0.11) { // use fancy cipher settings only for 0.11
- if(portEntryConfig.ssl.honorCipherOrder !== false) {
- // prefer server ciphers over clients - prevents BEAST attack
- portEntryConfig.ssl.honorCipherOrder = true;
- }
- if(!portEntryConfig.ssl.ciphers) {
- portEntryConfig.ssl.ciphers = 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+AES+SHA:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS::+RC4:RC4';
- if(portEntryConfig.ssl.disableWeakCiphers) {
- portEntryConfig.ssl.ciphers += ':!RC4';
- }
- }
- else if(portEntryConfig.ssl.disableWeakCiphers) {
- this.logNotice('disableWeakCiphers is incompatible with pre-set cipher list');
- }
- } else if(portEntryConfig.ssl.disableWeakCiphers) {
- this.logNotice('disableWeakCiphers is unsupported for node 0.10');
- }
-}
-
-function fetchRequestAndUpgradeHandlers(config, cb) {
- var self = this;
- var requestHandlers = [];
- var upgradeHandlers = [];
- var middlewares = [];
- runModules(function(name, middleware) {
- if (middleware.failedEntries) {
- Object.keys(middleware.failedEntries).forEach(function(key) {
- var failedEntry = middleware.failedEntries[key];
- self.logError('Failed starting entry ' + key + ' : ' + JSON.stringify(failedEntry.entry));
- self.logError(failedEntry.err);
- });
- }
-
- middlewares.push(middleware);
- if (typeof middleware == 'function')
- requestHandlers.push(middleware);
- else if (middleware.requestHandler)
- requestHandlers.push(middleware.handleRequest.bind(middleware));
- if (middleware.upgradeHandler)
- upgradeHandlers.push(middleware.handleUpgrade.bind(middleware));
- }, 'middleware', config);
- cb(requestHandlers, upgradeHandlers);
-}
-
-function handleConfigEntryAfterLoadingKeys(config, callback) {
- var self = this;
- //
- // Check to see if we should silence the logs
- //
- config.silent = typeof argv.silent !== 'undefined' ? argv.silent : config.silent;
-
- fetchRequestAndUpgradeHandlers.call(this, config, function(requestHandlers, upgradeHandlers) {
-
- var handler = require('./requestHandler')(config, requestHandlers);
-
- var originalHandler = handler.request;
- if(config.gzip) {
- var compressMiddleware = require('compression')();
- handler.request = function(req, res, next) {
- compressMiddleware(req, res, function() {
- originalHandler(req, res, next);
- });
- };
- }
-
- var server;
- try {
- if (config.ssl) {
- var baseModule = config.ssl.spdy ? require('spdy') : https;
-
- patchSslConfig.call(self, config);
-
- server = baseModule.createServer(config.ssl, handler.request);
-
- if (!config.ssl.skipWorkerSessionResumption) {
- server.on('resumeSession', self.tlsSessionStore.get.bind(self.tlsSessionStore));
- server.on('newSession', self.tlsSessionStore.set.bind(self.tlsSessionStore));
-
- if (self.token) {
- if (server._setServerData) {
- server._setServerData({
- ticketKeys: self.token
- });
- } else {
- self.logNotice('SSL/TLS ticket session resumption may not work due to missing method _setServerData, you might be using an old version of Node');
- }
- }
- }
- } else {
- server = http.createServer(handler.request);
- }
- } catch (err) {
- return callback(err, null);
- }
-
- function listeningHandler() {
- server.removeAllListeners('error'); // remove the below handler
- callback(null, server);
- server.removeListener('error', errorHandler);
- }
-
- function errorHandler(err) {
- server.removeAllListeners('listening'); // remove the above handler
- callback(err, server);
- server.removeListener('listening', listeningHandler);
- }
-
- server.once('listening', listeningHandler);
- server.once('error', errorHandler);
- server.on('upgrade', function(req, socket, head) {
- req.parsedUrl = url.parse(req.url);
- for (var i = 0; i < upgradeHandlers.length; ++i) {
- if (upgradeHandlers[i](req, socket, head)) { // ws handled
- break;
- }
- }
- });
-
- lazyGetTcpServer.call(self, config.port, config.host, function(err, tcpServer) {
-
- if (err) return callback(err, server);
-
- tcpServer.removeAllListeners();
- tcpServer.on('connection', function(socket) {
- server.emit('connection', socket);
- });
- tcpServer.on('error', function(err) {
- server.emit('error', err);
- });
- tcpServer.on('close', function(err) {
- server.emit('close');
- });
- server.emit('listening');
- // FIXME: this should run at every config reload
-
- runModules('onServerListening', config, server);
- });
- });
-}
-
-function handleConfig(config, configHandled) {
- var self = this;
- runModules('preprocessConfig', config);
-
- async.parallel(Object.keys(config.ports || {}).map(function(portEntry) {
-
- return function(asyncCallback) {
-
- var m;
- // TODO: IPV6?
- if ((m = portEntry.match(/((\S+):)?(\d+)(?:(?:\s*=>\s*)?(\S+):(\d+)?)?/))) {
- var host = m[2];
- var port = parseInt(m[3]);
- var targetHost = m[4];
- var targetPort = m[5];
-
- var portConfig = config.ports[portEntry];
- var configEntry = extend({
- targetHost: targetHost,
- targetPort: targetPort,
- host: host,
- port: port,
- }, portConfig);
-
- handleConfigEntry.call(self, configEntry, function(err, server) {
- var entryString = (configEntry.host ? configEntry.host + ':' + configEntry.port : 'port ' + configEntry.port);
- if (err) {
- self.logError('Error while starting entry ' + entryString + ' : ' + err.toString());
- if (err.stack)
- self.logError(err.stack);
- }
- if (server) {
- self.logNotice('Listening on port: ' + entryString);
- } else
- self.logNotice('Entry ' + entryString + ' is unusable');
- // ignore error to not crash the entire proxy
- asyncCallback(null, server);
- });
- }
- };
- }), function(err, results) {
- if (err) {
- return configHandled(err);
- }
- self.logNotice('Start successful');
-
- // TODO
- //dropPrivileges();
-
- self.servers = results.filter(function(server) {
- return !!server;
- });
- configHandled();
- });
-}
-
-function unbindAll(cb) {
- this.servers.forEach(function(server) {
- server.removeAllListeners();
- });
- var self = this;
- Object.keys(this.tcpServers).forEach(function(key) {
- self.tcpServers[key].removeAllListeners();
- });
- cb();
-}
-
-
-function HttpMasterWorker(config) {
- config = config || {};
- var store = {};
- this.tlsSessionStore = config.tlsSessionStore || {
- get: function(id, cb) {
- id = id.toString('base64');
- cb(null, store[id], null);
- },
- set: function(id, data, cb) {
- id = id.toString('base64');
- store[id] = data;
- if (cb)
- cb();
- }
- };
- this.tcpServers = {};
- this.servers = [];
-}
-
-HttpMasterWorker.prototype = Object.create(EventEmitter.prototype);
-
-HttpMasterWorker.prototype.logNotice = function(msg) {
- this.emit('logNotice', msg);
-};
-
-HttpMasterWorker.prototype.logError = function(msg) {
- this.emit('logError', msg);
-};
-
-HttpMasterWorker.prototype.unbindAll = function(unbindFinished) {
- unbindAll.call(this, unbindFinished);
-};
-
-HttpMasterWorker.prototype.loadConfig = function(config, configLoaded) {
- var self = this;
-
- this.unbindAll(function() {});
-
- handleConfig.call(this, config, function(err) {
- if (err) return configLoaded(err);
- self.gcServers(configLoaded);
- });
-};
-
-HttpMasterWorker.prototype.gcServers = function(gcFinished) {
- var self = this;
- var toClose = [];
-
-
- Object.keys(this.tcpServers).forEach(function(key) {
- var server = self.tcpServers[key];
- if (EventEmitter.listenerCount(server, 'connection') === 0) {
- toClose.push(server);
- delete self.tcpServers[key];
- }
- });
- async.each(toClose, function(server, cb) {
- server.close();
- cb();
- }, gcFinished);
-
-};
-
-module.exports = HttpMasterWorker;
\ No newline at end of file
diff --git a/README.md b/README.md
index d0ce948..4534a0c 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,8 @@
* [About](#about)
-* [Installation and usage](#installandusage)
-* [Usage as a module](#installandusage)
+* [Installation and basic usage](#installandbasicusage)
+* [Usage as a module](#module)
* [Watch config for changes](#watchconfig)
* [Use custom config loader](#configloader)
* Features
@@ -19,7 +19,15 @@
* [URL rewrite](#urlrewrite)
* [Redirect](#redirect)
* [SSL](#ssl)
+ * [Websockify](#websockify)
* [Logging](#logging)
+ * [HTTP authentication](#auth)
+ * [Add header](#addheader)
+ * [Compression / GZIP](#gzip)
+ * [Regexp matching](#regexpmatching)
+ * [Error handling](#reject)
+ * [Serve static directory](#static)
+ * [Advanced routing](#advancedrouting)
* [Systemd](#systemd)
* [Contributors](#contributors)
* [Sponsors](#sponsors)
@@ -28,36 +36,41 @@
## About
-http-master is a front end http service/reverse-proxy with easy setup of proxying/redirecting/other-actions logic.
-It can run as a module or as a standalone application. Your average use case could be having several web applications running on different internal ports and Apache running on port 8080. http-master allows you to easily define rules which domain should target which server and if no rules match, everything else could go to the Apache server. This way you setup your SSL in one place, in http-master and even non-SSL compatible http server can be provided with HTTPS.
+http-master is a front end http service with with easy setup of reverse proxy/redirecting/other-actions logic. It means it was designed to run on your port 80 and 443 but can run on any. It can run as a module or as a standalone application. Your average use case could be having several web applications (node.js, rails, Java etc.) running on different internal ports and Apache running on port 8080. http-master allows you to easily define rules which domain should target which server and if no rules match, everything else could go to the Apache server. This way you setup your SSL in one place, in http-master and even non-SSL compatible http server can be provided with HTTPS. Many different flexible routing configurations are possible to set up.
Some of the features:
-* Automatic loading of certificates from specific directory. Zero-effort HTTPS configuration.
+* Zero-effort HTTPS configuration. Provide only primary domain and configuration is loaded automatically from a given certificate directory.
* Support SNI extension - multiple SSL certificates on the same IP.
+* Supports web sockets.
* Easy all in one place configuration for every listening port (eg. 80 and 443 together)
- * Setup reverse proxy with optional URL rewriting and optional regexp matching of host and/or path.
+ * Setup reverse proxy with optional URL rewriting and optional regexp matching of host and path.
* Setup redirect with optional regexp matching to construct final URL.
* Setup basic static files server for a given route.
* Setup Basic-AUTH for a given route (sponsored feature)
-* Multi-core/cpu friendly. Runs multiple instances/workers which will serve connections in a round-robin fashion. You of course choose to run in the same process without any workers if you use http-master as a module.
+ * Create logs in apache format for any given point in routing setup.
+ * Easily turn any local or remote TCP servers to web sockets. (websockify) Destination may be determined dynamically from a path.
+ * Allows flexible definition of matching behaviour.
+ * Enable compression on one, any or all of the routes.
+ * Add headers to any defined route.
+* Supports unicode domains out of the box.
+* Multi-core/cpu friendly. Runs multiple instances/workers which will serve connections in a round-robin fashion. You can of course choose to run in a single process without any workers, if you use http-master as a module or set worker count to 0.
* SSL tweaked to reasonable security level supporting TLS session resumption.
-* Automatically watches for config changes and reloads the logic without any downtime (\*). Simply start the deamon and add new rules while having the http-master online.
-* Asynchronous logging module. Logs either to stdout or to file.
+* Automatically watches for config changes and reloads the logic without any downtime. Simply start the deamon and add new rules while having the http-master online.
* Possibility to load config from Redis/etcd or another remote resource. (\*\*)
* May drop privileges to user/group once started.
+* Forward secrecy support when running on Node >= 0.11.14
Ongoing development on:
* Easier and easier configuration format.
* Automatic management of time expiration of certificates.
-* Request/response filters. (including ability to add headers, modify data)
+* Request/response filters. (including to modify data)
-(\*) Zero downtime is possible, currently downtime may be few milliseconds.
-(\*\*) Needs writing a custom config loader.
+(\*\*) Needs writing a custom config loader as a javascript file.
-
-## Installation and usage
+
+## Installation and basic usage
Refer to section [Usage as a module](#module) if you are interested in that use-case.
To install, Node.JS is required to be installed and in your PATH:
@@ -65,36 +78,29 @@ To install, Node.JS is required to be installed and in your PATH:
To run: `http-master --config http-master.conf`
-Config files may be written in either JSON or YAML. For the sake of documentation all examples will be written in YAML.
+Config files may be written in either JSON or YAML. For the sake of documentation (YAML allows comments) all examples will be written in YAML (but with JSON style).
Simple example config (more advanced features are convered elsewhere):
```YAML
watchConfig: true # watch config file for changes
-logging: false # See "Logging" section on details
ports: { # each port gets a separate configuration
80: {
- proxy: {
+ router: {
+ # redirect .net requests to .com
+ 'code2flow.net': 'redirect -> http://code2flow.com/[path]',
+ # redirect http to https
+ 'secure.code2flow.com': 'redirect -> https://code2flow.com/[path]'
# Proxy all traffic at domain code2flow.com to port 8099
'code2flow.com' : 8099,
# Proxy all traffic for any subdomains of services.com to IP 192.168.10.6 and port 8099
'*.services.com' : '192.168.10.6:8099',
# Proxy remaning traffic to port 8080, for example Apache could run there
'*' : 8080
- },
- redirect: {
- # redirect .net requests to .com
- 'code2flow.net': 'http://code2flow.com/[path]',
- # redirect http to https
- 'secure.code2flow.com': 'https://code2flow.com/[path]'
- },
- static: {
- # Serve static files from specific directory
- 'assets.code2flow.com': '/var/www/code2flow/assets'
}
}
443: {
- proxy: {
+ router: {
'code2flow.com': '127.0.0.1:9991',
# choose application depending on path
'service.myapp.com/downloads/*': 10443,
@@ -103,20 +109,57 @@ ports: { # each port gets a separate configuration
# all remaining https traffic goes to port 4443, for example apache
"*": "127.0.0.1:4443"
},
- redirect: {
- # redirect .net requests to .com
- 'code2flow.net': 'https://code2flow.com/[path]'
- },
ssl: {
# needs to be provided for non-SNI browsers
primaryDomain: "code2flow.com",
# simply put certificates inside this dir, run with --debug=config to see what was read
certDir: "/etc/http-master/certificates"
}
+ },
+ middleware: ['log -> /path/to/access.log' ], # Totally optional access.log, other middleware such as gzip could be added here
+ modules: {
+ appLog: '/path/to/app.log'
+ },
+ silent: false # if using above appLog, you can silence standard output
+}
+```
+
+If for some reason automatic ssl setup is not working for you, you can debug the loaded certificates with the included `cert-scan` tool:
+```
+cert-scan /path/to/certificate-dir
+```
+and/or
+```
+http-master --config http-master.conf --show-rules
+```
+
+Alternatively you may setup ssl manually:
+```YAML
+# this part belongs to some port configuration
+ssl : {
+ key: "/path/to/crt/domain.key",
+ cert: "/path/to/crt/domain.crt", # or .pem
+ "ca": [ # may be one or many or a bundle (without array)
+ "/path/to/ca/file/sub.class1.server.ca.pem"
+ ],
+ "SNI": {
+ "*.codecharm.co.uk": {
+ "key": "/path/to/crt/codecharm.co.uk.key",
+ "crt": "/path/to/crt/codecharm.co.uk.crt",
+ "ca" : "/path/to/cabundle/ca.pem" # may be an array if not bundle
+ },
+ "someotherdomain.com": {
+ "key": "/path/to/crt/someotherdomain.com.key",
+ "crt": "/path/to/crt/someotherdomain.com.crt",
+ "ca": [
+ "/path/to/ca/file/someca.pem"
+ ]
+ }
}
}
```
+
## Usage as a module
@@ -177,71 +220,379 @@ If you run via systemd then you may use the following `systemctl reload http-mas
## Use custom config loader
-
+
See this repository for an example https://github.com/CodeCharmLtd/http-master-example-httploader
+If you have an old 0.7.0 config, you can also load it with a provided config loader by:
+
+`http-master --configloader /path/to/lib/node_modules/http-master/migrateV1Config.js --config oldconfig.json`
+
-## URL rewrite
-TODO (open an issue if you need info now)
+## Proxy
+Proxy is a default action what to do with a http request but in each place where a number or host are used, you could do a redirect as well.
+
+### Proxy all requests from port 80 to port 4080
+```YAML
+# Short-hand syntax
+ports: {
+ 80: 4080
+}
+```
+```YAML
+# A bit longer short-hand syntax (but could be used with ssl)
+ports: {
+ 443: {
+ router: 4080,
+ ssl: {} # this needs setting up
+ }
+}
+```
+```YAML
+# Normal syntax - baseline for extending
+ports: {
+ 80: {
+ router: {
+ "*": 4080
+ }
+ }
+}
+```
+
+### Proxy by domain name
+```YAML
+ports: {
+ 80: {
+ router: {
+ # two rules will match all domain1.com and www.domain1.com requsts
+ "domain1.com": 3333,
+ "www.domain1.com": 3334,
+ # will match all domain2.com requsts (but not www.domain2.com)
+ # and proxy it to a host with different ip in internal network
+ "domain2.com": "192.168.1.1:80",
+ # this will match every subdomain of domain4.com, but not domain4.com
+ "*.domain4.com" : "5050",
+ # this will match every subdomain of domain4.com, and domain4.com
+ "*?.domain4.com": "some_machine_by_host:4020"
+ }
+ }
+}
+```
+
+### Proxy by domain name and/or path
+```YAML
+ports: {
+ 80: {
+ router: {
+ # will match domain1.com/path1 or domain1/path/whatever or domain1/path/whatever/whatever
+ # Last * in path match matches everything and makes last slash optional
+ "domain1.com/path1/*" : 5010,
+ "domain1.com/path2/*" : 5011,
+ # and rest goes to 5012 - this needs to be defined as patch matching
+ # happens after domain matching
+ "domain1.com/*" : 5012
+ }
+ }
+}
+```
## URL rewrite
-TODO (open an issue if you need info now)
+All proxy example can be adapted to also do URL rewriting. All matching rules can do either wildcard (implicit) regexp matching explicit regexp matching. Let's focus on implicit first.
+
+```YAML
+ports: {
+ 80: {
+ router: {
+ # * will match all subdomains
+ # http://abc.domain.com will rewrite to -> /abc/
+ # http://abc.domain.com/test will rewrite to -> /abc/test
+ # http://xyz.abc.domain.com/test will rewrite to -> /xyz.abc/test
+ "*.domain.com": "5050/[1]/[path]"
+ }
+ }
+}
+```
+So what if you want to rewrite two levels of subdomains?
+```YAML
+ports: {
+ 80: {
+ router: {
+ "*.*.domain.com" : "5050/[1]/[2]/[path]"
+ }
+ }
+}
+```
+
+You can also match paths and rewrite:
+```YAML
+ports: {
+ 80: {
+ router: {
+ "*.code2flow.com/test/*": "[1].somewhere.net/something/[2]"
+ }
+ }
+}
+```
+Everything above and more you can also do with regexp matching which is described in [Regexp matching](#regexpmatching) section.
## Redirect
-TODO (open an issue if you need info now)
+Redirect is a feature implemented and invoked in a similiar way to proxy.
+The different is that instead of proxy target, you should point rules to `"redirect -> http://target"`. The way target is constructed often is desired to be dynamic, for example that's how https to http redirect is usually used.
+
+```YAML
+ports: {
+ 80: {
+ router: {
+ # rewrite all http://atlashost.eu/* requests to https://atlashost/eu/*
+ # [path] is a special macro that will be replaced with the request's pathname
+ "atlashost.eu": "https://atlashost.eu/[path]",
+ # for example proxy rest to apache's port
+ '*' : 80443
+ }
+ },
+ 443: {
+ router: {
+ # proxy to actual application
+ "atlashost.eu": 3333,
+ # proxy rest to apache
+ "*": 8080
+ },
+ ssl: {} # ssl should be configured here
+ }
+}
+```
## SSL
-TODO (open an issue if you need info now)
+SSL can be configured for any port by simply providing "ssl" key to its entry, for example below is an auto-configuration example that also handles SNI:
+```YAML
+ports: {
+ 443: {
+ router: {}, # your rules here
+ ssl: {
+ # Even SNI configuration requires at least one certificate that
+ # will be served to non-SNI browsers
+ primaryDomain: "yourdomain.com",
+ certDir: "/etc/http-master/certificates"
+ }
+ }
+}
+```
+
+If for some reason auto-configuration does not work for you, it may be configured manually:
+```YAML
+ports: {
+ 443: {
+ router: {}, # your rules here
+ ssl: {
+ key: "/path/to/key/domain.key",
+ cert: "/path/to/key/domain.crt",
+ ca: "/path/to/ca/bundle/ca.pem",
+ # alternatively above could be written as
+ # ca: ["/path/to/ca1.crt", "/path/to/ca2.crt"]
+ SNI: {
+ "*.codecharm.co.uk" : {
+ key: "/path/to/key/codecharm.key",
+ cert: "/path/to/key/codecharm.crt",
+ ca: "/path/to/ca/bundle.pem"
+ },
+ "singledomain.net" : {
+ key: "/path/to/key/singledomain.key",
+ cert: "/path/to/key/singledomain.crt",
+ ca: "/path/to/ca/bundle.pem"
+ }
+ }
+ }
+ }
+}
+```
+
+
+## Websockify
+Websockify is a feature which can turn any TCP socket to a web socket.
+
+```YAML
+ports: {
+ 443: {
+ router: {
+ "myserver.net/services/ssh" : "websockify -> 22"
+ },
+ ssl: {} # ssl should be configured here
+ }
+}
+```
+The above makes it possible to access ssh server over https, for example from the browser. Simply connect to `wss://myserver.net/services/ssh`, it will initiate connection to ssh and proxy raw tcp data. Note: for it to be usable requires someone to implement openssh in asm.js.
+
+To do something in reverse, for example access the above websocket via original ssh client on other machine, one could do the following:
+```
+npm install -g dewebsockify
+dewebsockify wss://myserver.net/services/ssh 2222
+ssh localhost -p 2222 # this will connect to the remote server over HTTPS!!
+```
+
+Another interesting use is running websockify to turn other services such as VNC to be usable by the browser. That's what [noVNC project]{http://kanaka.github.io/noVNC/} is already doing. In fact, http-master works out of the box with noVNC.
+
+Interesting type of use would be to turn this into a general gateway to any TCP services (auth can be added for some security):
+
+```YAML
+ports: {
+ 443: {
+ router: {
+ # call to wss://myserver.net/tcpgate/otherserver.com/22 would connect
+ # to remote server's SSH
+ "myserver.net/tcpgate/*/*" : "websockify -> [1]:[2]"
+ },
+ ssl: {} # ssl should be configured here
+ }
+}
+```
## Logging
-Sample logging entry:
+To enable application log:
+```YAML
+ports: {}, # your port config here
+modules: {
+ appLog: "/path/to/app.log"
+}
```
-{"timestamp":1379159076291,"method":"GET","httpVersion":"1.0","headers":{"host":"test.pl:8081","user-agent":"ApacheBench/2.3","accept":"*/*","x-forwarded-for":"127.0.0.1","x-forwarded-port":33439,"x-forwarded-proto":"http"},"url":"/de629fb8-ff7f-4920-ab29-6a0f2f4176bf","statusCode":200,"responseTime":23}
+
+To enable general access log:
+```YAML
+middleware: ["log -> /path/to/access.log"],
+ports: {} # your port config here
```
-Contains:
-* timestamp - time when request started
-* method - HTTP method
-* httpVersion - protocol version
-* url - URL from the request
-* headers - all HTTP headers
-* statusCode - code that application sent
-* responseTime - time taken to finish the response
-Log to stdout:
+To enable logging per route (note, consult [Advanced routing](#advancedrouting) for more details)
```YAML
-logging: true,
ports: {
- # port configuration goes here
+ 80: {
+ router: {
+ "myapp.net": ["log -> /path/to/myapp.log", 3333]
+ }
+ }
}
+```
+Rule of thumb is, wherever you had some target be it proxy or redirect, you can turn it to an array and place logging rule as first element.
+
+Logging is in apache format.
+Note: you may log to the same file from multiple routes, not a problem.
+
+
+## HTTP authentication
+```YAML
+ports: {
+ 80: {
+ router: {
+ "myapp.net": ["auth -> file.passwd", 3333]
+ }
+ }
+}
+```
+Basically you need to generate a passwd file and point http-master to it.
+You can generate one with [node version of htpasswd]{https://www.npmjs.org/package/htpasswd}.
+
+
+## Add header
+You can add one or more arbitrary requests to incoming headers/
+```YAML
+ports: {
+ 80: {
+ router: {
+ "myapp.net": ["addHeader -> X-Some-Header1=Value1", "addHeader -> X-Some-Header2=Value2", 3333]
+ }
+ }
+}
+```
+
+
+## Compression / GZIP
+
+The single passed argument is compression level, from 1 to 9. 9 is most compression but slowest. To enable compression for all requests:
+
+```YAML
+middleware: ["gzip -> 9"],
+ports: {
+ router: {} #your rules here
+}
```
-Log all requests to file:
+To enable compression for a single route:
```YAML
-logging: {
- accessLog": "/var/log/http-master-access.log"
-},
ports: {
- # port configuration goes here
+ router: {
+ "domain.com" : ["gzip -> 9", 3333]
+ }
}
```
-Log to file and move existing standard output to separate file:
+
+## Regexp matching
+
+Short-hand matching format with using `*` or `*?` can be replaced by using explicit regexp expression, such as this:
+
```YAML
-logging: {
- accessLog": "/var/log/http-master-access.log"
- appLog": "/var/log/http-master.log"
-},
ports: {
- # port configuration goes here
+ 80: {
+ # [1] will contain app1 or app2, each number will reference regexp catch groups
+ "^(app1|app2)\\.go\\.there\\.com": "5050/[1]"
+ }
}
```
+Only problem is the necessity to escape characters for string inclusion.
+Named groups are also supported. Please open an issue to request more docs.
-If you wish to have a specific formatting of access log, please open an issue with your request.
+
+## Error handling
+
+HTTP master will report some errors in plain text, you can override this behaviour by providing a custom html error page:
+```YAML
+ports: {}, # your port config here
+errorHtmlFile: "/path/to/error.html"
+```
+The html file may reference simple images which will be embedded to the response in form of base64. It cannot reference other files. Error html needs to be fast.
+
+You can in fact trigger errors manually as well, for scheduled downtime for example:
+```YAML
+ports: {
+ 80: {
+ # this will report error 503
+ "domain.com" : "reject -> 503"
+ }
+}
+```
+
+
+## Serve static directory
+You may also serve a static files , example:
+```YAML
+ports: {
+ 80: {
+ "domain.com/*" : "static -> /home/domain/[1]"
+ }
+}
+```
+Please open an issue to request more docs.
+
+
+## Advanced routing
+
+Advanced routing refers to ability of nesting multiple layers of rules, such as:
+
+```YAML
+ports: {
+ 80 : {
+ "*.domain.com" : ["log -> domain.log", {
+ "*/path1" : 3333,
+ "*/path2" : 3334,
+ "*/*": 3335
+ }]
+ }
+}
+```
+Please open an issue to request more docs.
## Systemd
@@ -266,6 +617,12 @@ We provide an example systemd unit file. The config file is set to /etc/http-mas
Please open an issue if you would like a specific feature to be implemented and sponsored.
+Example sponsored features could include:
+* Automatically lazy-starting FastCGI apps such as PHP without overhead of running separate Apache and with better security handling.
+* Home directory support
+* Some form of .htaccess support
+* Additional logging formats
+
## License
Copyright (c) 2013-2014 [Code Charm Ltd](http://codecharm.co.uk)
diff --git a/app.log b/app.log
new file mode 100644
index 0000000..8bf0ff3
--- /dev/null
+++ b/app.log
@@ -0,0 +1,5205 @@
+[2014-10-07T09:00:54.710Z] [2] Listening on port: port 4080
+[2014-10-07T09:00:54.711Z] [2] Listening on port: port 40443
+[2014-10-07T09:00:54.711Z] [2] Start successful
+[2014-10-07T09:00:54.715Z] [1] Listening on port: port 4080
+[2014-10-07T09:00:54.716Z] [4] Listening on port: port 4080
+[2014-10-07T09:00:54.717Z] [3] Listening on port: port 4080
+[2014-10-07T09:00:54.717Z] [1] Listening on port: port 40443
+[2014-10-07T09:00:54.717Z] [1] Start successful
+[2014-10-07T09:00:54.719Z] [3] Listening on port: port 40443
+[2014-10-07T09:00:54.719Z] [4] Listening on port: port 40443
+[2014-10-07T09:00:54.719Z] [4] Start successful
+[2014-10-07T09:00:54.719Z] [3] Start successful
+[2014-10-07T09:00:54.725Z] [5] Listening on port: port 4080
+[2014-10-07T09:00:54.725Z] [7] Listening on port: port 4080
+[2014-10-07T09:00:54.727Z] [5] Listening on port: port 40443
+[2014-10-07T09:00:54.727Z] [5] Start successful
+[2014-10-07T09:00:54.728Z] [7] Listening on port: port 40443
+[2014-10-07T09:00:54.728Z] [7] Start successful
+[2014-10-07T09:00:54.732Z] [6] Listening on port: port 4080
+[2014-10-07T09:00:54.734Z] [6] Listening on port: port 40443
+[2014-10-07T09:00:54.734Z] [6] Start successful
+[2014-10-07T09:00:54.751Z] [8] Listening on port: port 4080
+[2014-10-07T09:00:54.752Z] [8] Listening on port: port 40443
+[2014-10-07T09:00:54.752Z] [8] Start successful
+[2014-10-07T09:00:54.752Z] All workers started in 245ms
+[2014-10-07T09:03:20.235Z] [1] Listening on port: port 4080
+[2014-10-07T09:03:20.237Z] [1] Listening on port: port 40443
+[2014-10-07T09:03:20.237Z] [1] Start successful
+[2014-10-07T09:03:20.241Z] [3] Listening on port: port 4080
+[2014-10-07T09:03:20.243Z] [3] Listening on port: port 40443
+[2014-10-07T09:03:20.243Z] [3] Start successful
+[2014-10-07T09:03:20.246Z] [6] Listening on port: port 4080
+[2014-10-07T09:03:20.247Z] [2] Listening on port: port 4080
+[2014-10-07T09:03:20.248Z] [6] Listening on port: port 40443
+[2014-10-07T09:03:20.248Z] [6] Start successful
+[2014-10-07T09:03:20.249Z] [2] Listening on port: port 40443
+[2014-10-07T09:03:20.249Z] [2] Start successful
+[2014-10-07T09:03:20.249Z] [4] Listening on port: port 4080
+[2014-10-07T09:03:20.251Z] [4] Listening on port: port 40443
+[2014-10-07T09:03:20.252Z] [4] Start successful
+[2014-10-07T09:03:20.255Z] [8] Listening on port: port 4080
+[2014-10-07T09:03:20.255Z] [5] Listening on port: port 4080
+[2014-10-07T09:03:20.256Z] [7] Listening on port: port 4080
+[2014-10-07T09:03:20.256Z] [8] Listening on port: port 40443
+[2014-10-07T09:03:20.257Z] [8] Start successful
+[2014-10-07T09:03:20.257Z] [5] Listening on port: port 40443
+[2014-10-07T09:03:20.258Z] [5] Start successful
+[2014-10-07T09:03:20.258Z] [7] Listening on port: port 40443
+[2014-10-07T09:03:20.258Z] [7] Start successful
+[2014-10-07T09:03:20.258Z] All workers started in 225ms
+[2014-10-07T09:21:45.317Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:45.319Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:45.319Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:45.319Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:45.320Z] [1] Start successful
+[2014-10-07T09:21:45.321Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:45.321Z] [3] Start successful
+[2014-10-07T09:21:45.321Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:45.322Z] [2] Start successful
+[2014-10-07T09:21:45.323Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:45.324Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:45.325Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:45.325Z] [5] Start successful
+[2014-10-07T09:21:45.326Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:45.326Z] [4] Start successful
+[2014-10-07T09:21:45.329Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:45.331Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:45.331Z] [8] Start successful
+[2014-10-07T09:21:45.335Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:45.336Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:45.336Z] [6] Start successful
+[2014-10-07T09:21:45.340Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:45.341Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:45.341Z] [7] Start successful
+[2014-10-07T09:21:45.342Z] All workers started in 233ms
+[2014-10-07T09:21:47.135Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:47.137Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:47.137Z] [3] Start successful
+[2014-10-07T09:21:47.143Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:47.145Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:47.145Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:47.146Z] [5] Start successful
+[2014-10-07T09:21:47.147Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:47.147Z] [1] Start successful
+[2014-10-07T09:21:47.153Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:47.155Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:47.156Z] [4] Start successful
+[2014-10-07T09:21:47.156Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:47.158Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:47.158Z] [6] Start successful
+[2014-10-07T09:21:47.162Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:47.164Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:47.164Z] [8] Start successful
+[2014-10-07T09:21:47.178Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:47.180Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:47.180Z] [7] Start successful
+[2014-10-07T09:21:47.192Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:47.193Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:47.193Z] [2] Start successful
+[2014-10-07T09:21:47.194Z] All workers started in 270ms
+[2014-10-07T09:21:48.245Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:48.247Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:48.247Z] [1] Start successful
+[2014-10-07T09:21:48.257Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:48.259Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:48.260Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:48.260Z] [6] Start successful
+[2014-10-07T09:21:48.261Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:48.262Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:48.262Z] [7] Start successful
+[2014-10-07T09:21:48.263Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:48.264Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:48.269Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:48.269Z] [2] Start successful
+[2014-10-07T09:21:48.269Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:48.270Z] [5] Start successful
+[2014-10-07T09:21:48.270Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:48.270Z] [3] Start successful
+[2014-10-07T09:21:48.271Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:48.273Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:48.273Z] [4] Start successful
+[2014-10-07T09:21:48.273Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:48.275Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:48.275Z] [8] Start successful
+[2014-10-07T09:21:48.275Z] All workers started in 230ms
+[2014-10-07T09:21:49.378Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:49.380Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:49.380Z] [3] Start successful
+[2014-10-07T09:21:49.384Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:49.386Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:49.387Z] [1] Start successful
+[2014-10-07T09:21:49.396Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:49.398Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:49.399Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:49.399Z] [6] Start successful
+[2014-10-07T09:21:49.399Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:49.400Z] [5] Start successful
+[2014-10-07T09:21:49.402Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:49.404Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:49.405Z] [2] Start successful
+[2014-10-07T09:21:49.411Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:49.413Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:49.413Z] [4] Start successful
+[2014-10-07T09:21:49.436Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:49.437Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:49.437Z] [8] Start successful
+[2014-10-07T09:21:49.466Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:49.468Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:49.468Z] [7] Start successful
+[2014-10-07T09:21:49.468Z] All workers started in 292ms
+[2014-10-07T09:21:50.422Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:50.423Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:50.424Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:50.424Z] [2] Start successful
+[2014-10-07T09:21:50.424Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:50.424Z] [1] Start successful
+[2014-10-07T09:21:50.433Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:50.434Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:50.434Z] [3] Start successful
+[2014-10-07T09:21:50.434Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:50.435Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:50.437Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:50.437Z] [5] Start successful
+[2014-10-07T09:21:50.437Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:50.437Z] [4] Start successful
+[2014-10-07T09:21:50.440Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:50.442Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:50.442Z] [7] Start successful
+[2014-10-07T09:21:50.444Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:50.447Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:50.447Z] [6] Start successful
+[2014-10-07T09:21:50.452Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:50.453Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:50.454Z] [8] Start successful
+[2014-10-07T09:21:50.454Z] All workers started in 236ms
+[2014-10-07T09:21:51.421Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:51.423Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:51.423Z] [2] Start successful
+[2014-10-07T09:21:51.423Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:51.425Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:51.425Z] [6] Start successful
+[2014-10-07T09:21:51.426Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:51.427Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:51.427Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:51.428Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:51.428Z] [5] Start successful
+[2014-10-07T09:21:51.429Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:51.429Z] [4] Start successful
+[2014-10-07T09:21:51.429Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:51.429Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:51.430Z] [1] Start successful
+[2014-10-07T09:21:51.431Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:51.431Z] [3] Start successful
+[2014-10-07T09:21:51.433Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:51.434Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:51.434Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:51.434Z] [8] Start successful
+[2014-10-07T09:21:51.436Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:51.436Z] [7] Start successful
+[2014-10-07T09:21:51.436Z] All workers started in 224ms
+[2014-10-07T09:21:52.400Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:52.401Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:52.402Z] [1] Start successful
+[2014-10-07T09:21:52.411Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:52.412Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:52.414Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:52.414Z] [3] Start successful
+[2014-10-07T09:21:52.414Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:52.415Z] [2] Start successful
+[2014-10-07T09:21:52.415Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:52.417Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:52.417Z] [7] Start successful
+[2014-10-07T09:21:52.420Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:52.430Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:52.430Z] [8] Start successful
+[2014-10-07T09:21:52.436Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:52.438Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:52.438Z] [4] Start successful
+[2014-10-07T09:21:52.450Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:52.452Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:52.452Z] [5] Start successful
+[2014-10-07T09:21:52.482Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:52.483Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:52.483Z] [6] Start successful
+[2014-10-07T09:21:52.483Z] All workers started in 284ms
+[2014-10-07T09:21:53.385Z] [7] Listening on port: port 4080
+[2014-10-07T09:21:53.387Z] [4] Listening on port: port 4080
+[2014-10-07T09:21:53.388Z] [7] Listening on port: port 40443
+[2014-10-07T09:21:53.388Z] [7] Start successful
+[2014-10-07T09:21:53.388Z] [4] Listening on port: port 40443
+[2014-10-07T09:21:53.388Z] [4] Start successful
+[2014-10-07T09:21:53.389Z] [2] Listening on port: port 4080
+[2014-10-07T09:21:53.391Z] [2] Listening on port: port 40443
+[2014-10-07T09:21:53.391Z] [2] Start successful
+[2014-10-07T09:21:53.394Z] [3] Listening on port: port 4080
+[2014-10-07T09:21:53.395Z] [3] Listening on port: port 40443
+[2014-10-07T09:21:53.395Z] [3] Start successful
+[2014-10-07T09:21:53.396Z] [5] Listening on port: port 4080
+[2014-10-07T09:21:53.399Z] [5] Listening on port: port 40443
+[2014-10-07T09:21:53.399Z] [5] Start successful
+[2014-10-07T09:21:53.402Z] [6] Listening on port: port 4080
+[2014-10-07T09:21:53.404Z] [6] Listening on port: port 40443
+[2014-10-07T09:21:53.404Z] [6] Start successful
+[2014-10-07T09:21:53.424Z] [1] Listening on port: port 4080
+[2014-10-07T09:21:53.426Z] [1] Listening on port: port 40443
+[2014-10-07T09:21:53.426Z] [1] Start successful
+[2014-10-07T09:21:53.442Z] [8] Listening on port: port 4080
+[2014-10-07T09:21:53.444Z] [8] Listening on port: port 40443
+[2014-10-07T09:21:53.444Z] [8] Start successful
+[2014-10-07T09:21:53.444Z] All workers started in 271ms
+[2014-10-07T09:23:00.174Z] [2] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.178Z] Worker 2 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.188Z] Worker 1 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.193Z] [1] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.193Z] Worker 3 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.204Z] [3] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.204Z] Worker 6 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.207Z] Worker 7 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.208Z] Worker 4 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.212Z] Worker 5 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.215Z] Worker 8 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.253Z] [6] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.253Z] [7] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.253Z] [4] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.253Z] [5] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.254Z] [8] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:00.325Z] Worker 10 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.327Z] Worker 12 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.338Z] Worker 15 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.350Z] Worker 11 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.356Z] Worker 14 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.362Z] Worker 9 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.374Z] Worker 13 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.391Z] Worker 16 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.460Z] Worker 18 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.486Z] Worker 19 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.497Z] Worker 21 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.499Z] Worker 17 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.501Z] Worker 20 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.526Z] Worker 22 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.529Z] Worker 24 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.558Z] Worker 23 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.591Z] Worker 25 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.624Z] Worker 26 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.631Z] Worker 27 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.656Z] Worker 29 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.666Z] Worker 30 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.686Z] Worker 31 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.702Z] Worker 28 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.736Z] Worker 33 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.743Z] Worker 32 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.779Z] Worker 34 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.783Z] Worker 35 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.793Z] Worker 36 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.828Z] Worker 37 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.839Z] Worker 38 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.851Z] Worker 39 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.871Z] Worker 40 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.899Z] Worker 41 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.918Z] Worker 42 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.920Z] Worker 43 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.928Z] Worker 44 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.958Z] Worker 45 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.983Z] Worker 46 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:00.991Z] Worker 47 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:01.002Z] Worker 48 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.094Z] [1] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.096Z] [2] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.097Z] Worker 2 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.101Z] Worker 1 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.102Z] Worker 3 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.107Z] Worker 4 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.112Z] Worker 5 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.113Z] Worker 7 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.129Z] [4] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.129Z] [3] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.130Z] [5] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.130Z] [7] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.133Z] [6] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.135Z] Worker 6 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.181Z] [8] [Uncaught exception] TypeError: undefined is not a function
+ at process. (/home/rush/Programowanie/http-master/worker.js:121:10)
+ at process.emit (events.js:107:17)
+ at process. (/home/rush/Programowanie/http-master/worker.js:88:11)
+ at process.emit (events.js:129:20)
+ at handleMessage (child_process.js:323:10)
+ at Pipe.channel.onread (child_process.js:351:11)
+[2014-10-07T09:23:35.182Z] Worker 8 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.240Z] Worker 11 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.243Z] Worker 10 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.245Z] Worker 12 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.263Z] Worker 13 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.272Z] Worker 15 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.280Z] Worker 9 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.329Z] Worker 14 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.349Z] Worker 16 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.352Z] Worker 17 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.381Z] Worker 20 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.385Z] Worker 18 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.399Z] Worker 19 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.406Z] Worker 21 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.431Z] Worker 22 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.477Z] Worker 25 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.482Z] Worker 23 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.491Z] Worker 24 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.505Z] Worker 26 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.542Z] Worker 28 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.545Z] Worker 27 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.550Z] Worker 29 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.573Z] Worker 30 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.620Z] Worker 32 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.622Z] Worker 31 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.642Z] Worker 34 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.668Z] Worker 33 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.681Z] Worker 35 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.686Z] Worker 36 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.697Z] Worker 38 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.701Z] Worker 37 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.750Z] Worker 40 failed with code 1/null ... starting replacement
+[2014-10-07T09:23:35.775Z] Worker 39 failed with code 1/null ... starting replacement
+[2014-10-07T09:24:13.685Z] [2] Listening on port: port 4080
+[2014-10-07T09:24:13.686Z] [2] Listening on port: port 40443
+[2014-10-07T09:24:13.687Z] [2] Start successful
+[2014-10-07T09:24:13.709Z] [7] Listening on port: port 4080
+[2014-10-07T09:24:13.711Z] [7] Listening on port: port 40443
+[2014-10-07T09:24:13.711Z] [7] Start successful
+[2014-10-07T09:24:13.716Z] [6] Listening on port: port 4080
+[2014-10-07T09:24:13.719Z] [6] Listening on port: port 40443
+[2014-10-07T09:24:13.719Z] [6] Start successful
+[2014-10-07T09:24:13.720Z] [5] Listening on port: port 4080
+[2014-10-07T09:24:13.721Z] [4] Listening on port: port 4080
+[2014-10-07T09:24:13.722Z] [5] Listening on port: port 40443
+[2014-10-07T09:24:13.722Z] [5] Start successful
+[2014-10-07T09:24:13.723Z] [4] Listening on port: port 40443
+[2014-10-07T09:24:13.723Z] [4] Start successful
+[2014-10-07T09:24:13.736Z] [1] Listening on port: port 4080
+[2014-10-07T09:24:13.739Z] [1] Listening on port: port 40443
+[2014-10-07T09:24:13.739Z] [1] Start successful
+[2014-10-07T09:24:13.739Z] [3] Listening on port: port 4080
+[2014-10-07T09:24:13.740Z] [3] Listening on port: port 40443
+[2014-10-07T09:24:13.740Z] [3] Start successful
+[2014-10-07T09:24:13.761Z] [8] Listening on port: port 4080
+[2014-10-07T09:24:13.761Z] [8] Listening on port: port 40443
+[2014-10-07T09:24:13.761Z] [8] Start successful
+[2014-10-07T09:24:13.762Z] All workers started in 260ms
+[2014-10-07T09:24:16.292Z] [1] Listening on port: port 4080
+[2014-10-07T09:24:16.294Z] [1] Listening on port: port 40443
+[2014-10-07T09:24:16.294Z] [1] Start successful
+[2014-10-07T09:24:16.300Z] [2] Listening on port: port 4080
+[2014-10-07T09:24:16.301Z] [6] Listening on port: port 4080
+[2014-10-07T09:24:16.302Z] [2] Listening on port: port 40443
+[2014-10-07T09:24:16.302Z] [2] Start successful
+[2014-10-07T09:24:16.304Z] [6] Listening on port: port 40443
+[2014-10-07T09:24:16.305Z] [6] Start successful
+[2014-10-07T09:24:16.306Z] [7] Listening on port: port 4080
+[2014-10-07T09:24:16.306Z] [4] Listening on port: port 4080
+[2014-10-07T09:24:16.308Z] [4] Listening on port: port 40443
+[2014-10-07T09:24:16.308Z] [4] Start successful
+[2014-10-07T09:24:16.308Z] [7] Listening on port: port 40443
+[2014-10-07T09:24:16.308Z] [7] Start successful
+[2014-10-07T09:24:16.313Z] [5] Listening on port: port 4080
+[2014-10-07T09:24:16.315Z] [5] Listening on port: port 40443
+[2014-10-07T09:24:16.315Z] [5] Start successful
+[2014-10-07T09:24:16.319Z] [8] Listening on port: port 4080
+[2014-10-07T09:24:16.320Z] [8] Listening on port: port 40443
+[2014-10-07T09:24:16.320Z] [8] Start successful
+[2014-10-07T09:24:16.329Z] [3] Listening on port: port 4080
+[2014-10-07T09:24:16.330Z] [3] Listening on port: port 40443
+[2014-10-07T09:24:16.330Z] [3] Start successful
+[2014-10-07T09:24:16.330Z] All workers started in 241ms
+[2014-10-07T09:24:26.907Z] MISSED MSG [object Object]
+[2014-10-07T09:24:26.909Z] MISSED MSG [object Object]
+[2014-10-07T09:24:26.909Z] MISSED MSG [object Object]
+[2014-10-07T09:24:26.911Z] MISSED MSG [object Object]
+[2014-10-07T09:24:26.913Z] MISSED MSG [object Object]
+[2014-10-07T09:24:26.924Z] MISSED MSG [object Object]
+[2014-10-07T09:24:26.949Z] MISSED MSG [object Object]
+[2014-10-07T09:24:26.975Z] [2] Listening on port: port 4080
+[2014-10-07T09:24:26.977Z] [2] Listening on port: port 40443
+[2014-10-07T09:24:26.978Z] [2] Start successful
+[2014-10-07T09:24:26.978Z] [6] Listening on port: port 4080
+[2014-10-07T09:24:26.980Z] [6] Listening on port: port 40443
+[2014-10-07T09:24:26.981Z] [6] Start successful
+[2014-10-07T09:24:26.985Z] [5] Listening on port: port 4080
+[2014-10-07T09:24:26.987Z] [5] Listening on port: port 40443
+[2014-10-07T09:24:26.987Z] [5] Start successful
+[2014-10-07T09:24:26.988Z] [4] Listening on port: port 4080
+[2014-10-07T09:24:26.991Z] [4] Listening on port: port 40443
+[2014-10-07T09:24:26.991Z] [4] Start successful
+[2014-10-07T09:24:26.991Z] [1] Listening on port: port 4080
+[2014-10-07T09:24:26.992Z] [1] Listening on port: port 40443
+[2014-10-07T09:24:26.992Z] [1] Start successful
+[2014-10-07T09:24:27.002Z] [3] Listening on port: port 4080
+[2014-10-07T09:24:27.004Z] [3] Listening on port: port 40443
+[2014-10-07T09:24:27.004Z] [3] Start successful
+[2014-10-07T09:24:27.015Z] MISSED MSG [object Object]
+[2014-10-07T09:24:27.022Z] [8] Listening on port: port 4080
+[2014-10-07T09:24:27.023Z] [8] Listening on port: port 40443
+[2014-10-07T09:24:27.023Z] [8] Start successful
+[2014-10-07T09:24:27.054Z] [7] Listening on port: port 4080
+[2014-10-07T09:24:27.055Z] [7] Listening on port: port 40443
+[2014-10-07T09:24:27.055Z] [7] Start successful
+[2014-10-07T09:24:27.056Z] All workers started in 294ms
+[2014-10-07T09:24:38.420Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.428Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.433Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.434Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.444Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.449Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.449Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.471Z] MISSED MSG {"type":"start","data":{"config":{"ports":{"4080":["log -> combined",{"redirect":{"*.code2flow.com/^(?[a-f]{6})":"http://code2flow.com/[code]"},"errorHtmlPage":"/home/rush/Programowanie/rush-http-proxy/test.html","router":{"local.code2flow.com":80,"local.code2flow.com/test/*":"localhost:80/[rest]","local.code2flow.com/test2/*":"localhost:81/[rest]","imagoartdesign.pl":"127.0.0.1:3000","www.imagoartdesign.pl":"127.0.0.1:3000","traceroute6.rushbase.net":"127.0.0.1:3001","rtsolutions.pl":"127.0.0.1:3002","www.rtsolutions.pl":"127.0.0.1:3002","webflow.rushbase.net":"127.0.0.1:3010","resizer.rushbase.net":"127.0.0.1:3009","test.rtsolutions.pl":"127.0.0.1:6060","termi.rushbase.net":"127.0.0.1:7080","test2.code2flow.*":"127.0.0.1:8099","confluence.code2flow.*":"127.0.0.1:10000","test.code2flow.*":"127.0.0.1:8091","www.code2flow.*":"127.0.0.1:8091","code2flow.*":"127.0.0.1:8091","test.qrfaktura.*":"127.0.0.1:8092","test.znajdzdoktora.pl":"127.0.0.1:12000","api.znajdzdoktora.pl":"127.0.0.1:12001","agn.rushbase.net":"127.0.0.1:8095","rss.rushbase.net":"127.0.0.1:8096","*":"4000/test/[path]"},"static":{},"gzip":true}],"40443":{"router":["log -> test.log",{"local.code2flow.com/ddd":"websockify -> 22","local.code2flow.com":80}],"ssl":{"key":"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQChmEZ7tgXWNkfH5aijyyAljv+zaEVRh+CmQWNbgRf1WF8gNlU+\nTu+OtZreqAN+9gSLRsjcXWzBL0AUXC4l07niheQ/imLt9G1npugPwMcWL56lOLT/\nrobFzbhjUE6fItLwQzP51Me0Bnj9SnWugvd+jwjbe8GxjyjzcgAjTG56bQIDAQAB\nAoGAd19C6g5731N30T5hRqY+GCC72a90TZc/p/Fz0Vva8/4VP3mDnSS4qMaVIlgh\nRP++OZjPtqI5PbiG8MNrv7vZe0UXlV7oZE0IA+jomUXsplbwMFf6pkrqdyHi+cbm\nrBudhmKeLUgNA6peMGVA83C5g2SMqU5kB+tWzZT7Rs9rsyECQQDWpXxZgULqbFZv\nwjpIDGWjOpQZrv123bJ9TQ+VoskCu4vlyDJqDJPwnscl8NnzpFJriDARn0WrB2sd\n8GCX1yEpAkEAwLo/MYG5elkNRsE5/vINSIo04Gu6tP/Sd7EBtHYAPHUPjs/MhhVX\ntMIGtACheHMwjGRPyr8pboEp2LEap4GjpQJBALNsy+CJ0+TfwPVU96EIc+GZcvlx\nNMErGyvwwclEtSDKo2vmCHZrozLtlu1ZQueOgbMPuZbRe8w2vEzfhe8HTtkCQAYy\nNrPlwsvPLyEWN0IeEBVD9D0+2WrWSrL0auSdYpaPAOgLgDzTVNWH42VIG+jeczIg\nS3xuNuvJlUnVL9Ew1s0CQQCly+gduXtvOYip1/Stm/65kT7d8ICQgjh0XSPw/kUC\nllVMQY3z1iFCaj/z0Csr0t0kJ534bH7GP3LOoNruV0p9\n-----END RSA PRIVATE KEY-----\n","cert":"-----BEGIN CERTIFICATE-----\nMIICcTCCAdoCCQDTgzSLdDTF0TANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV\nUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO\nBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR\ncnlAdGlueWNsb3Vkcy5vcmcwHhcNMTMwODAxMTExOTAwWhcNNDAxMjE2MTExOTAw\nWjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD\nVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg\nMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwgZ8wDQYJKoZIhvcNAQEB\nBQADgY0AMIGJAoGBAKGYRnu2BdY2R8flqKPLICWO/7NoRVGH4KZBY1uBF/VYXyA2\nVT5O7461mt6oA372BItGyNxdbMEvQBRcLiXTueKF5D+KYu30bWem6A/AxxYvnqU4\ntP+uhsXNuGNQTp8i0vBDM/nUx7QGeP1Kda6C936PCNt7wbGPKPNyACNMbnptAgMB\nAAEwDQYJKoZIhvcNAQEFBQADgYEATzjDAPocPA2Jm8wrLBW+fOC478wMo9gT3Y3N\nZU6fnF2dEPFLNETCMtDxnKhi4hnBpaiZ0fu0oaR1cSDRIVtlyW4azNjny4495C0F\nJLuP5P5pz+rJe+ImKw+mO1ARA9fUAL3VN6/kVXY/EspwWJcLbJ5jdsDmkRbV52hX\nTh4jkAI=\n-----END CERTIFICATE-----\n"}}},"modules":{"appLog":"app.log"},"workerCount":8},"token":"0360a1694566493dcae83e934896b007e2a4ff9ad4a4c80e5a60187f4659b69d8042cca7c6a5f2083af6004c2d778c67"}}
+[2014-10-07T09:24:38.498Z] [3] Listening on port: port 4080
+[2014-10-07T09:24:38.499Z] [3] Listening on port: port 40443
+[2014-10-07T09:24:38.499Z] [3] Start successful
+[2014-10-07T09:24:38.500Z] [2] Listening on port: port 4080
+[2014-10-07T09:24:38.501Z] [2] Listening on port: port 40443
+[2014-10-07T09:24:38.501Z] [2] Start successful
+[2014-10-07T09:24:38.504Z] [1] Listening on port: port 4080
+[2014-10-07T09:24:38.505Z] [1] Listening on port: port 40443
+[2014-10-07T09:24:38.505Z] [1] Start successful
+[2014-10-07T09:24:38.510Z] [6] Listening on port: port 4080
+[2014-10-07T09:24:38.511Z] [6] Listening on port: port 40443
+[2014-10-07T09:24:38.511Z] [6] Start successful
+[2014-10-07T09:24:38.511Z] [7] Listening on port: port 4080
+[2014-10-07T09:24:38.512Z] [7] Listening on port: port 40443
+[2014-10-07T09:24:38.512Z] [7] Start successful
+[2014-10-07T09:24:38.515Z] [4] Listening on port: port 4080
+[2014-10-07T09:24:38.516Z] [4] Listening on port: port 40443
+[2014-10-07T09:24:38.516Z] [4] Start successful
+[2014-10-07T09:24:38.520Z] [5] Listening on port: port 4080
+[2014-10-07T09:24:38.522Z] [5] Listening on port: port 40443
+[2014-10-07T09:24:38.522Z] [5] Start successful
+[2014-10-07T09:24:38.525Z] [8] Listening on port: port 4080
+[2014-10-07T09:24:38.525Z] [8] Listening on port: port 40443
+[2014-10-07T09:24:38.525Z] [8] Start successful
+[2014-10-07T09:24:38.526Z] All workers started in 238ms
+[2014-10-07T09:25:14.941Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:14.943Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:14.943Z] [3] Start successful
+[2014-10-07T09:25:14.944Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:14.945Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:14.946Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:14.946Z] [1] Start successful
+[2014-10-07T09:25:14.950Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:14.950Z] [5] Start successful
+[2014-10-07T09:25:14.950Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:14.950Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:14.952Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:14.952Z] [6] Start successful
+[2014-10-07T09:25:14.953Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:14.953Z] [2] Start successful
+[2014-10-07T09:25:14.978Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:14.978Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:14.980Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:14.980Z] [4] Start successful
+[2014-10-07T09:25:14.980Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:14.980Z] [7] Start successful
+[2014-10-07T09:25:14.994Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:14.995Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:14.995Z] [8] Start successful
+[2014-10-07T09:25:14.996Z] All workers started in 261ms
+[2014-10-07T09:25:19.229Z] Reloading workers due to config change
+[2014-10-07T09:25:19.234Z] [3] Reloading config
+[2014-10-07T09:25:19.234Z] [1] Reloading config
+[2014-10-07T09:25:19.234Z] [2] Reloading config
+[2014-10-07T09:25:19.234Z] [5] Reloading config
+[2014-10-07T09:25:19.234Z] [6] Reloading config
+[2014-10-07T09:25:19.234Z] [7] Reloading config
+[2014-10-07T09:25:19.234Z] [4] Reloading config
+[2014-10-07T09:25:19.235Z] [8] Reloading config
+[2014-10-07T09:25:19.237Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:19.238Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:19.241Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:19.241Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:19.241Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:19.241Z] [5] Start successful
+[2014-10-07T09:25:19.241Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:19.241Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:19.241Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:19.242Z] [4] Start successful
+[2014-10-07T09:25:19.242Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:19.242Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:19.242Z] [2] Start successful
+[2014-10-07T09:25:19.242Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:19.242Z] [6] Start successful
+[2014-10-07T09:25:19.243Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:19.243Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:19.243Z] [3] Start successful
+[2014-10-07T09:25:19.243Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:19.243Z] [1] Start successful
+[2014-10-07T09:25:19.243Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:19.243Z] [8] Start successful
+[2014-10-07T09:25:19.243Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:19.244Z] [7] Start successful
+[2014-10-07T09:25:19.244Z] All workers reloaded, downtime was 13ms
+[2014-10-07T09:25:21.488Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:21.491Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:21.491Z] [1] Start successful
+[2014-10-07T09:25:21.493Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:21.494Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:21.495Z] [2] Start successful
+[2014-10-07T09:25:21.496Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:21.497Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:21.497Z] [3] Start successful
+[2014-10-07T09:25:21.501Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:21.503Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:21.504Z] [7] Start successful
+[2014-10-07T09:25:21.505Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:21.506Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:21.514Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:21.515Z] [4] Start successful
+[2014-10-07T09:25:21.516Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:21.516Z] [5] Start successful
+[2014-10-07T09:25:21.519Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:21.521Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:21.521Z] [8] Start successful
+[2014-10-07T09:25:21.523Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:21.524Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:21.525Z] [6] Start successful
+[2014-10-07T09:25:21.525Z] All workers started in 236ms
+[2014-10-07T09:25:22.973Z] Reloading workers due to config change
+[2014-10-07T09:25:22.978Z] [2] Reloading config
+[2014-10-07T09:25:22.979Z] [1] Reloading config
+[2014-10-07T09:25:22.979Z] [3] Reloading config
+[2014-10-07T09:25:22.980Z] [4] Reloading config
+[2014-10-07T09:25:22.980Z] [7] Reloading config
+[2014-10-07T09:25:22.981Z] [5] Reloading config
+[2014-10-07T09:25:22.983Z] [8] Reloading config
+[2014-10-07T09:25:22.984Z] [6] Reloading config
+[2014-10-07T09:25:22.984Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:22.984Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:22.985Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:22.985Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:22.985Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:22.987Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:22.987Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:22.987Z] [2] Start successful
+[2014-10-07T09:25:22.987Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:22.987Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:22.988Z] [1] Start successful
+[2014-10-07T09:25:22.988Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:22.988Z] [3] Start successful
+[2014-10-07T09:25:22.988Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:22.988Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:22.988Z] [7] Start successful
+[2014-10-07T09:25:22.989Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:22.989Z] [4] Start successful
+[2014-10-07T09:25:22.989Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:22.990Z] [8] Start successful
+[2014-10-07T09:25:22.990Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:22.990Z] [6] Start successful
+[2014-10-07T09:25:22.991Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:22.991Z] [5] Start successful
+[2014-10-07T09:25:22.991Z] All workers reloaded, downtime was 17ms
+[2014-10-07T09:25:24.854Z] Reloading workers due to config change
+[2014-10-07T09:25:24.859Z] [1] Reloading config
+[2014-10-07T09:25:24.860Z] [2] Reloading config
+[2014-10-07T09:25:24.860Z] [3] Reloading config
+[2014-10-07T09:25:24.861Z] [5] Reloading config
+[2014-10-07T09:25:24.861Z] [8] Reloading config
+[2014-10-07T09:25:24.862Z] [4] Reloading config
+[2014-10-07T09:25:24.863Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:24.863Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:24.864Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:24.864Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:24.864Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:24.865Z] [7] Reloading config
+[2014-10-07T09:25:24.865Z] [6] Reloading config
+[2014-10-07T09:25:24.865Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:24.865Z] [1] Start successful
+[2014-10-07T09:25:24.865Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:24.865Z] [2] Start successful
+[2014-10-07T09:25:24.866Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:24.866Z] [3] Start successful
+[2014-10-07T09:25:24.866Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:24.866Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:24.866Z] [5] Start successful
+[2014-10-07T09:25:24.866Z] [8] Start successful
+[2014-10-07T09:25:24.866Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:24.866Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:24.866Z] [4] Start successful
+[2014-10-07T09:25:24.866Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:24.867Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:24.868Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:24.868Z] [7] Start successful
+[2014-10-07T09:25:24.868Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:24.868Z] [6] Start successful
+[2014-10-07T09:25:24.869Z] All workers reloaded, downtime was 13ms
+[2014-10-07T09:25:26.899Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:26.901Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:26.901Z] [2] Start successful
+[2014-10-07T09:25:26.904Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:26.906Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:26.906Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:26.907Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:26.907Z] [7] Start successful
+[2014-10-07T09:25:26.909Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:26.909Z] [4] Start successful
+[2014-10-07T09:25:26.910Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:26.910Z] [8] Start successful
+[2014-10-07T09:25:26.910Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:26.913Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:26.913Z] [5] Start successful
+[2014-10-07T09:25:26.917Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:26.918Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:26.918Z] [3] Start successful
+[2014-10-07T09:25:26.927Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:26.928Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:26.929Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:26.929Z] [1] Start successful
+[2014-10-07T09:25:26.929Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:26.929Z] [6] Start successful
+[2014-10-07T09:25:26.930Z] All workers started in 241ms
+[2014-10-07T09:25:27.964Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:27.966Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:27.966Z] [4] Start successful
+[2014-10-07T09:25:27.981Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:27.982Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:27.982Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:27.984Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:27.984Z] [5] Start successful
+[2014-10-07T09:25:27.984Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:27.984Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:27.984Z] [2] Start successful
+[2014-10-07T09:25:27.984Z] [3] Start successful
+[2014-10-07T09:25:27.996Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:27.997Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:27.998Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:27.999Z] [1] Start successful
+[2014-10-07T09:25:27.999Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:27.999Z] [8] Start successful
+[2014-10-07T09:25:28.000Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:28.001Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:28.001Z] [6] Start successful
+[2014-10-07T09:25:28.018Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:28.020Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:28.020Z] [7] Start successful
+[2014-10-07T09:25:28.020Z] All workers started in 243ms
+[2014-10-07T09:25:28.952Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:28.954Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:28.954Z] [1] Start successful
+[2014-10-07T09:25:28.972Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:28.975Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:28.975Z] [2] Start successful
+[2014-10-07T09:25:28.983Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:28.985Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:28.985Z] [6] Start successful
+[2014-10-07T09:25:29.018Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:29.020Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:29.020Z] [5] Start successful
+[2014-10-07T09:25:29.031Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:29.034Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:29.034Z] [4] Start successful
+[2014-10-07T09:25:29.038Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:29.041Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:29.041Z] [8] Start successful
+[2014-10-07T09:25:29.049Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:29.052Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:29.052Z] [3] Start successful
+[2014-10-07T09:25:29.058Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:29.059Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:29.060Z] [7] Start successful
+[2014-10-07T09:25:29.060Z] All workers started in 293ms
+[2014-10-07T09:25:30.021Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:30.027Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:30.027Z] [1] Start successful
+[2014-10-07T09:25:30.041Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:30.043Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:30.043Z] [3] Start successful
+[2014-10-07T09:25:30.051Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:30.053Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:30.054Z] [4] Start successful
+[2014-10-07T09:25:30.061Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:30.064Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:30.064Z] [7] Start successful
+[2014-10-07T09:25:30.071Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:30.073Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:30.073Z] [2] Start successful
+[2014-10-07T09:25:30.091Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:30.093Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:30.093Z] [5] Start successful
+[2014-10-07T09:25:30.129Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:30.130Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:30.130Z] [6] Start successful
+[2014-10-07T09:25:30.134Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:30.135Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:30.135Z] [8] Start successful
+[2014-10-07T09:25:30.135Z] All workers started in 302ms
+[2014-10-07T09:25:31.044Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:31.048Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:31.048Z] [3] Start successful
+[2014-10-07T09:25:31.077Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:31.079Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:31.080Z] [1] Start successful
+[2014-10-07T09:25:31.086Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:31.088Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:31.088Z] [6] Start successful
+[2014-10-07T09:25:31.090Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:31.091Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:31.091Z] [2] Start successful
+[2014-10-07T09:25:31.093Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:31.094Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:31.094Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:31.095Z] [7] Start successful
+[2014-10-07T09:25:31.097Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:31.097Z] [4] Start successful
+[2014-10-07T09:25:31.114Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:31.115Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:31.115Z] [5] Start successful
+[2014-10-07T09:25:31.127Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:31.129Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:31.129Z] [8] Start successful
+[2014-10-07T09:25:31.129Z] All workers started in 258ms
+[2014-10-07T09:25:32.206Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:32.208Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:32.208Z] [3] Start successful
+[2014-10-07T09:25:32.218Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:32.219Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:32.221Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:32.221Z] [2] Start successful
+[2014-10-07T09:25:32.222Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:32.222Z] [1] Start successful
+[2014-10-07T09:25:32.274Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:32.276Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:32.276Z] [5] Start successful
+[2014-10-07T09:25:32.297Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:32.299Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:32.299Z] [4] Start successful
+[2014-10-07T09:25:32.309Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:32.311Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:32.311Z] [6] Start successful
+[2014-10-07T09:25:32.332Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:32.332Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:32.333Z] [7] Start successful
+[2014-10-07T09:25:32.346Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:32.348Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:32.348Z] [8] Start successful
+[2014-10-07T09:25:32.349Z] All workers started in 333ms
+[2014-10-07T09:25:33.257Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:33.259Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:33.259Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:33.260Z] [1] Start successful
+[2014-10-07T09:25:33.261Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:33.262Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:33.262Z] [3] Start successful
+[2014-10-07T09:25:33.263Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:33.263Z] [2] Start successful
+[2014-10-07T09:25:33.265Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:33.267Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:33.267Z] [7] Start successful
+[2014-10-07T09:25:33.272Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:33.274Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:33.274Z] [5] Start successful
+[2014-10-07T09:25:33.276Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:33.276Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:33.278Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:33.278Z] [6] Start successful
+[2014-10-07T09:25:33.284Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:33.284Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:33.284Z] [8] Start successful
+[2014-10-07T09:25:33.285Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:33.285Z] [4] Start successful
+[2014-10-07T09:25:33.286Z] All workers started in 237ms
+[2014-10-07T09:25:34.337Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:34.339Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:34.339Z] [1] Start successful
+[2014-10-07T09:25:34.349Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:34.352Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:34.352Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:34.353Z] [5] Start successful
+[2014-10-07T09:25:34.355Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:34.355Z] [3] Start successful
+[2014-10-07T09:25:34.363Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:34.365Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:34.366Z] [7] Start successful
+[2014-10-07T09:25:34.368Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:34.369Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:34.369Z] [4] Start successful
+[2014-10-07T09:25:34.383Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:34.384Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:34.384Z] [8] Start successful
+[2014-10-07T09:25:34.388Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:34.390Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:34.391Z] [2] Start successful
+[2014-10-07T09:25:34.396Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:34.397Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:34.397Z] [6] Start successful
+[2014-10-07T09:25:34.398Z] All workers started in 266ms
+[2014-10-07T09:25:35.295Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:35.296Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:35.297Z] [1] Start successful
+[2014-10-07T09:25:35.297Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:35.299Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:35.299Z] [5] Start successful
+[2014-10-07T09:25:35.302Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:35.304Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:35.304Z] [4] Start successful
+[2014-10-07T09:25:35.308Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:35.309Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:35.310Z] [3] Start successful
+[2014-10-07T09:25:35.314Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:35.315Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:35.317Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:35.318Z] [7] Start successful
+[2014-10-07T09:25:35.318Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:35.318Z] [6] Start successful
+[2014-10-07T09:25:35.344Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:35.346Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:35.346Z] [2] Start successful
+[2014-10-07T09:25:35.361Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:35.363Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:35.363Z] [8] Start successful
+[2014-10-07T09:25:35.363Z] All workers started in 278ms
+[2014-10-07T09:25:36.251Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:36.253Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:36.253Z] [2] Start successful
+[2014-10-07T09:25:36.253Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:36.255Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:36.255Z] [1] Start successful
+[2014-10-07T09:25:36.260Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:36.260Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:36.261Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:36.261Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:36.261Z] [5] Start successful
+[2014-10-07T09:25:36.262Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:36.263Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:36.263Z] [3] Start successful
+[2014-10-07T09:25:36.263Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:36.264Z] [4] Start successful
+[2014-10-07T09:25:36.264Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:36.264Z] [6] Start successful
+[2014-10-07T09:25:36.264Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:36.266Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:36.266Z] [7] Start successful
+[2014-10-07T09:25:36.275Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:36.277Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:36.277Z] [8] Start successful
+[2014-10-07T09:25:36.277Z] All workers started in 229ms
+[2014-10-07T09:25:37.199Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:37.201Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:37.202Z] [3] Start successful
+[2014-10-07T09:25:37.202Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:37.204Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:37.204Z] [1] Start successful
+[2014-10-07T09:25:37.210Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:37.212Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:37.212Z] [2] Start successful
+[2014-10-07T09:25:37.217Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:37.218Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:37.219Z] [6] Start successful
+[2014-10-07T09:25:37.219Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:37.221Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:37.221Z] [8] Start successful
+[2014-10-07T09:25:37.229Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:37.229Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:37.230Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:37.230Z] [7] Start successful
+[2014-10-07T09:25:37.235Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:37.235Z] [5] Start successful
+[2014-10-07T09:25:37.237Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:37.238Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:37.238Z] [4] Start successful
+[2014-10-07T09:25:37.239Z] All workers started in 235ms
+[2014-10-07T09:25:38.315Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:38.317Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:38.318Z] [1] Start successful
+[2014-10-07T09:25:38.324Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:38.326Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:38.326Z] [3] Start successful
+[2014-10-07T09:25:38.334Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:38.336Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:38.336Z] [2] Start successful
+[2014-10-07T09:25:38.342Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:38.343Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:38.344Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:38.345Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:38.345Z] [4] Start successful
+[2014-10-07T09:25:38.345Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:38.346Z] [5] Start successful
+[2014-10-07T09:25:38.347Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:38.347Z] [7] Start successful
+[2014-10-07T09:25:38.361Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:38.363Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:38.363Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:38.363Z] [8] Start successful
+[2014-10-07T09:25:38.364Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:38.364Z] [6] Start successful
+[2014-10-07T09:25:38.365Z] All workers started in 258ms
+[2014-10-07T09:25:42.493Z] [1] Listening on port: port 4080
+[2014-10-07T09:25:42.494Z] [1] Listening on port: port 40443
+[2014-10-07T09:25:42.496Z] [1] Start successful
+[2014-10-07T09:25:42.501Z] [3] Listening on port: port 4080
+[2014-10-07T09:25:42.502Z] [4] Listening on port: port 4080
+[2014-10-07T09:25:42.504Z] [3] Listening on port: port 40443
+[2014-10-07T09:25:42.504Z] [3] Start successful
+[2014-10-07T09:25:42.505Z] [4] Listening on port: port 40443
+[2014-10-07T09:25:42.505Z] [4] Start successful
+[2014-10-07T09:25:42.508Z] [7] Listening on port: port 4080
+[2014-10-07T09:25:42.510Z] [7] Listening on port: port 40443
+[2014-10-07T09:25:42.510Z] [7] Start successful
+[2014-10-07T09:25:42.512Z] [5] Listening on port: port 4080
+[2014-10-07T09:25:42.514Z] [5] Listening on port: port 40443
+[2014-10-07T09:25:42.514Z] [5] Start successful
+[2014-10-07T09:25:42.515Z] [2] Listening on port: port 4080
+[2014-10-07T09:25:42.517Z] [2] Listening on port: port 40443
+[2014-10-07T09:25:42.517Z] [2] Start successful
+[2014-10-07T09:25:42.520Z] [6] Listening on port: port 4080
+[2014-10-07T09:25:42.521Z] [6] Listening on port: port 40443
+[2014-10-07T09:25:42.522Z] [6] Start successful
+[2014-10-07T09:25:42.522Z] [8] Listening on port: port 4080
+[2014-10-07T09:25:42.524Z] [8] Listening on port: port 40443
+[2014-10-07T09:25:42.524Z] [8] Start successful
+[2014-10-07T09:25:42.524Z] All workers started in 232ms
+[2014-10-11T22:14:31.986Z] Error loading module: accessLog Error: No recipe to resolve 'logMiddleware'
+[2014-10-11T22:14:31.988Z] Error loading module: accessLog Error: No recipe to resolve 'logMiddleware'
+[2014-10-11T22:14:32.024Z] Error loading module: accessLog Error: No recipe to resolve 'logMiddleware'
+[2014-10-11T22:14:32.047Z] Error loading module: accessLog Error: No recipe to resolve 'logMiddleware'
+[2014-10-11T22:14:32.075Z] [2] Listening on port: port 4080
+[2014-10-11T22:14:32.077Z] [2] Listening on port: port 40443
+[2014-10-11T22:14:32.078Z] [2] Start successful
+[2014-10-11T22:14:32.117Z] [1] Listening on port: port 4080
+[2014-10-11T22:14:32.121Z] [1] Listening on port: port 40443
+[2014-10-11T22:14:32.121Z] [1] Start successful
+[2014-10-11T22:14:32.132Z] [4] Listening on port: port 4080
+[2014-10-11T22:14:32.133Z] [4] Listening on port: port 40443
+[2014-10-11T22:14:32.134Z] [4] Start successful
+[2014-10-11T22:14:32.184Z] [3] Listening on port: port 4080
+[2014-10-11T22:14:32.188Z] [3] Listening on port: port 40443
+[2014-10-11T22:14:32.189Z] [3] Start successful
+[2014-10-11T22:14:32.191Z] All workers started in 467ms
+[2014-10-11T23:18:27.843Z] [1] Listening on port: port 4080
+[2014-10-11T23:18:27.846Z] [1] Listening on port: port 40443
+[2014-10-11T23:18:27.847Z] [1] Start successful
+[2014-10-11T23:18:27.853Z] [3] Listening on port: port 4080
+[2014-10-11T23:18:27.854Z] [3] Listening on port: port 40443
+[2014-10-11T23:18:27.854Z] [3] Start successful
+[2014-10-11T23:18:27.856Z] [2] Listening on port: port 4080
+[2014-10-11T23:18:27.857Z] [2] Listening on port: port 40443
+[2014-10-11T23:18:27.857Z] [2] Start successful
+[2014-10-11T23:18:27.875Z] [4] Listening on port: port 4080
+[2014-10-11T23:18:27.879Z] [4] Listening on port: port 40443
+[2014-10-11T23:18:27.879Z] [4] Start successful
+[2014-10-11T23:18:27.881Z] All workers started in 444ms
+[2014-10-11T23:18:43.271Z] [1] Listening on port: port 4080
+[2014-10-11T23:18:43.275Z] [1] Listening on port: port 40443
+[2014-10-11T23:18:43.276Z] [1] Start successful
+[2014-10-11T23:18:43.276Z] [2] Listening on port: port 4080
+[2014-10-11T23:18:43.277Z] [2] Listening on port: port 40443
+[2014-10-11T23:18:43.278Z] [2] Start successful
+[2014-10-11T23:18:43.287Z] [3] Listening on port: port 4080
+[2014-10-11T23:18:43.289Z] [3] Listening on port: port 40443
+[2014-10-11T23:18:43.289Z] [3] Start successful
+[2014-10-11T23:18:43.314Z] [4] Listening on port: port 4080
+[2014-10-11T23:18:43.318Z] [4] Listening on port: port 40443
+[2014-10-11T23:18:43.318Z] [4] Start successful
+[2014-10-11T23:18:43.320Z] All workers started in 457ms
+[2014-10-11T23:18:52.223Z] [2] Listening on port: port 4080
+[2014-10-11T23:18:52.224Z] [2] Listening on port: port 40443
+[2014-10-11T23:18:52.225Z] [2] Start successful
+[2014-10-11T23:18:52.226Z] [3] Listening on port: port 4080
+[2014-10-11T23:18:52.226Z] [3] Listening on port: port 40443
+[2014-10-11T23:18:52.227Z] [3] Start successful
+[2014-10-11T23:18:52.229Z] [1] Listening on port: port 4080
+[2014-10-11T23:18:52.230Z] [1] Listening on port: port 40443
+[2014-10-11T23:18:52.230Z] [1] Start successful
+[2014-10-11T23:18:52.241Z] [4] Listening on port: port 4080
+[2014-10-11T23:18:52.242Z] [4] Listening on port: port 40443
+[2014-10-11T23:18:52.243Z] [4] Start successful
+[2014-10-11T23:18:52.243Z] All workers started in 434ms
+[2014-10-11T23:19:43.298Z] [1] Listening on port: port 4080
+[2014-10-11T23:19:43.300Z] [1] Listening on port: port 40443
+[2014-10-11T23:19:43.300Z] [1] Start successful
+[2014-10-11T23:19:43.341Z] [3] Listening on port: port 4080
+[2014-10-11T23:19:43.343Z] [3] Listening on port: port 40443
+[2014-10-11T23:19:43.343Z] [3] Start successful
+[2014-10-11T23:19:43.344Z] [4] Listening on port: port 4080
+[2014-10-11T23:19:43.346Z] [4] Listening on port: port 40443
+[2014-10-11T23:19:43.346Z] [4] Start successful
+[2014-10-11T23:19:43.356Z] [2] Listening on port: port 4080
+[2014-10-11T23:19:43.359Z] [2] Listening on port: port 40443
+[2014-10-11T23:19:43.360Z] [2] Start successful
+[2014-10-11T23:19:43.361Z] All workers started in 377ms
+[2014-10-12T11:18:51.015Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.016Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.032Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.036Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.058Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.075Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.083Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.096Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T11:18:51.112Z] [2] Listening on port: port 4080
+[2014-10-12T11:18:51.114Z] [2] Listening on port: port 40443
+[2014-10-12T11:18:51.114Z] [2] Start successful
+[2014-10-12T11:18:51.115Z] [1] Listening on port: port 4080
+[2014-10-12T11:18:51.116Z] [1] Listening on port: port 40443
+[2014-10-12T11:18:51.118Z] [1] Start successful
+[2014-10-12T11:18:51.122Z] [4] Listening on port: port 4080
+[2014-10-12T11:18:51.124Z] [4] Listening on port: port 40443
+[2014-10-12T11:18:51.124Z] [4] Start successful
+[2014-10-12T11:18:51.126Z] [3] Listening on port: port 4080
+[2014-10-12T11:18:51.127Z] [3] Listening on port: port 40443
+[2014-10-12T11:18:51.127Z] [3] Start successful
+[2014-10-12T11:18:51.130Z] [6] Listening on port: port 4080
+[2014-10-12T11:18:51.131Z] [6] Listening on port: port 40443
+[2014-10-12T11:18:51.131Z] [6] Start successful
+[2014-10-12T11:18:51.145Z] [5] Listening on port: port 4080
+[2014-10-12T11:18:51.146Z] [5] Listening on port: port 40443
+[2014-10-12T11:18:51.146Z] [5] Start successful
+[2014-10-12T11:18:51.150Z] [8] Listening on port: port 4080
+[2014-10-12T11:18:51.150Z] [8] Listening on port: port 40443
+[2014-10-12T11:18:51.150Z] [8] Start successful
+[2014-10-12T11:18:51.155Z] [7] Listening on port: port 4080
+[2014-10-12T11:18:51.156Z] [7] Listening on port: port 40443
+[2014-10-12T11:18:51.156Z] [7] Start successful
+[2014-10-12T11:18:51.157Z] All workers started in 298ms
+[2014-10-12T11:19:17.485Z] [2] Listening on port: port 4080
+[2014-10-12T11:19:17.486Z] [2] Listening on port: port 40443
+[2014-10-12T11:19:17.487Z] [2] Start successful
+[2014-10-12T11:19:17.487Z] [7] Listening on port: port 4080
+[2014-10-12T11:19:17.488Z] [7] Listening on port: port 40443
+[2014-10-12T11:19:17.488Z] [7] Start successful
+[2014-10-12T11:19:17.490Z] [3] Listening on port: port 4080
+[2014-10-12T11:19:17.491Z] [3] Listening on port: port 40443
+[2014-10-12T11:19:17.491Z] [3] Start successful
+[2014-10-12T11:19:17.504Z] [4] Listening on port: port 4080
+[2014-10-12T11:19:17.505Z] [4] Listening on port: port 40443
+[2014-10-12T11:19:17.505Z] [4] Start successful
+[2014-10-12T11:19:17.505Z] [1] Listening on port: port 4080
+[2014-10-12T11:19:17.506Z] [1] Listening on port: port 40443
+[2014-10-12T11:19:17.507Z] [1] Start successful
+[2014-10-12T11:19:17.510Z] [5] Listening on port: port 4080
+[2014-10-12T11:19:17.514Z] [5] Listening on port: port 40443
+[2014-10-12T11:19:17.514Z] [5] Start successful
+[2014-10-12T11:19:17.524Z] [8] Listening on port: port 4080
+[2014-10-12T11:19:17.524Z] [6] Listening on port: port 4080
+[2014-10-12T11:19:17.525Z] [8] Listening on port: port 40443
+[2014-10-12T11:19:17.525Z] [8] Start successful
+[2014-10-12T11:19:17.525Z] [6] Listening on port: port 40443
+[2014-10-12T11:19:17.525Z] [6] Start successful
+[2014-10-12T11:19:17.525Z] All workers started in 263ms
+[2014-10-12T11:19:40.883Z] [1] Listening on port: port 4080
+[2014-10-12T11:19:40.886Z] [1] Listening on port: port 40443
+[2014-10-12T11:19:40.887Z] [1] Start successful
+[2014-10-12T11:19:40.910Z] [7] Listening on port: port 4080
+[2014-10-12T11:19:40.911Z] [3] Listening on port: port 4080
+[2014-10-12T11:19:40.911Z] [7] Listening on port: port 40443
+[2014-10-12T11:19:40.911Z] [7] Start successful
+[2014-10-12T11:19:40.912Z] [3] Listening on port: port 40443
+[2014-10-12T11:19:40.912Z] [3] Start successful
+[2014-10-12T11:19:40.921Z] [6] Listening on port: port 4080
+[2014-10-12T11:19:40.922Z] [6] Listening on port: port 40443
+[2014-10-12T11:19:40.922Z] [6] Start successful
+[2014-10-12T11:19:40.923Z] [4] Listening on port: port 4080
+[2014-10-12T11:19:40.924Z] [4] Listening on port: port 40443
+[2014-10-12T11:19:40.924Z] [4] Start successful
+[2014-10-12T11:19:40.933Z] [2] Listening on port: port 4080
+[2014-10-12T11:19:40.934Z] [2] Listening on port: port 40443
+[2014-10-12T11:19:40.934Z] [2] Start successful
+[2014-10-12T11:19:40.946Z] [5] Listening on port: port 4080
+[2014-10-12T11:19:40.946Z] [5] Listening on port: port 40443
+[2014-10-12T11:19:40.946Z] [5] Start successful
+[2014-10-12T11:19:40.955Z] [8] Listening on port: port 4080
+[2014-10-12T11:19:40.955Z] [8] Listening on port: port 40443
+[2014-10-12T11:19:40.956Z] [8] Start successful
+[2014-10-12T11:19:40.956Z] All workers started in 260ms
+[2014-10-12T11:36:19.599Z] [6] Listening on port: port 4080
+[2014-10-12T11:36:19.601Z] [8] Listening on port: port 4080
+[2014-10-12T11:36:19.601Z] [8] Listening on port: port 40443
+[2014-10-12T11:36:19.602Z] [8] Start successful
+[2014-10-12T11:36:19.603Z] [6] Listening on port: port 40443
+[2014-10-12T11:36:19.603Z] [6] Start successful
+[2014-10-12T11:36:19.612Z] [5] Listening on port: port 4080
+[2014-10-12T11:36:19.614Z] [5] Listening on port: port 40443
+[2014-10-12T11:36:19.616Z] [5] Start successful
+[2014-10-12T11:36:19.617Z] [2] Listening on port: port 4080
+[2014-10-12T11:36:19.617Z] [2] Listening on port: port 40443
+[2014-10-12T11:36:19.617Z] [7] Listening on port: port 4080
+[2014-10-12T11:36:19.617Z] [2] Start successful
+[2014-10-12T11:36:19.617Z] [7] Listening on port: port 40443
+[2014-10-12T11:36:19.617Z] [7] Start successful
+[2014-10-12T11:36:19.621Z] [3] Listening on port: port 4080
+[2014-10-12T11:36:19.623Z] [3] Listening on port: port 40443
+[2014-10-12T11:36:19.623Z] [3] Start successful
+[2014-10-12T11:36:19.624Z] [1] Listening on port: port 4080
+[2014-10-12T11:36:19.625Z] [1] Listening on port: port 40443
+[2014-10-12T11:36:19.625Z] [1] Start successful
+[2014-10-12T11:36:19.625Z] [4] Listening on port: port 4080
+[2014-10-12T11:36:19.626Z] [4] Listening on port: port 40443
+[2014-10-12T11:36:19.626Z] [4] Start successful
+[2014-10-12T11:36:19.626Z] All workers started in 253ms
+[2014-10-12T12:28:05.602Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.606Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.606Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.622Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.639Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.654Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.667Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.673Z] [6] Listening on port: port 4080
+[2014-10-12T12:28:05.674Z] [6] Listening on port: port 40443
+[2014-10-12T12:28:05.674Z] [6] Start successful
+[2014-10-12T12:28:05.677Z] [2] Listening on port: port 4080
+[2014-10-12T12:28:05.678Z] [2] Listening on port: port 40443
+[2014-10-12T12:28:05.678Z] [2] Start successful
+[2014-10-12T12:28:05.686Z] [1] Listening on port: port 4080
+[2014-10-12T12:28:05.687Z] [1] Listening on port: port 40443
+[2014-10-12T12:28:05.687Z] [1] Start successful
+[2014-10-12T12:28:05.694Z] [4] Listening on port: port 4080
+[2014-10-12T12:28:05.695Z] [4] Listening on port: port 40443
+[2014-10-12T12:28:05.695Z] [4] Start successful
+[2014-10-12T12:28:05.710Z] [3] Listening on port: port 4080
+[2014-10-12T12:28:05.711Z] [3] Listening on port: port 40443
+[2014-10-12T12:28:05.711Z] [3] Start successful
+[2014-10-12T12:28:05.723Z] [5] Listening on port: port 4080
+[2014-10-12T12:28:05.724Z] [5] Listening on port: port 40443
+[2014-10-12T12:28:05.724Z] [5] Start successful
+[2014-10-12T12:28:05.727Z] Error loading module: accessLog Error: Cannot find module '/home/rush/Programowanie/http-master/modules/accessLog'
+[2014-10-12T12:28:05.730Z] [7] Listening on port: port 4080
+[2014-10-12T12:28:05.731Z] [7] Listening on port: port 40443
+[2014-10-12T12:28:05.731Z] [7] Start successful
+[2014-10-12T12:28:05.768Z] [8] Listening on port: port 4080
+[2014-10-12T12:28:05.769Z] [8] Listening on port: port 40443
+[2014-10-12T12:28:05.769Z] [8] Start successful
+[2014-10-12T12:28:05.770Z] All workers started in 315ms
+[2014-10-12T12:28:26.117Z] [5] Listening on port: port 4080
+[2014-10-12T12:28:26.119Z] [5] Listening on port: port 40443
+[2014-10-12T12:28:26.120Z] [5] Start successful
+[2014-10-12T12:28:26.121Z] [1] Listening on port: port 4080
+[2014-10-12T12:28:26.122Z] [1] Listening on port: port 40443
+[2014-10-12T12:28:26.122Z] [1] Start successful
+[2014-10-12T12:28:26.122Z] [3] Listening on port: port 4080
+[2014-10-12T12:28:26.123Z] [3] Listening on port: port 40443
+[2014-10-12T12:28:26.123Z] [3] Start successful
+[2014-10-12T12:28:26.124Z] [4] Listening on port: port 4080
+[2014-10-12T12:28:26.125Z] [4] Listening on port: port 40443
+[2014-10-12T12:28:26.125Z] [4] Start successful
+[2014-10-12T12:28:26.130Z] [2] Listening on port: port 4080
+[2014-10-12T12:28:26.131Z] [2] Listening on port: port 40443
+[2014-10-12T12:28:26.131Z] [2] Start successful
+[2014-10-12T12:28:26.165Z] [7] Listening on port: port 4080
+[2014-10-12T12:28:26.167Z] [6] Listening on port: port 4080
+[2014-10-12T12:28:26.167Z] [7] Listening on port: port 40443
+[2014-10-12T12:28:26.167Z] [7] Start successful
+[2014-10-12T12:28:26.167Z] [6] Listening on port: port 40443
+[2014-10-12T12:28:26.167Z] [6] Start successful
+[2014-10-12T12:28:26.179Z] [8] Listening on port: port 4080
+[2014-10-12T12:28:26.180Z] [8] Listening on port: port 40443
+[2014-10-12T12:28:26.180Z] [8] Start successful
+[2014-10-12T12:28:26.181Z] All workers started in 281ms
+[2014-10-12T12:28:43.836Z] [1] Listening on port: port 4080
+[2014-10-12T12:28:43.837Z] [1] Listening on port: port 40443
+[2014-10-12T12:28:43.838Z] [1] Start successful
+[2014-10-12T12:28:43.838Z] [2] Listening on port: port 4080
+[2014-10-12T12:28:43.838Z] [2] Listening on port: port 40443
+[2014-10-12T12:28:43.838Z] [2] Start successful
+[2014-10-12T12:28:43.839Z] [3] Listening on port: port 4080
+[2014-10-12T12:28:43.839Z] [3] Listening on port: port 40443
+[2014-10-12T12:28:43.839Z] [3] Start successful
+[2014-10-12T12:28:43.847Z] [4] Listening on port: port 4080
+[2014-10-12T12:28:43.848Z] [4] Listening on port: port 40443
+[2014-10-12T12:28:43.848Z] [4] Start successful
+[2014-10-12T12:28:43.853Z] [6] Listening on port: port 4080
+[2014-10-12T12:28:43.853Z] [6] Listening on port: port 40443
+[2014-10-12T12:28:43.854Z] [6] Start successful
+[2014-10-12T12:28:43.854Z] [7] Listening on port: port 4080
+[2014-10-12T12:28:43.854Z] [5] Listening on port: port 4080
+[2014-10-12T12:28:43.855Z] [5] Listening on port: port 40443
+[2014-10-12T12:28:43.855Z] [7] Listening on port: port 40443
+[2014-10-12T12:28:43.855Z] [7] Start successful
+[2014-10-12T12:28:43.855Z] [5] Start successful
+[2014-10-12T12:28:43.860Z] [8] Listening on port: port 4080
+[2014-10-12T12:28:43.861Z] [8] Listening on port: port 40443
+[2014-10-12T12:28:43.861Z] [8] Start successful
+[2014-10-12T12:28:43.862Z] All workers started in 247ms
+[2014-10-12T12:29:30.948Z] [object Object]
+[2014-10-12T12:29:30.949Z] [object Object]
+[2014-10-12T12:29:30.950Z] [object Object]
+[2014-10-12T12:29:30.950Z] [object Object]
+[2014-10-12T12:29:30.953Z] [object Object]
+[2014-10-12T12:29:30.953Z] [object Object]
+[2014-10-12T12:29:30.955Z] [object Object]
+[2014-10-12T12:29:30.975Z] log -> test.log,[object Object]
+[2014-10-12T12:29:30.976Z] log -> test.log,[object Object]
+[2014-10-12T12:29:30.976Z] log -> test.log,[object Object]
+[2014-10-12T12:29:30.979Z] log -> test.log,[object Object]
+[2014-10-12T12:29:30.979Z] log -> test.log,[object Object]
+[2014-10-12T12:29:30.980Z] log -> test.log,[object Object]
+[2014-10-12T12:29:30.987Z] log -> test.log,[object Object]
+[2014-10-12T12:29:30.988Z] [object Object]
+[2014-10-12T12:29:31.014Z] [3] Listening on port: port 4080
+[2014-10-12T12:29:31.015Z] [3] Listening on port: port 40443
+[2014-10-12T12:29:31.015Z] [3] Start successful
+[2014-10-12T12:29:31.018Z] [5] Listening on port: port 4080
+[2014-10-12T12:29:31.019Z] [5] Listening on port: port 40443
+[2014-10-12T12:29:31.019Z] [5] Start successful
+[2014-10-12T12:29:31.020Z] [4] Listening on port: port 4080
+[2014-10-12T12:29:31.020Z] log -> test.log,[object Object]
+[2014-10-12T12:29:31.021Z] [4] Listening on port: port 40443
+[2014-10-12T12:29:31.021Z] [4] Start successful
+[2014-10-12T12:29:31.022Z] [6] Listening on port: port 4080
+[2014-10-12T12:29:31.023Z] [6] Listening on port: port 40443
+[2014-10-12T12:29:31.023Z] [6] Start successful
+[2014-10-12T12:29:31.024Z] [7] Listening on port: port 4080
+[2014-10-12T12:29:31.024Z] [1] Listening on port: port 4080
+[2014-10-12T12:29:31.024Z] [7] Listening on port: port 40443
+[2014-10-12T12:29:31.024Z] [7] Start successful
+[2014-10-12T12:29:31.025Z] [1] Listening on port: port 40443
+[2014-10-12T12:29:31.025Z] [1] Start successful
+[2014-10-12T12:29:31.028Z] [2] Listening on port: port 4080
+[2014-10-12T12:29:31.029Z] [2] Listening on port: port 40443
+[2014-10-12T12:29:31.029Z] [2] Start successful
+[2014-10-12T12:29:31.046Z] [8] Listening on port: port 4080
+[2014-10-12T12:29:31.047Z] [8] Listening on port: port 40443
+[2014-10-12T12:29:31.047Z] [8] Start successful
+[2014-10-12T12:29:31.048Z] All workers started in 259ms
+[2014-10-12T12:30:05.116Z] [3] Listening on port: port 4080
+[2014-10-12T12:30:05.117Z] [3] Listening on port: port 40443
+[2014-10-12T12:30:05.117Z] [3] Start successful
+[2014-10-12T12:30:05.117Z] [1] Listening on port: port 4080
+[2014-10-12T12:30:05.118Z] [1] Listening on port: port 40443
+[2014-10-12T12:30:05.118Z] [1] Start successful
+[2014-10-12T12:30:05.123Z] [5] Listening on port: port 4080
+[2014-10-12T12:30:05.123Z] [5] Listening on port: port 40443
+[2014-10-12T12:30:05.123Z] [5] Start successful
+[2014-10-12T12:30:05.126Z] [2] Listening on port: port 4080
+[2014-10-12T12:30:05.127Z] [2] Listening on port: port 40443
+[2014-10-12T12:30:05.127Z] [2] Start successful
+[2014-10-12T12:30:05.130Z] [7] Listening on port: port 4080
+[2014-10-12T12:30:05.130Z] [4] Listening on port: port 4080
+[2014-10-12T12:30:05.131Z] [7] Listening on port: port 40443
+[2014-10-12T12:30:05.131Z] [7] Start successful
+[2014-10-12T12:30:05.131Z] [4] Listening on port: port 40443
+[2014-10-12T12:30:05.131Z] [6] Listening on port: port 4080
+[2014-10-12T12:30:05.131Z] [4] Start successful
+[2014-10-12T12:30:05.132Z] [6] Listening on port: port 40443
+[2014-10-12T12:30:05.132Z] [6] Start successful
+[2014-10-12T12:30:05.134Z] [8] Listening on port: port 4080
+[2014-10-12T12:30:05.135Z] [8] Listening on port: port 40443
+[2014-10-12T12:30:05.135Z] [8] Start successful
+[2014-10-12T12:30:05.136Z] All workers started in 239ms
+[2014-10-12T12:30:19.282Z] [4] Listening on port: port 4080
+[2014-10-12T12:30:19.283Z] [4] Listening on port: port 40443
+[2014-10-12T12:30:19.283Z] [4] Start successful
+[2014-10-12T12:30:19.287Z] [2] Listening on port: port 4080
+[2014-10-12T12:30:19.288Z] [2] Listening on port: port 40443
+[2014-10-12T12:30:19.288Z] [2] Start successful
+[2014-10-12T12:30:19.290Z] [1] Listening on port: port 4080
+[2014-10-12T12:30:19.291Z] [1] Listening on port: port 40443
+[2014-10-12T12:30:19.291Z] [1] Start successful
+[2014-10-12T12:30:19.292Z] [3] Listening on port: port 4080
+[2014-10-12T12:30:19.293Z] [3] Listening on port: port 40443
+[2014-10-12T12:30:19.293Z] [3] Start successful
+[2014-10-12T12:30:19.294Z] [6] Listening on port: port 4080
+[2014-10-12T12:30:19.295Z] [6] Listening on port: port 40443
+[2014-10-12T12:30:19.295Z] [6] Start successful
+[2014-10-12T12:30:19.298Z] [5] Listening on port: port 4080
+[2014-10-12T12:30:19.299Z] [5] Listening on port: port 40443
+[2014-10-12T12:30:19.299Z] [5] Start successful
+[2014-10-12T12:30:19.303Z] [7] Listening on port: port 4080
+[2014-10-12T12:30:19.303Z] [7] Listening on port: port 40443
+[2014-10-12T12:30:19.303Z] [7] Start successful
+[2014-10-12T12:30:19.310Z] [8] Listening on port: port 4080
+[2014-10-12T12:30:19.310Z] [8] Listening on port: port 40443
+[2014-10-12T12:30:19.310Z] [8] Start successful
+[2014-10-12T12:30:19.311Z] All workers started in 250ms
+[2014-10-12T12:31:00.235Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.244Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.246Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.246Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.256Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.265Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.266Z] [1] Listening on port: port 4080
+[2014-10-12T12:31:00.267Z] [1] Listening on port: port 40443
+[2014-10-12T12:31:00.267Z] [1] Start successful
+[2014-10-12T12:31:00.276Z] [7] Listening on port: port 4080
+[2014-10-12T12:31:00.277Z] [7] Listening on port: port 40443
+[2014-10-12T12:31:00.277Z] [7] Start successful
+[2014-10-12T12:31:00.278Z] [4] Listening on port: port 4080
+[2014-10-12T12:31:00.278Z] [2] Listening on port: port 4080
+[2014-10-12T12:31:00.278Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.279Z] [2] Listening on port: port 40443
+[2014-10-12T12:31:00.279Z] [2] Start successful
+[2014-10-12T12:31:00.280Z] [4] Listening on port: port 40443
+[2014-10-12T12:31:00.280Z] [4] Start successful
+[2014-10-12T12:31:00.284Z] [5] Listening on port: port 4080
+[2014-10-12T12:31:00.285Z] [5] Listening on port: port 40443
+[2014-10-12T12:31:00.285Z] [5] Start successful
+[2014-10-12T12:31:00.293Z] [6] Listening on port: port 4080
+[2014-10-12T12:31:00.294Z] [6] Listening on port: port 40443
+[2014-10-12T12:31:00.294Z] [6] Start successful
+[2014-10-12T12:31:00.299Z] [3] Listening on port: port 4080
+[2014-10-12T12:31:00.300Z] [3] Listening on port: port 40443
+[2014-10-12T12:31:00.300Z] [3] Start successful
+[2014-10-12T12:31:00.321Z] LOGMIDDLEWARE
+[2014-10-12T12:31:00.338Z] [8] Listening on port: port 4080
+[2014-10-12T12:31:00.339Z] [8] Listening on port: port 40443
+[2014-10-12T12:31:00.339Z] [8] Start successful
+[2014-10-12T12:31:00.340Z] All workers started in 284ms
+[2014-10-12T12:31:21.807Z] ENTRY test.log
+[2014-10-12T12:31:21.809Z] ENTRY test.log
+[2014-10-12T12:31:21.816Z] ENTRY test.log
+[2014-10-12T12:31:21.817Z] ENTRY test.log
+[2014-10-12T12:31:21.824Z] ENTRY test.log
+[2014-10-12T12:31:21.825Z] ENTRY test.log
+[2014-10-12T12:31:21.837Z] ENTRY test.log
+[2014-10-12T12:31:21.840Z] ENTRY test.log
+[2014-10-12T12:31:21.842Z] [1] Listening on port: port 4080
+[2014-10-12T12:31:21.843Z] [1] Listening on port: port 40443
+[2014-10-12T12:31:21.843Z] [1] Start successful
+[2014-10-12T12:31:21.844Z] [2] Listening on port: port 4080
+[2014-10-12T12:31:21.845Z] [2] Listening on port: port 40443
+[2014-10-12T12:31:21.845Z] [2] Start successful
+[2014-10-12T12:31:21.847Z] [6] Listening on port: port 4080
+[2014-10-12T12:31:21.848Z] [6] Listening on port: port 40443
+[2014-10-12T12:31:21.848Z] [6] Start successful
+[2014-10-12T12:31:21.849Z] [3] Listening on port: port 4080
+[2014-10-12T12:31:21.850Z] [3] Listening on port: port 40443
+[2014-10-12T12:31:21.850Z] [3] Start successful
+[2014-10-12T12:31:21.857Z] [4] Listening on port: port 4080
+[2014-10-12T12:31:21.858Z] [4] Listening on port: port 40443
+[2014-10-12T12:31:21.858Z] [4] Start successful
+[2014-10-12T12:31:21.860Z] [8] Listening on port: port 4080
+[2014-10-12T12:31:21.860Z] [5] Listening on port: port 4080
+[2014-10-12T12:31:21.861Z] [8] Listening on port: port 40443
+[2014-10-12T12:31:21.861Z] [8] Start successful
+[2014-10-12T12:31:21.861Z] [5] Listening on port: port 40443
+[2014-10-12T12:31:21.861Z] [5] Start successful
+[2014-10-12T12:31:21.865Z] [7] Listening on port: port 4080
+[2014-10-12T12:31:21.865Z] [7] Listening on port: port 40443
+[2014-10-12T12:31:21.865Z] [7] Start successful
+[2014-10-12T12:31:21.866Z] All workers started in 247ms
+[2014-10-12T12:31:34.540Z] ENTRY test.log
+[2014-10-12T12:31:34.568Z] ENTRY test.log
+[2014-10-12T12:31:34.571Z] [3] Listening on port: port 4080
+[2014-10-12T12:31:34.571Z] ENTRY test.log
+[2014-10-12T12:31:34.572Z] [3] Listening on port: port 40443
+[2014-10-12T12:31:34.572Z] [3] Start successful
+[2014-10-12T12:31:34.578Z] ENTRY test.log
+[2014-10-12T12:31:34.581Z] ENTRY test.log
+[2014-10-12T12:31:34.599Z] ENTRY test.log
+[2014-10-12T12:31:34.600Z] ENTRY test.log
+[2014-10-12T12:31:34.602Z] [4] Listening on port: port 4080
+[2014-10-12T12:31:34.604Z] [4] Listening on port: port 40443
+[2014-10-12T12:31:34.604Z] [4] Start successful
+[2014-10-12T12:31:34.605Z] [1] Listening on port: port 4080
+[2014-10-12T12:31:34.606Z] [1] Listening on port: port 40443
+[2014-10-12T12:31:34.606Z] [1] Start successful
+[2014-10-12T12:31:34.610Z] [2] Listening on port: port 4080
+[2014-10-12T12:31:34.611Z] [2] Listening on port: port 40443
+[2014-10-12T12:31:34.611Z] [2] Start successful
+[2014-10-12T12:31:34.620Z] [5] Listening on port: port 4080
+[2014-10-12T12:31:34.620Z] [5] Listening on port: port 40443
+[2014-10-12T12:31:34.621Z] [5] Start successful
+[2014-10-12T12:31:34.622Z] ENTRY test.log
+[2014-10-12T12:31:34.623Z] [6] Listening on port: port 4080
+[2014-10-12T12:31:34.624Z] [6] Listening on port: port 40443
+[2014-10-12T12:31:34.624Z] [6] Start successful
+[2014-10-12T12:31:34.625Z] [7] Listening on port: port 4080
+[2014-10-12T12:31:34.626Z] [7] Listening on port: port 40443
+[2014-10-12T12:31:34.626Z] [7] Start successful
+[2014-10-12T12:31:34.641Z] [8] Listening on port: port 4080
+[2014-10-12T12:31:34.641Z] [8] Listening on port: port 40443
+[2014-10-12T12:31:34.642Z] [8] Start successful
+[2014-10-12T12:31:34.642Z] All workers started in 272ms
+[2014-10-12T12:34:43.776Z] PARSE 80
+[2014-10-12T12:34:43.778Z] PARSE 80
+[2014-10-12T12:34:43.778Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.779Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.780Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.780Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.780Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.781Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.781Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.781Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.782Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.782Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.783Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.783Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.783Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.784Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.784Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.785Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.785Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.785Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.786Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.787Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.788Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.788Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.788Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.788Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.788Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.789Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.789Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.789Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.789Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.789Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.789Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.790Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.790Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.790Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.790Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.790Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.790Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.790Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.791Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.795Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.795Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.796Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.796Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.796Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.797Z] PARSE 80
+[2014-10-12T12:34:43.797Z] PARSE 80
+[2014-10-12T12:34:43.800Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.800Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.801Z] ENTRY test.log
+[2014-10-12T12:34:43.802Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.802Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.802Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.803Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.803Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.803Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.803Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.804Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.804Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.804Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.804Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.804Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.805Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.805Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.807Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.807Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.808Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.808Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.808Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.808Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.808Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.808Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.808Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.809Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.809Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.809Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.809Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.810Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.810Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.810Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.813Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.813Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.819Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.823Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.823Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.823Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.823Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.823Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.823Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.827Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.827Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.827Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.827Z] ENTRY test.log
+[2014-10-12T12:34:43.829Z] ENTRY test.log
+[2014-10-12T12:34:43.833Z] PARSE 80
+[2014-10-12T12:34:43.833Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.833Z] ENTRY test.log
+[2014-10-12T12:34:43.834Z] PARSE 80
+[2014-10-12T12:34:43.834Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.835Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.835Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.835Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.837Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.838Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.838Z] PARSE 80
+[2014-10-12T12:34:43.838Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.838Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.838Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.839Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.839Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.839Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.841Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.842Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.846Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.846Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.847Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.847Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.847Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.847Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.847Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.847Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.848Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.848Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.848Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.848Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.848Z] PARSE 80
+[2014-10-12T12:34:43.849Z] [1] Listening on port: port 4080
+[2014-10-12T12:34:43.851Z] PARSE 80
+[2014-10-12T12:34:43.851Z] PARSE 80
+[2014-10-12T12:34:43.851Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.851Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.852Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.852Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.852Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.852Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.852Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.852Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.852Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.853Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.853Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.853Z] PARSE 80
+[2014-10-12T12:34:43.853Z] ENTRY test.log
+[2014-10-12T12:34:43.854Z] ENTRY test.log
+[2014-10-12T12:34:43.854Z] [1] Listening on port: port 40443
+[2014-10-12T12:34:43.854Z] [1] Start successful
+[2014-10-12T12:34:43.854Z] [3] Listening on port: port 4080
+[2014-10-12T12:34:43.854Z] [3] Listening on port: port 40443
+[2014-10-12T12:34:43.854Z] [3] Start successful
+[2014-10-12T12:34:43.854Z] [5] Listening on port: port 4080
+[2014-10-12T12:34:43.855Z] [5] Listening on port: port 40443
+[2014-10-12T12:34:43.855Z] [5] Start successful
+[2014-10-12T12:34:43.855Z] ENTRY test.log
+[2014-10-12T12:34:43.857Z] PARSE 80
+[2014-10-12T12:34:43.859Z] PARSE 80
+[2014-10-12T12:34:43.866Z] [6] Listening on port: port 4080
+[2014-10-12T12:34:43.866Z] [6] Listening on port: port 40443
+[2014-10-12T12:34:43.867Z] [6] Start successful
+[2014-10-12T12:34:43.867Z] PARSE 80
+[2014-10-12T12:34:43.869Z] [2] Listening on port: port 4080
+[2014-10-12T12:34:43.870Z] [2] Listening on port: port 40443
+[2014-10-12T12:34:43.870Z] [2] Start successful
+[2014-10-12T12:34:43.871Z] [8] Listening on port: port 4080
+[2014-10-12T12:34:43.871Z] [8] Listening on port: port 40443
+[2014-10-12T12:34:43.872Z] [8] Start successful
+[2014-10-12T12:34:43.877Z] [4] Listening on port: port 4080
+[2014-10-12T12:34:43.878Z] [4] Listening on port: port 40443
+[2014-10-12T12:34:43.878Z] [4] Start successful
+[2014-10-12T12:34:43.884Z] PARSE 80
+[2014-10-12T12:34:43.886Z] PARSE localhost:80/[rest]
+[2014-10-12T12:34:43.886Z] PARSE localhost:81/[rest]
+[2014-10-12T12:34:43.887Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.887Z] PARSE 127.0.0.1:3000
+[2014-10-12T12:34:43.888Z] PARSE 127.0.0.1:3001
+[2014-10-12T12:34:43.888Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.888Z] PARSE 127.0.0.1:3002
+[2014-10-12T12:34:43.888Z] PARSE 127.0.0.1:3010
+[2014-10-12T12:34:43.888Z] PARSE 127.0.0.1:3009
+[2014-10-12T12:34:43.889Z] PARSE 127.0.0.1:6060
+[2014-10-12T12:34:43.889Z] PARSE 127.0.0.1:7080
+[2014-10-12T12:34:43.889Z] PARSE 127.0.0.1:8099
+[2014-10-12T12:34:43.889Z] PARSE 127.0.0.1:10000
+[2014-10-12T12:34:43.889Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.890Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.890Z] PARSE 127.0.0.1:8091
+[2014-10-12T12:34:43.890Z] PARSE 127.0.0.1:8092
+[2014-10-12T12:34:43.890Z] PARSE 127.0.0.1:12000
+[2014-10-12T12:34:43.890Z] PARSE 127.0.0.1:12001
+[2014-10-12T12:34:43.890Z] PARSE 127.0.0.1:8095
+[2014-10-12T12:34:43.891Z] PARSE 127.0.0.1:8096
+[2014-10-12T12:34:43.891Z] PARSE 4000/test/[path]
+[2014-10-12T12:34:43.898Z] ENTRY test.log
+[2014-10-12T12:34:43.909Z] PARSE 80
+[2014-10-12T12:34:43.918Z] [7] Listening on port: port 4080
+[2014-10-12T12:34:43.918Z] [7] Listening on port: port 40443
+[2014-10-12T12:34:43.918Z] [7] Start successful
+[2014-10-12T12:34:43.919Z] All workers started in 306ms
+[2014-10-12T12:35:19.929Z] PARSE [object Object]
+[2014-10-12T12:35:19.944Z] PARSE [object Object]
+[2014-10-12T12:35:19.952Z] PARSE [object Object]
+[2014-10-12T12:35:19.955Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:19.956Z] PARSE [object Object]
+[2014-10-12T12:35:19.957Z] PARSE [object Object]
+[2014-10-12T12:35:19.962Z] ENTRY test.log
+[2014-10-12T12:35:19.972Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:19.980Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:19.983Z] ENTRY test.log
+[2014-10-12T12:35:19.984Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:19.984Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:19.988Z] PARSE [object Object]
+[2014-10-12T12:35:19.990Z] ENTRY test.log
+[2014-10-12T12:35:19.992Z] [5] Listening on port: port 4080
+[2014-10-12T12:35:19.994Z] [5] Listening on port: port 40443
+[2014-10-12T12:35:19.994Z] ENTRY test.log
+[2014-10-12T12:35:19.994Z] ENTRY test.log
+[2014-10-12T12:35:19.994Z] [5] Start successful
+[2014-10-12T12:35:20.007Z] PARSE [object Object]
+[2014-10-12T12:35:20.014Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:20.021Z] [6] Listening on port: port 4080
+[2014-10-12T12:35:20.021Z] [3] Listening on port: port 4080
+[2014-10-12T12:35:20.021Z] [1] Listening on port: port 4080
+[2014-10-12T12:35:20.022Z] [3] Listening on port: port 40443
+[2014-10-12T12:35:20.022Z] [3] Start successful
+[2014-10-12T12:35:20.023Z] [1] Listening on port: port 40443
+[2014-10-12T12:35:20.023Z] [1] Start successful
+[2014-10-12T12:35:20.023Z] [6] Listening on port: port 40443
+[2014-10-12T12:35:20.024Z] [6] Start successful
+[2014-10-12T12:35:20.024Z] [2] Listening on port: port 4080
+[2014-10-12T12:35:20.024Z] ENTRY test.log
+[2014-10-12T12:35:20.025Z] [2] Listening on port: port 40443
+[2014-10-12T12:35:20.025Z] [2] Start successful
+[2014-10-12T12:35:20.027Z] PARSE [object Object]
+[2014-10-12T12:35:20.032Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:20.042Z] ENTRY test.log
+[2014-10-12T12:35:20.045Z] [7] Listening on port: port 4080
+[2014-10-12T12:35:20.046Z] [7] Listening on port: port 40443
+[2014-10-12T12:35:20.046Z] [7] Start successful
+[2014-10-12T12:35:20.051Z] PARSE log -> test.log,[object Object]
+[2014-10-12T12:35:20.061Z] ENTRY test.log
+[2014-10-12T12:35:20.069Z] [4] Listening on port: port 4080
+[2014-10-12T12:35:20.070Z] [4] Listening on port: port 40443
+[2014-10-12T12:35:20.070Z] [4] Start successful
+[2014-10-12T12:35:20.080Z] [8] Listening on port: port 4080
+[2014-10-12T12:35:20.081Z] [8] Listening on port: port 40443
+[2014-10-12T12:35:20.081Z] [8] Start successful
+[2014-10-12T12:35:20.081Z] All workers started in 296ms
+[2014-10-12T12:36:10.279Z] Parse single entry 80
+[2014-10-12T12:36:10.281Z] Parse single entry 80
+[2014-10-12T12:36:10.291Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.292Z] Parse single entry 80
+[2014-10-12T12:36:10.292Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.293Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.293Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.294Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.295Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.295Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.295Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.295Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.295Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.295Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.295Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.296Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.297Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.297Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.297Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.297Z] Parse single entry 80
+[2014-10-12T12:36:10.297Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.298Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.298Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.298Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.298Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.298Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.299Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.299Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.299Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.299Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.300Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.300Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.300Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.301Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.301Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.301Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.301Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.302Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.302Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.302Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.302Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.302Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.303Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.303Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.303Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.303Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.303Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.303Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.305Z] Parse single entry 80
+[2014-10-12T12:36:10.308Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.308Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.308Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.308Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.308Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.309Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.310Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.310Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.310Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.310Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.311Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.311Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.311Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.312Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.312Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.312Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.314Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.314Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.318Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.318Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.321Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.321Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.321Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.321Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.321Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.321Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.322Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.322Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.322Z] ENTRY test.log
+[2014-10-12T12:36:10.323Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.323Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.323Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.323Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.323Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.323Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.323Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.323Z] ENTRY test.log
+[2014-10-12T12:36:10.323Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.324Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.329Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.330Z] Parse single entry 80
+[2014-10-12T12:36:10.331Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.332Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.332Z] Parse single entry 80
+[2014-10-12T12:36:10.332Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.333Z] ENTRY test.log
+[2014-10-12T12:36:10.334Z] ENTRY test.log
+[2014-10-12T12:36:10.335Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.335Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.335Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.335Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.335Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.335Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.336Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.336Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.340Z] Parse single entry 80
+[2014-10-12T12:36:10.340Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.341Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.343Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.343Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.344Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.344Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.344Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.344Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.344Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.345Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.346Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.346Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.349Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.350Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.351Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.351Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.351Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.351Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.352Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.352Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.352Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.352Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.353Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.353Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.353Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.353Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.353Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.353Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.353Z] [1] Listening on port: port 4080
+[2014-10-12T12:36:10.354Z] [1] Listening on port: port 40443
+[2014-10-12T12:36:10.354Z] [1] Start successful
+[2014-10-12T12:36:10.355Z] Parse single entry 80
+[2014-10-12T12:36:10.355Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.355Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.356Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.356Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.356Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.356Z] [3] Listening on port: port 4080
+[2014-10-12T12:36:10.356Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.357Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.357Z] Parse single entry 80
+[2014-10-12T12:36:10.357Z] Parse single entry 80
+[2014-10-12T12:36:10.358Z] [3] Listening on port: port 40443
+[2014-10-12T12:36:10.358Z] [3] Start successful
+[2014-10-12T12:36:10.359Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.363Z] [7] Listening on port: port 4080
+[2014-10-12T12:36:10.364Z] [7] Listening on port: port 40443
+[2014-10-12T12:36:10.364Z] [7] Start successful
+[2014-10-12T12:36:10.368Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.368Z] ENTRY test.log
+[2014-10-12T12:36:10.368Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.368Z] [2] Listening on port: port 4080
+[2014-10-12T12:36:10.369Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.369Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.369Z] Parse single entry 80
+[2014-10-12T12:36:10.369Z] ENTRY test.log
+[2014-10-12T12:36:10.369Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.369Z] [2] Listening on port: port 40443
+[2014-10-12T12:36:10.369Z] [2] Start successful
+[2014-10-12T12:36:10.370Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.370Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.370Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.370Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.371Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.371Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.371Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.372Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.372Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.372Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.373Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.373Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.373Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.373Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.374Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.374Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.374Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.374Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.374Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.378Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.381Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:10.382Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:10.382Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.382Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:10.383Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:10.383Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.383Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:10.384Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:10.384Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:10.384Z] ENTRY test.log
+[2014-10-12T12:36:10.384Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:10.385Z] Parse single entry 80
+[2014-10-12T12:36:10.385Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:10.385Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:10.385Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.385Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:10.386Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.386Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.386Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:10.386Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:10.386Z] Parse single entry 80
+[2014-10-12T12:36:10.386Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:10.387Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:10.388Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:10.388Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:10.388Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:10.389Z] Parse single entry log -> test.log
+[2014-10-12T12:36:10.395Z] Parse single entry 80
+[2014-10-12T12:36:10.397Z] ENTRY test.log
+[2014-10-12T12:36:10.398Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:10.399Z] [4] Listening on port: port 4080
+[2014-10-12T12:36:10.400Z] [4] Listening on port: port 40443
+[2014-10-12T12:36:10.400Z] [4] Start successful
+[2014-10-12T12:36:10.401Z] [5] Listening on port: port 4080
+[2014-10-12T12:36:10.401Z] [5] Listening on port: port 40443
+[2014-10-12T12:36:10.401Z] [5] Start successful
+[2014-10-12T12:36:10.404Z] [8] Listening on port: port 4080
+[2014-10-12T12:36:10.405Z] [8] Listening on port: port 40443
+[2014-10-12T12:36:10.405Z] [8] Start successful
+[2014-10-12T12:36:10.408Z] Parse single entry 80
+[2014-10-12T12:36:10.416Z] [6] Listening on port: port 4080
+[2014-10-12T12:36:10.417Z] [6] Listening on port: port 40443
+[2014-10-12T12:36:10.417Z] [6] Start successful
+[2014-10-12T12:36:10.417Z] All workers started in 285ms
+[2014-10-12T12:36:35.499Z] Parse single entry 80
+[2014-10-12T12:36:35.507Z] Parse single entry 80
+[2014-10-12T12:36:35.509Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.510Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.511Z] Parse single entry 80
+[2014-10-12T12:36:35.511Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.511Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.513Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.513Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.513Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.513Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.514Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.515Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.516Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.516Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.516Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.517Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.517Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.517Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.517Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.518Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.518Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.519Z] Parse single entry 80
+[2014-10-12T12:36:35.519Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.519Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.519Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.524Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.524Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.526Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.526Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.526Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.526Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.527Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.528Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.528Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.528Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.528Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.528Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.528Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.529Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.530Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.530Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.530Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.530Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.531Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.531Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.531Z] ENTRY test.log
+[2014-10-12T12:36:35.532Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.532Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.532Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.533Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.533Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.533Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.533Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.534Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.534Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.534Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.534Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.534Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.534Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.535Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.535Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.535Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.535Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.535Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.537Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.537Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.537Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.539Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.540Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.541Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.541Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.541Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.541Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.541Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.541Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.541Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.541Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.542Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.542Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.542Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.542Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.542Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.542Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.543Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.543Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.545Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.546Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.547Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.547Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.547Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.547Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.548Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.548Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.548Z] Parse single entry 80
+[2014-10-12T12:36:35.552Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.552Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.552Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.552Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.552Z] Parse single entry 80
+[2014-10-12T12:36:35.552Z] Parse single entry 80
+[2014-10-12T12:36:35.553Z] ENTRY test.log
+[2014-10-12T12:36:35.553Z] ENTRY test.log
+[2014-10-12T12:36:35.554Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.554Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.555Z] Parse single entry 80
+[2014-10-12T12:36:35.563Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.563Z] ENTRY test.log
+[2014-10-12T12:36:35.564Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.564Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.565Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.565Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.565Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.566Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.566Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.567Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.567Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.567Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.568Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.568Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.568Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.568Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.568Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.569Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.569Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.569Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.570Z] Parse single entry 80
+[2014-10-12T12:36:35.570Z] [1] Listening on port: port 4080
+[2014-10-12T12:36:35.571Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.571Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.571Z] Parse single entry 80
+[2014-10-12T12:36:35.572Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.573Z] [1] Listening on port: port 40443
+[2014-10-12T12:36:35.573Z] [1] Start successful
+[2014-10-12T12:36:35.574Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.574Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.574Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.574Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.575Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.575Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.575Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.575Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.575Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.575Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.575Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.576Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.576Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.576Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.576Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.576Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.576Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.577Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.577Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.577Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.577Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.578Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.578Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.578Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.579Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.580Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.581Z] Parse single entry 80
+[2014-10-12T12:36:35.582Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.582Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.582Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.583Z] Parse single entry 80
+[2014-10-12T12:36:35.584Z] [4] Listening on port: port 4080
+[2014-10-12T12:36:35.586Z] [4] Listening on port: port 40443
+[2014-10-12T12:36:35.586Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.586Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.586Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.586Z] [4] Start successful
+[2014-10-12T12:36:35.586Z] ENTRY test.log
+[2014-10-12T12:36:35.587Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.587Z] [5] Listening on port: port 4080
+[2014-10-12T12:36:35.587Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.588Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.588Z] [5] Listening on port: port 40443
+[2014-10-12T12:36:35.588Z] [5] Start successful
+[2014-10-12T12:36:35.589Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.589Z] ENTRY test.log
+[2014-10-12T12:36:35.589Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.590Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.590Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.591Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.591Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.591Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.592Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.592Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.592Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.592Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.593Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.593Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.594Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.596Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.599Z] [3] Listening on port: port 4080
+[2014-10-12T12:36:35.600Z] Parse single entry localhost:80/[rest]
+[2014-10-12T12:36:35.600Z] [3] Listening on port: port 40443
+[2014-10-12T12:36:35.600Z] [3] Start successful
+[2014-10-12T12:36:35.601Z] Parse single entry 80
+[2014-10-12T12:36:35.602Z] Parse single entry localhost:81/[rest]
+[2014-10-12T12:36:35.602Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.602Z] Parse single entry 127.0.0.1:3000
+[2014-10-12T12:36:35.603Z] Parse single entry 127.0.0.1:3001
+[2014-10-12T12:36:35.604Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.604Z] Parse single entry 127.0.0.1:3002
+[2014-10-12T12:36:35.604Z] Parse single entry 127.0.0.1:3010
+[2014-10-12T12:36:35.604Z] Parse single entry 127.0.0.1:3009
+[2014-10-12T12:36:35.606Z] ENTRY test.log
+[2014-10-12T12:36:35.606Z] Parse single entry 80
+[2014-10-12T12:36:35.606Z] Parse single entry 127.0.0.1:6060
+[2014-10-12T12:36:35.606Z] Parse single entry 127.0.0.1:7080
+[2014-10-12T12:36:35.606Z] Parse single entry 127.0.0.1:8099
+[2014-10-12T12:36:35.607Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.607Z] Parse single entry 127.0.0.1:10000
+[2014-10-12T12:36:35.607Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.607Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.608Z] Parse single entry 127.0.0.1:8091
+[2014-10-12T12:36:35.608Z] Parse single entry 127.0.0.1:8092
+[2014-10-12T12:36:35.608Z] Parse single entry 127.0.0.1:12000
+[2014-10-12T12:36:35.608Z] Parse single entry 127.0.0.1:12001
+[2014-10-12T12:36:35.609Z] Parse single entry 127.0.0.1:8095
+[2014-10-12T12:36:35.609Z] Parse single entry 127.0.0.1:8096
+[2014-10-12T12:36:35.609Z] Parse single entry 4000/test/[path]
+[2014-10-12T12:36:35.611Z] Parse single entry log -> test.log
+[2014-10-12T12:36:35.613Z] [8] Listening on port: port 4080
+[2014-10-12T12:36:35.614Z] [8] Listening on port: port 40443
+[2014-10-12T12:36:35.615Z] [8] Start successful
+[2014-10-12T12:36:35.615Z] [6] Listening on port: port 4080
+[2014-10-12T12:36:35.616Z] [6] Listening on port: port 40443
+[2014-10-12T12:36:35.616Z] [6] Start successful
+[2014-10-12T12:36:35.617Z] Parse single entry 80
+[2014-10-12T12:36:35.619Z] ENTRY test.log
+[2014-10-12T12:36:35.619Z] Parse single entry websockify -> 22
+[2014-10-12T12:36:35.625Z] [2] Listening on port: port 4080
+[2014-10-12T12:36:35.626Z] [2] Listening on port: port 40443
+[2014-10-12T12:36:35.626Z] [2] Start successful
+[2014-10-12T12:36:35.629Z] Parse single entry 80
+[2014-10-12T12:36:35.637Z] [7] Listening on port: port 4080
+[2014-10-12T12:36:35.638Z] [7] Listening on port: port 40443
+[2014-10-12T12:36:35.638Z] [7] Start successful
+[2014-10-12T12:36:35.638Z] All workers started in 292ms
+[2014-10-12T12:37:28.206Z] ENTRY test.log
+[2014-10-12T12:37:28.207Z] ENTRY test.log
+[2014-10-12T12:37:28.211Z] ENTRY test.log
+[2014-10-12T12:37:28.219Z] ENTRY test.log
+[2014-10-12T12:37:28.232Z] ENTRY test.log
+[2014-10-12T12:37:28.237Z] [1] Listening on port: port 4080
+[2014-10-12T12:37:28.238Z] [1] Listening on port: port 40443
+[2014-10-12T12:37:28.238Z] [1] Start successful
+[2014-10-12T12:37:28.243Z] [5] Listening on port: port 4080
+[2014-10-12T12:37:28.244Z] [5] Listening on port: port 40443
+[2014-10-12T12:37:28.244Z] [5] Start successful
+[2014-10-12T12:37:28.247Z] [2] Listening on port: port 4080
+[2014-10-12T12:37:28.248Z] [2] Listening on port: port 40443
+[2014-10-12T12:37:28.248Z] [2] Start successful
+[2014-10-12T12:37:28.250Z] [4] Listening on port: port 4080
+[2014-10-12T12:37:28.251Z] [4] Listening on port: port 40443
+[2014-10-12T12:37:28.251Z] [4] Start successful
+[2014-10-12T12:37:28.256Z] ENTRY test.log
+[2014-10-12T12:37:28.258Z] [3] Listening on port: port 4080
+[2014-10-12T12:37:28.259Z] [3] Listening on port: port 40443
+[2014-10-12T12:37:28.259Z] [3] Start successful
+[2014-10-12T12:37:28.262Z] ENTRY test.log
+[2014-10-12T12:37:28.275Z] [8] Listening on port: port 4080
+[2014-10-12T12:37:28.276Z] [8] Listening on port: port 40443
+[2014-10-12T12:37:28.276Z] [8] Start successful
+[2014-10-12T12:37:28.283Z] ENTRY test.log
+[2014-10-12T12:37:28.288Z] [6] Listening on port: port 4080
+[2014-10-12T12:37:28.288Z] [6] Listening on port: port 40443
+[2014-10-12T12:37:28.289Z] [6] Start successful
+[2014-10-12T12:37:28.302Z] [7] Listening on port: port 4080
+[2014-10-12T12:37:28.303Z] [7] Listening on port: port 40443
+[2014-10-12T12:37:28.303Z] [7] Start successful
+[2014-10-12T12:37:28.303Z] All workers started in 286ms
+[2014-10-12T12:38:48.609Z] ENTRY 80
+[2014-10-12T12:38:48.614Z] ENTRY 80
+[2014-10-12T12:38:48.617Z] ENTRY 80
+[2014-10-12T12:38:48.625Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.626Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.626Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.626Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.627Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.628Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.628Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.628Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.628Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.628Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.629Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.629Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.630Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.630Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.630Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.631Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.631Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.632Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.632Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.632Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.633Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.633Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.633Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.634Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.635Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.635Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.635Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.635Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.635Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.635Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.635Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.636Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.636Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.636Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.636Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.636Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.636Z] ENTRY 80
+[2014-10-12T12:38:48.637Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.637Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.637Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.637Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.637Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.637Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.637Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.638Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.638Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.638Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.638Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.639Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.639Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.639Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.640Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.640Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.640Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.646Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.649Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.649Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.649Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.650Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.651Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.651Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.651Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.656Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.657Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.657Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.657Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.657Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.657Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.658Z] ENTRY 80
+[2014-10-12T12:38:48.658Z] ENTRY test.log
+[2014-10-12T12:38:48.658Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.658Z] ENTRY test.log
+[2014-10-12T12:38:48.658Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.658Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.659Z] ENTRY 80
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.659Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.659Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.659Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.662Z] ENTRY 80
+[2014-10-12T12:38:48.669Z] ENTRY 80
+[2014-10-12T12:38:48.669Z] ENTRY 80
+[2014-10-12T12:38:48.671Z] ENTRY test.log
+[2014-10-12T12:38:48.671Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.672Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.673Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.673Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.673Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.674Z] ENTRY 80
+[2014-10-12T12:38:48.676Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.676Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.677Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.679Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.680Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.680Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.680Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.680Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.680Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.680Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.680Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.681Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.681Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.681Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.681Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.681Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.682Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.682Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.683Z] ENTRY test.log
+[2014-10-12T12:38:48.683Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.683Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.683Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.686Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.687Z] [3] Listening on port: port 4080
+[2014-10-12T12:38:48.688Z] [3] Listening on port: port 40443
+[2014-10-12T12:38:48.688Z] [3] Start successful
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.690Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.691Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.691Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.691Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.691Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.691Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.691Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.691Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.691Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.692Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.692Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.692Z] [1] Listening on port: port 4080
+[2014-10-12T12:38:48.692Z] [1] Listening on port: port 40443
+[2014-10-12T12:38:48.692Z] [1] Start successful
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.692Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.694Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.694Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.695Z] ENTRY 80
+[2014-10-12T12:38:48.695Z] ENTRY localhost:80/[rest]
+[2014-10-12T12:38:48.695Z] ENTRY localhost:81/[rest]
+[2014-10-12T12:38:48.696Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.696Z] ENTRY 127.0.0.1:3000
+[2014-10-12T12:38:48.698Z] ENTRY 127.0.0.1:3001
+[2014-10-12T12:38:48.698Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.698Z] ENTRY 127.0.0.1:3002
+[2014-10-12T12:38:48.698Z] ENTRY 127.0.0.1:3010
+[2014-10-12T12:38:48.699Z] ENTRY 127.0.0.1:3009
+[2014-10-12T12:38:48.699Z] ENTRY 80
+[2014-10-12T12:38:48.701Z] ENTRY test.log
+[2014-10-12T12:38:48.701Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.701Z] ENTRY 127.0.0.1:6060
+[2014-10-12T12:38:48.701Z] ENTRY 127.0.0.1:7080
+[2014-10-12T12:38:48.701Z] ENTRY 127.0.0.1:8099
+[2014-10-12T12:38:48.702Z] [8] Listening on port: port 4080
+[2014-10-12T12:38:48.703Z] ENTRY 127.0.0.1:10000
+[2014-10-12T12:38:48.703Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.703Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.703Z] ENTRY 127.0.0.1:8091
+[2014-10-12T12:38:48.703Z] ENTRY 127.0.0.1:8092
+[2014-10-12T12:38:48.703Z] ENTRY test.log
+[2014-10-12T12:38:48.703Z] [8] Listening on port: port 40443
+[2014-10-12T12:38:48.703Z] [8] Start successful
+[2014-10-12T12:38:48.703Z] ENTRY test.log
+[2014-10-12T12:38:48.704Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.704Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.704Z] ENTRY 127.0.0.1:12000
+[2014-10-12T12:38:48.704Z] ENTRY 127.0.0.1:12001
+[2014-10-12T12:38:48.705Z] ENTRY 127.0.0.1:8095
+[2014-10-12T12:38:48.705Z] ENTRY 127.0.0.1:8096
+[2014-10-12T12:38:48.705Z] ENTRY 4000/test/[path]
+[2014-10-12T12:38:48.710Z] [4] Listening on port: port 4080
+[2014-10-12T12:38:48.712Z] [4] Listening on port: port 40443
+[2014-10-12T12:38:48.712Z] [4] Start successful
+[2014-10-12T12:38:48.717Z] ENTRY 80
+[2014-10-12T12:38:48.717Z] ENTRY test.log
+[2014-10-12T12:38:48.718Z] ENTRY 80
+[2014-10-12T12:38:48.719Z] ENTRY websockify -> 22
+[2014-10-12T12:38:48.719Z] ENTRY 80
+[2014-10-12T12:38:48.726Z] [6] Listening on port: port 4080
+[2014-10-12T12:38:48.727Z] [6] Listening on port: port 40443
+[2014-10-12T12:38:48.727Z] [6] Start successful
+[2014-10-12T12:38:48.727Z] [2] Listening on port: port 4080
+[2014-10-12T12:38:48.728Z] [2] Listening on port: port 40443
+[2014-10-12T12:38:48.728Z] [2] Start successful
+[2014-10-12T12:38:48.731Z] [7] Listening on port: port 4080
+[2014-10-12T12:38:48.732Z] ENTRY 80
+[2014-10-12T12:38:48.732Z] [7] Listening on port: port 40443
+[2014-10-12T12:38:48.732Z] [7] Start successful
+[2014-10-12T12:38:48.740Z] [5] Listening on port: port 4080
+[2014-10-12T12:38:48.741Z] [5] Listening on port: port 40443
+[2014-10-12T12:38:48.741Z] [5] Start successful
+[2014-10-12T12:38:48.741Z] All workers started in 286ms
+[2014-10-12T12:40:58.171Z] ENTRY test.log
+[2014-10-12T12:40:58.175Z] ENTRY test.log
+[2014-10-12T12:40:58.194Z] ENTRY test.log
+[2014-10-12T12:40:58.203Z] [2] Listening on port: port 4080
+[2014-10-12T12:40:58.204Z] [2] Listening on port: port 40443
+[2014-10-12T12:40:58.204Z] [2] Start successful
+[2014-10-12T12:40:58.207Z] [3] Listening on port: port 4080
+[2014-10-12T12:40:58.208Z] [3] Listening on port: port 40443
+[2014-10-12T12:40:58.209Z] [3] Start successful
+[2014-10-12T12:40:58.211Z] ENTRY test.log
+[2014-10-12T12:40:58.214Z] ENTRY test.log
+[2014-10-12T12:40:58.217Z] ENTRY test.log
+[2014-10-12T12:40:58.223Z] ENTRY test.log
+[2014-10-12T12:40:58.226Z] [4] Listening on port: port 4080
+[2014-10-12T12:40:58.227Z] [4] Listening on port: port 40443
+[2014-10-12T12:40:58.227Z] [4] Start successful
+[2014-10-12T12:40:58.231Z] ENTRY test.log
+[2014-10-12T12:40:58.234Z] [1] Listening on port: port 4080
+[2014-10-12T12:40:58.235Z] [1] Listening on port: port 40443
+[2014-10-12T12:40:58.236Z] [1] Start successful
+[2014-10-12T12:40:58.244Z] [8] Listening on port: port 4080
+[2014-10-12T12:40:58.245Z] [8] Listening on port: port 40443
+[2014-10-12T12:40:58.245Z] [8] Start successful
+[2014-10-12T12:40:58.247Z] [7] Listening on port: port 4080
+[2014-10-12T12:40:58.247Z] [5] Listening on port: port 4080
+[2014-10-12T12:40:58.248Z] [5] Listening on port: port 40443
+[2014-10-12T12:40:58.248Z] [5] Start successful
+[2014-10-12T12:40:58.248Z] [7] Listening on port: port 40443
+[2014-10-12T12:40:58.248Z] [7] Start successful
+[2014-10-12T12:40:58.253Z] [6] Listening on port: port 4080
+[2014-10-12T12:40:58.254Z] [6] Listening on port: port 40443
+[2014-10-12T12:40:58.254Z] [6] Start successful
+[2014-10-12T12:40:58.254Z] All workers started in 273ms
+[2014-10-12T12:40:59.316Z] ENTRY test.log
+[2014-10-12T12:40:59.332Z] ENTRY test.log
+[2014-10-12T12:40:59.333Z] ENTRY test.log
+[2014-10-12T12:40:59.348Z] [1] Listening on port: port 4080
+[2014-10-12T12:40:59.349Z] [1] Listening on port: port 40443
+[2014-10-12T12:40:59.349Z] [1] Start successful
+[2014-10-12T12:40:59.350Z] ENTRY test.log
+[2014-10-12T12:40:59.355Z] ENTRY test.log
+[2014-10-12T12:40:59.358Z] ENTRY test.log
+[2014-10-12T12:40:59.359Z] ENTRY test.log
+[2014-10-12T12:40:59.367Z] [3] Listening on port: port 4080
+[2014-10-12T12:40:59.368Z] [3] Listening on port: port 40443
+[2014-10-12T12:40:59.368Z] [3] Start successful
+[2014-10-12T12:40:59.370Z] [2] Listening on port: port 4080
+[2014-10-12T12:40:59.371Z] [2] Listening on port: port 40443
+[2014-10-12T12:40:59.372Z] [2] Start successful
+[2014-10-12T12:40:59.380Z] ENTRY test.log
+[2014-10-12T12:40:59.381Z] [8] Listening on port: port 4080
+[2014-10-12T12:40:59.381Z] [4] Listening on port: port 4080
+[2014-10-12T12:40:59.382Z] [8] Listening on port: port 40443
+[2014-10-12T12:40:59.382Z] [8] Start successful
+[2014-10-12T12:40:59.382Z] [4] Listening on port: port 40443
+[2014-10-12T12:40:59.382Z] [4] Start successful
+[2014-10-12T12:40:59.389Z] [5] Listening on port: port 4080
+[2014-10-12T12:40:59.390Z] [6] Listening on port: port 4080
+[2014-10-12T12:40:59.390Z] [5] Listening on port: port 40443
+[2014-10-12T12:40:59.390Z] [5] Start successful
+[2014-10-12T12:40:59.391Z] [6] Listening on port: port 40443
+[2014-10-12T12:40:59.391Z] [6] Start successful
+[2014-10-12T12:40:59.401Z] [7] Listening on port: port 4080
+[2014-10-12T12:40:59.402Z] [7] Listening on port: port 40443
+[2014-10-12T12:40:59.402Z] [7] Start successful
+[2014-10-12T12:40:59.402Z] All workers started in 271ms
+[2014-10-12T12:41:20.783Z] ENTRY test.log
+[2014-10-12T12:41:20.797Z] ENTRY test.log
+[2014-10-12T12:41:20.806Z] ENTRY test.log
+[2014-10-12T12:41:20.815Z] [1] Listening on port: port 4080
+[2014-10-12T12:41:20.816Z] [1] Listening on port: port 40443
+[2014-10-12T12:41:20.816Z] [1] Start successful
+[2014-10-12T12:41:20.819Z] ENTRY test.log
+[2014-10-12T12:41:20.821Z] ENTRY test.log
+[2014-10-12T12:41:20.829Z] ENTRY test.log
+[2014-10-12T12:41:20.829Z] [3] Listening on port: port 4080
+[2014-10-12T12:41:20.831Z] [3] Listening on port: port 40443
+[2014-10-12T12:41:20.831Z] [3] Start successful
+[2014-10-12T12:41:20.835Z] ENTRY test.log
+[2014-10-12T12:41:20.837Z] [4] Listening on port: port 4080
+[2014-10-12T12:41:20.839Z] [4] Listening on port: port 40443
+[2014-10-12T12:41:20.839Z] [4] Start successful
+[2014-10-12T12:41:20.851Z] [7] Listening on port: port 4080
+[2014-10-12T12:41:20.851Z] [7] Listening on port: port 40443
+[2014-10-12T12:41:20.851Z] [7] Start successful
+[2014-10-12T12:41:20.853Z] [2] Listening on port: port 4080
+[2014-10-12T12:41:20.854Z] [2] Listening on port: port 40443
+[2014-10-12T12:41:20.854Z] [2] Start successful
+[2014-10-12T12:41:20.856Z] ENTRY test.log
+[2014-10-12T12:41:20.858Z] [8] Listening on port: port 4080
+[2014-10-12T12:41:20.858Z] [6] Listening on port: port 4080
+[2014-10-12T12:41:20.858Z] [8] Listening on port: port 40443
+[2014-10-12T12:41:20.859Z] [8] Start successful
+[2014-10-12T12:41:20.859Z] [6] Listening on port: port 40443
+[2014-10-12T12:41:20.859Z] [6] Start successful
+[2014-10-12T12:41:20.876Z] [5] Listening on port: port 4080
+[2014-10-12T12:41:20.876Z] [5] Listening on port: port 40443
+[2014-10-12T12:41:20.877Z] [5] Start successful
+[2014-10-12T12:41:20.877Z] All workers started in 277ms
+[2014-10-12T12:41:25.028Z] Request handler
+[2014-10-12T12:41:25.350Z] Request handler
+[2014-10-12T12:41:25.976Z] Request handler
+[2014-10-12T12:41:26.077Z] Request handler
+[2014-10-12T12:41:27.067Z] Request handler
+[2014-10-12T12:41:27.158Z] Request handler
+[2014-10-12T12:41:27.694Z] Request handler
+[2014-10-12T12:41:27.776Z] Request handler
+[2014-10-12T12:41:28.209Z] Request handler
+[2014-10-12T12:41:28.296Z] Request handler
+[2014-10-12T12:41:29.161Z] Request handler
+[2014-10-12T12:41:29.245Z] Request handler
+[2014-10-12T12:41:29.640Z] Request handler
+[2014-10-12T12:41:29.726Z] Request handler
+[2014-10-12T12:41:30.144Z] Request handler
+[2014-10-12T12:41:30.229Z] Request handler
+[2014-10-12T12:41:30.736Z] Request handler
+[2014-10-12T12:41:30.819Z] Request handler
+[2014-10-12T12:41:31.946Z] Request handler
+[2014-10-12T12:41:32.035Z] Request handler
+[2014-10-12T12:41:32.336Z] Request handler
+[2014-10-12T12:41:32.424Z] Request handler
+[2014-10-12T12:41:32.584Z] Request handler
+[2014-10-12T12:41:32.667Z] Request handler
+[2014-10-12T12:41:32.800Z] Request handler
+[2014-10-12T12:41:32.888Z] Request handler
+[2014-10-12T12:41:33.049Z] Request handler
+[2014-10-12T12:41:33.134Z] Request handler
+[2014-10-12T12:41:33.136Z] Request handler
+[2014-10-12T12:41:33.234Z] Request handler
+[2014-10-12T12:41:33.235Z] Request handler
+[2014-10-12T12:41:33.335Z] Request handler
+[2014-10-12T12:41:33.337Z] Request handler
+[2014-10-12T12:41:33.446Z] Request handler
+[2014-10-12T12:41:33.447Z] Request handler
+[2014-10-12T12:41:33.548Z] Request handler
+[2014-10-12T12:41:41.498Z] Request handler
+[2014-10-12T12:41:41.583Z] Request handler
+[2014-10-12T12:41:44.003Z] ENTRY test.log
+[2014-10-12T12:41:44.005Z] ENTRY test.log
+[2014-10-12T12:41:44.007Z] ENTRY test.log
+[2014-10-12T12:41:44.019Z] ENTRY test.log
+[2014-10-12T12:41:44.023Z] ENTRY test.log
+[2014-10-12T12:41:44.034Z] [1] Listening on port: port 4080
+[2014-10-12T12:41:44.035Z] [1] Listening on port: port 40443
+[2014-10-12T12:41:44.035Z] [1] Start successful
+[2014-10-12T12:41:44.038Z] [3] Listening on port: port 4080
+[2014-10-12T12:41:44.038Z] [2] Listening on port: port 4080
+[2014-10-12T12:41:44.039Z] [3] Listening on port: port 40443
+[2014-10-12T12:41:44.039Z] [2] Listening on port: port 40443
+[2014-10-12T12:41:44.039Z] [3] Start successful
+[2014-10-12T12:41:44.039Z] [2] Start successful
+[2014-10-12T12:41:44.048Z] ENTRY test.log
+[2014-10-12T12:41:44.050Z] ENTRY test.log
+[2014-10-12T12:41:44.051Z] [5] Listening on port: port 4080
+[2014-10-12T12:41:44.052Z] ENTRY test.log
+[2014-10-12T12:41:44.052Z] [5] Listening on port: port 40443
+[2014-10-12T12:41:44.052Z] [5] Start successful
+[2014-10-12T12:41:44.055Z] [4] Listening on port: port 4080
+[2014-10-12T12:41:44.055Z] [4] Listening on port: port 40443
+[2014-10-12T12:41:44.055Z] [4] Start successful
+[2014-10-12T12:41:44.071Z] [7] Listening on port: port 4080
+[2014-10-12T12:41:44.071Z] [8] Listening on port: port 4080
+[2014-10-12T12:41:44.071Z] [6] Listening on port: port 4080
+[2014-10-12T12:41:44.072Z] [7] Listening on port: port 40443
+[2014-10-12T12:41:44.072Z] [7] Start successful
+[2014-10-12T12:41:44.072Z] [6] Listening on port: port 40443
+[2014-10-12T12:41:44.072Z] [6] Start successful
+[2014-10-12T12:41:44.072Z] [8] Listening on port: port 40443
+[2014-10-12T12:41:44.072Z] [8] Start successful
+[2014-10-12T12:41:44.073Z] All workers started in 251ms
+[2014-10-12T12:41:44.846Z] Request handler [object Object]
+[2014-10-12T12:41:44.943Z] Request handler [object Object]
+[2014-10-12T12:41:45.497Z] Request handler [object Object]
+[2014-10-12T12:41:45.580Z] Request handler [object Object]
+[2014-10-12T12:41:58.971Z] ENTRY test.log
+[2014-10-12T12:41:58.972Z] ENTRY test.log
+[2014-10-12T12:41:58.973Z] ENTRY test.log
+[2014-10-12T12:41:58.974Z] ENTRY test.log
+[2014-10-12T12:41:58.974Z] ENTRY test.log
+[2014-10-12T12:41:58.979Z] ENTRY test.log
+[2014-10-12T12:41:59.000Z] ENTRY test.log
+[2014-10-12T12:41:59.003Z] [5] Listening on port: port 4080
+[2014-10-12T12:41:59.003Z] [2] Listening on port: port 4080
+[2014-10-12T12:41:59.004Z] [3] Listening on port: port 4080
+[2014-10-12T12:41:59.004Z] [5] Listening on port: port 40443
+[2014-10-12T12:41:59.004Z] [5] Start successful
+[2014-10-12T12:41:59.004Z] [2] Listening on port: port 40443
+[2014-10-12T12:41:59.005Z] [2] Start successful
+[2014-10-12T12:41:59.006Z] [3] Listening on port: port 40443
+[2014-10-12T12:41:59.006Z] [3] Start successful
+[2014-10-12T12:41:59.007Z] [1] Listening on port: port 4080
+[2014-10-12T12:41:59.008Z] [4] Listening on port: port 4080
+[2014-10-12T12:41:59.009Z] [1] Listening on port: port 40443
+[2014-10-12T12:41:59.009Z] [4] Listening on port: port 40443
+[2014-10-12T12:41:59.009Z] [4] Start successful
+[2014-10-12T12:41:59.010Z] [1] Start successful
+[2014-10-12T12:41:59.012Z] [6] Listening on port: port 4080
+[2014-10-12T12:41:59.012Z] [6] Listening on port: port 40443
+[2014-10-12T12:41:59.012Z] [6] Start successful
+[2014-10-12T12:41:59.017Z] ENTRY test.log
+[2014-10-12T12:41:59.024Z] [7] Listening on port: port 4080
+[2014-10-12T12:41:59.024Z] [7] Listening on port: port 40443
+[2014-10-12T12:41:59.024Z] [7] Start successful
+[2014-10-12T12:41:59.035Z] [8] Listening on port: port 4080
+[2014-10-12T12:41:59.036Z] [8] Listening on port: port 40443
+[2014-10-12T12:41:59.036Z] [8] Start successful
+[2014-10-12T12:41:59.036Z] All workers started in 258ms
+[2014-10-12T12:41:59.855Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:41:59.986Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:42:57.338Z] ENTRY test.log
+[2014-10-12T12:42:57.340Z] ENTRY test.log
+[2014-10-12T12:42:57.344Z] ENTRY test.log
+[2014-10-12T12:42:57.345Z] ENTRY test.log
+[2014-10-12T12:42:57.347Z] ENTRY test.log
+[2014-10-12T12:42:57.352Z] ENTRY test.log
+[2014-10-12T12:42:57.358Z] ENTRY test.log
+[2014-10-12T12:42:57.371Z] [2] Listening on port: port 4080
+[2014-10-12T12:42:57.371Z] [2] Listening on port: port 40443
+[2014-10-12T12:42:57.372Z] [2] Start successful
+[2014-10-12T12:42:57.373Z] [3] Listening on port: port 4080
+[2014-10-12T12:42:57.374Z] [3] Listening on port: port 40443
+[2014-10-12T12:42:57.374Z] [3] Start successful
+[2014-10-12T12:42:57.374Z] ENTRY test.log
+[2014-10-12T12:42:57.376Z] [4] Listening on port: port 4080
+[2014-10-12T12:42:57.376Z] [1] Listening on port: port 4080
+[2014-10-12T12:42:57.376Z] [4] Listening on port: port 40443
+[2014-10-12T12:42:57.376Z] [4] Start successful
+[2014-10-12T12:42:57.377Z] [1] Listening on port: port 40443
+[2014-10-12T12:42:57.377Z] [1] Start successful
+[2014-10-12T12:42:57.379Z] [6] Listening on port: port 4080
+[2014-10-12T12:42:57.380Z] [6] Listening on port: port 40443
+[2014-10-12T12:42:57.380Z] [6] Start successful
+[2014-10-12T12:42:57.384Z] [5] Listening on port: port 4080
+[2014-10-12T12:42:57.384Z] [5] Listening on port: port 40443
+[2014-10-12T12:42:57.385Z] [5] Start successful
+[2014-10-12T12:42:57.387Z] [7] Listening on port: port 4080
+[2014-10-12T12:42:57.388Z] [7] Listening on port: port 40443
+[2014-10-12T12:42:57.388Z] [7] Start successful
+[2014-10-12T12:42:57.395Z] [8] Listening on port: port 4080
+[2014-10-12T12:42:57.396Z] [8] Listening on port: port 40443
+[2014-10-12T12:42:57.396Z] [8] Start successful
+[2014-10-12T12:42:57.397Z] All workers started in 246ms
+[2014-10-12T12:42:58.450Z] Request handler
+[2014-10-12T12:42:58.450Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:42:58.600Z] Request handler
+[2014-10-12T12:42:58.600Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:42:59.374Z] Request handler
+[2014-10-12T12:42:59.374Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:42:59.498Z] Request handler
+[2014-10-12T12:42:59.498Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:43:42.967Z] ENTRY test.log
+[2014-10-12T12:43:42.968Z] ENTRY test.log
+[2014-10-12T12:43:42.971Z] ENTRY test.log
+[2014-10-12T12:43:42.978Z] ENTRY test.log
+[2014-10-12T12:43:42.984Z] ENTRY test.log
+[2014-10-12T12:43:42.990Z] ENTRY test.log
+[2014-10-12T12:43:42.990Z] ENTRY test.log
+[2014-10-12T12:43:43.000Z] [3] Listening on port: port 4080
+[2014-10-12T12:43:43.001Z] [3] Listening on port: port 40443
+[2014-10-12T12:43:43.002Z] [3] Start successful
+[2014-10-12T12:43:43.002Z] [7] Listening on port: port 4080
+[2014-10-12T12:43:43.003Z] [7] Listening on port: port 40443
+[2014-10-12T12:43:43.003Z] [7] Start successful
+[2014-10-12T12:43:43.010Z] [5] Listening on port: port 4080
+[2014-10-12T12:43:43.010Z] ENTRY test.log
+[2014-10-12T12:43:43.011Z] [5] Listening on port: port 40443
+[2014-10-12T12:43:43.012Z] [5] Start successful
+[2014-10-12T12:43:43.014Z] [1] Listening on port: port 4080
+[2014-10-12T12:43:43.015Z] [1] Listening on port: port 40443
+[2014-10-12T12:43:43.016Z] [1] Start successful
+[2014-10-12T12:43:43.019Z] [8] Listening on port: port 4080
+[2014-10-12T12:43:43.020Z] [8] Listening on port: port 40443
+[2014-10-12T12:43:43.020Z] [8] Start successful
+[2014-10-12T12:43:43.024Z] [2] Listening on port: port 4080
+[2014-10-12T12:43:43.024Z] [6] Listening on port: port 4080
+[2014-10-12T12:43:43.024Z] [2] Listening on port: port 40443
+[2014-10-12T12:43:43.024Z] [2] Start successful
+[2014-10-12T12:43:43.025Z] [6] Listening on port: port 40443
+[2014-10-12T12:43:43.025Z] [6] Start successful
+[2014-10-12T12:43:43.033Z] [4] Listening on port: port 4080
+[2014-10-12T12:43:43.034Z] [4] Listening on port: port 40443
+[2014-10-12T12:43:43.034Z] [4] Start successful
+[2014-10-12T12:43:43.034Z] All workers started in 262ms
+[2014-10-12T12:43:43.681Z] Request handler undefined undefined
+[2014-10-12T12:43:43.681Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:43:43.814Z] Request handler undefined undefined
+[2014-10-12T12:43:43.814Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:44:07.693Z] ENTRY test.log
+[2014-10-12T12:44:07.694Z] ENTRY test.log
+[2014-10-12T12:44:07.703Z] ENTRY test.log
+[2014-10-12T12:44:07.705Z] ENTRY test.log
+[2014-10-12T12:44:07.706Z] ENTRY test.log
+[2014-10-12T12:44:07.711Z] ENTRY test.log
+[2014-10-12T12:44:07.719Z] ENTRY test.log
+[2014-10-12T12:44:07.726Z] [4] Listening on port: port 4080
+[2014-10-12T12:44:07.727Z] [4] Listening on port: port 40443
+[2014-10-12T12:44:07.727Z] [4] Start successful
+[2014-10-12T12:44:07.730Z] [2] Listening on port: port 4080
+[2014-10-12T12:44:07.731Z] [2] Listening on port: port 40443
+[2014-10-12T12:44:07.731Z] [2] Start successful
+[2014-10-12T12:44:07.732Z] [1] Listening on port: port 4080
+[2014-10-12T12:44:07.733Z] [1] Listening on port: port 40443
+[2014-10-12T12:44:07.733Z] [1] Start successful
+[2014-10-12T12:44:07.737Z] [5] Listening on port: port 4080
+[2014-10-12T12:44:07.737Z] ENTRY test.log
+[2014-10-12T12:44:07.737Z] [3] Listening on port: port 4080
+[2014-10-12T12:44:07.738Z] [5] Listening on port: port 40443
+[2014-10-12T12:44:07.738Z] [5] Start successful
+[2014-10-12T12:44:07.738Z] [3] Listening on port: port 40443
+[2014-10-12T12:44:07.739Z] [3] Start successful
+[2014-10-12T12:44:07.742Z] [6] Listening on port: port 4080
+[2014-10-12T12:44:07.743Z] [6] Listening on port: port 40443
+[2014-10-12T12:44:07.743Z] [6] Start successful
+[2014-10-12T12:44:07.745Z] [7] Listening on port: port 4080
+[2014-10-12T12:44:07.745Z] [7] Listening on port: port 40443
+[2014-10-12T12:44:07.745Z] [7] Start successful
+[2014-10-12T12:44:07.757Z] [8] Listening on port: port 4080
+[2014-10-12T12:44:07.757Z] [8] Listening on port: port 40443
+[2014-10-12T12:44:07.757Z] [8] Start successful
+[2014-10-12T12:44:07.758Z] All workers started in 251ms
+[2014-10-12T12:44:08.635Z] [object Object]
+[2014-10-12T12:44:08.636Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:44:08.741Z] [object Object]
+[2014-10-12T12:44:08.741Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:44:58.507Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.513Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.514Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.515Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.515Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.520Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.521Z] ENTRY test.log
+[2014-10-12T12:44:58.523Z] ENTRY test.log
+[2014-10-12T12:44:58.524Z] ENTRY test.log
+[2014-10-12T12:44:58.524Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.526Z] ENTRY test.log
+[2014-10-12T12:44:58.529Z] ENTRY test.log
+[2014-10-12T12:44:58.532Z] ENTRY test.log
+[2014-10-12T12:44:58.537Z] ENTRY test.log
+[2014-10-12T12:44:58.539Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.540Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.543Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.544Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.546Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.551Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.551Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.553Z] [1] Listening on port: port 4080
+[2014-10-12T12:44:58.554Z] [1] Listening on port: port 40443
+[2014-10-12T12:44:58.554Z] [1] Start successful
+[2014-10-12T12:44:58.555Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.556Z] [3] Listening on port: port 4080
+[2014-10-12T12:44:58.556Z] [3] Listening on port: port 40443
+[2014-10-12T12:44:58.557Z] [3] Start successful
+[2014-10-12T12:44:58.558Z] [2] Listening on port: port 4080
+[2014-10-12T12:44:58.559Z] [2] Listening on port: port 40443
+[2014-10-12T12:44:58.559Z] [2] Start successful
+[2014-10-12T12:44:58.559Z] [4] Listening on port: port 4080
+[2014-10-12T12:44:58.559Z] [5] Listening on port: port 4080
+[2014-10-12T12:44:58.560Z] [4] Listening on port: port 40443
+[2014-10-12T12:44:58.560Z] [4] Start successful
+[2014-10-12T12:44:58.560Z] [5] Listening on port: port 40443
+[2014-10-12T12:44:58.560Z] [5] Start successful
+[2014-10-12T12:44:58.563Z] ENTRY test.log
+[2014-10-12T12:44:58.564Z] [6] Listening on port: port 4080
+[2014-10-12T12:44:58.565Z] [6] Listening on port: port 40443
+[2014-10-12T12:44:58.566Z] [6] Start successful
+[2014-10-12T12:44:58.567Z] [7] Listening on port: port 4080
+[2014-10-12T12:44:58.568Z] [7] Listening on port: port 40443
+[2014-10-12T12:44:58.568Z] [7] Start successful
+[2014-10-12T12:44:58.573Z] RETURN HANDLER [object Object]
+[2014-10-12T12:44:58.581Z] [8] Listening on port: port 4080
+[2014-10-12T12:44:58.581Z] [8] Listening on port: port 40443
+[2014-10-12T12:44:58.581Z] [8] Start successful
+[2014-10-12T12:44:58.582Z] All workers started in 251ms
+[2014-10-12T12:44:59.494Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:44:59.596Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:45:02.706Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.716Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.717Z] ENTRY test.log
+[2014-10-12T12:45:02.721Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.726Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.726Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.728Z] ENTRY test.log
+[2014-10-12T12:45:02.734Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.735Z] ENTRY test.log
+[2014-10-12T12:45:02.735Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.736Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.738Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.740Z] ENTRY test.log
+[2014-10-12T12:45:02.740Z] ENTRY test.log
+[2014-10-12T12:45:02.746Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.748Z] [1] Listening on port: port 4080
+[2014-10-12T12:45:02.749Z] [1] Listening on port: port 40443
+[2014-10-12T12:45:02.749Z] [1] Start successful
+[2014-10-12T12:45:02.749Z] ENTRY test.log
+[2014-10-12T12:45:02.750Z] ENTRY test.log
+[2014-10-12T12:45:02.751Z] ENTRY test.log
+[2014-10-12T12:45:02.752Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.759Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.759Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.761Z] [3] Listening on port: port 4080
+[2014-10-12T12:45:02.762Z] [3] Listening on port: port 40443
+[2014-10-12T12:45:02.762Z] [3] Start successful
+[2014-10-12T12:45:02.763Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.765Z] [4] Listening on port: port 4080
+[2014-10-12T12:45:02.766Z] [4] Listening on port: port 40443
+[2014-10-12T12:45:02.766Z] [4] Start successful
+[2014-10-12T12:45:02.768Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.769Z] RETURN HANDLER [object Object]
+[2014-10-12T12:45:02.770Z] [2] Listening on port: port 4080
+[2014-10-12T12:45:02.771Z] [2] Listening on port: port 40443
+[2014-10-12T12:45:02.771Z] [2] Start successful
+[2014-10-12T12:45:02.772Z] [5] Listening on port: port 4080
+[2014-10-12T12:45:02.773Z] [5] Listening on port: port 40443
+[2014-10-12T12:45:02.774Z] [5] Start successful
+[2014-10-12T12:45:02.777Z] [8] Listening on port: port 4080
+[2014-10-12T12:45:02.778Z] [8] Listening on port: port 40443
+[2014-10-12T12:45:02.778Z] [8] Start successful
+[2014-10-12T12:45:02.779Z] [7] Listening on port: port 4080
+[2014-10-12T12:45:02.780Z] [7] Listening on port: port 40443
+[2014-10-12T12:45:02.780Z] [7] Start successful
+[2014-10-12T12:45:02.782Z] [6] Listening on port: port 4080
+[2014-10-12T12:45:02.782Z] [6] Listening on port: port 40443
+[2014-10-12T12:45:02.782Z] [6] Start successful
+[2014-10-12T12:45:02.783Z] All workers started in 247ms
+[2014-10-12T12:45:40.677Z] ENTRY test.log
+[2014-10-12T12:45:40.680Z] ENTRY test.log
+[2014-10-12T12:45:40.680Z] ENTRY test.log
+[2014-10-12T12:45:40.685Z] ENTRY test.log
+[2014-10-12T12:45:40.690Z] ENTRY test.log
+[2014-10-12T12:45:40.702Z] ENTRY test.log
+[2014-10-12T12:45:40.711Z] [4] Listening on port: port 4080
+[2014-10-12T12:45:40.711Z] [4] Listening on port: port 40443
+[2014-10-12T12:45:40.712Z] [4] Start successful
+[2014-10-12T12:45:40.712Z] [1] Listening on port: port 4080
+[2014-10-12T12:45:40.713Z] [1] Listening on port: port 40443
+[2014-10-12T12:45:40.713Z] [1] Start successful
+[2014-10-12T12:45:40.713Z] [2] Listening on port: port 4080
+[2014-10-12T12:45:40.714Z] [2] Listening on port: port 40443
+[2014-10-12T12:45:40.714Z] [2] Start successful
+[2014-10-12T12:45:40.717Z] [3] Listening on port: port 4080
+[2014-10-12T12:45:40.718Z] [3] Listening on port: port 40443
+[2014-10-12T12:45:40.718Z] [3] Start successful
+[2014-10-12T12:45:40.719Z] [6] Listening on port: port 4080
+[2014-10-12T12:45:40.720Z] [6] Listening on port: port 40443
+[2014-10-12T12:45:40.721Z] [6] Start successful
+[2014-10-12T12:45:40.726Z] ENTRY test.log
+[2014-10-12T12:45:40.732Z] [5] Listening on port: port 4080
+[2014-10-12T12:45:40.733Z] [5] Listening on port: port 40443
+[2014-10-12T12:45:40.733Z] [5] Start successful
+[2014-10-12T12:45:40.735Z] ENTRY test.log
+[2014-10-12T12:45:40.744Z] [7] Listening on port: port 4080
+[2014-10-12T12:45:40.745Z] [7] Listening on port: port 40443
+[2014-10-12T12:45:40.745Z] [7] Start successful
+[2014-10-12T12:45:40.752Z] [8] Listening on port: port 4080
+[2014-10-12T12:45:40.753Z] [8] Listening on port: port 40443
+[2014-10-12T12:45:40.753Z] [8] Start successful
+[2014-10-12T12:45:40.753Z] All workers started in 262ms
+[2014-10-12T12:45:41.564Z] Target [object Object]
+[2014-10-12T12:45:41.564Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:45:41.682Z] Target [object Object]
+[2014-10-12T12:45:41.682Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:26.334Z] ENTRY test.log
+[2014-10-12T12:46:26.343Z] ENTRY test.log
+[2014-10-12T12:46:26.344Z] ENTRY test.log
+[2014-10-12T12:46:26.353Z] ENTRY test.log
+[2014-10-12T12:46:26.353Z] ENTRY test.log
+[2014-10-12T12:46:26.355Z] ENTRY test.log
+[2014-10-12T12:46:26.363Z] ENTRY test.log
+[2014-10-12T12:46:26.367Z] [3] Listening on port: port 4080
+[2014-10-12T12:46:26.368Z] [3] Listening on port: port 40443
+[2014-10-12T12:46:26.368Z] [3] Start successful
+[2014-10-12T12:46:26.375Z] [5] Listening on port: port 4080
+[2014-10-12T12:46:26.376Z] [5] Listening on port: port 40443
+[2014-10-12T12:46:26.376Z] [5] Start successful
+[2014-10-12T12:46:26.381Z] [1] Listening on port: port 4080
+[2014-10-12T12:46:26.382Z] [1] Listening on port: port 40443
+[2014-10-12T12:46:26.382Z] [1] Start successful
+[2014-10-12T12:46:26.384Z] [4] Listening on port: port 4080
+[2014-10-12T12:46:26.385Z] [4] Listening on port: port 40443
+[2014-10-12T12:46:26.385Z] [4] Start successful
+[2014-10-12T12:46:26.387Z] [2] Listening on port: port 4080
+[2014-10-12T12:46:26.388Z] [2] Listening on port: port 40443
+[2014-10-12T12:46:26.388Z] [2] Start successful
+[2014-10-12T12:46:26.389Z] [6] Listening on port: port 4080
+[2014-10-12T12:46:26.389Z] [6] Listening on port: port 40443
+[2014-10-12T12:46:26.390Z] [7] Listening on port: port 4080
+[2014-10-12T12:46:26.390Z] [6] Start successful
+[2014-10-12T12:46:26.390Z] [7] Listening on port: port 40443
+[2014-10-12T12:46:26.390Z] [7] Start successful
+[2014-10-12T12:46:26.403Z] ENTRY test.log
+[2014-10-12T12:46:26.422Z] [8] Listening on port: port 4080
+[2014-10-12T12:46:26.422Z] [8] Listening on port: port 40443
+[2014-10-12T12:46:26.422Z] [8] Start successful
+[2014-10-12T12:46:26.423Z] All workers started in 278ms
+[2014-10-12T12:46:27.207Z] Target [object Object]
+[2014-10-12T12:46:27.207Z] 0
+[2014-10-12T12:46:27.208Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:27.342Z] Target [object Object]
+[2014-10-12T12:46:27.342Z] 0
+[2014-10-12T12:46:27.342Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:28.017Z] Target [object Object]
+[2014-10-12T12:46:28.017Z] 0
+[2014-10-12T12:46:28.017Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:28.104Z] Target [object Object]
+[2014-10-12T12:46:28.104Z] 0
+[2014-10-12T12:46:28.104Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:28.553Z] Target [object Object]
+[2014-10-12T12:46:28.553Z] 0
+[2014-10-12T12:46:28.553Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:28.654Z] Target [object Object]
+[2014-10-12T12:46:28.655Z] 0
+[2014-10-12T12:46:28.655Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:28.945Z] Target [object Object]
+[2014-10-12T12:46:28.945Z] 0
+[2014-10-12T12:46:28.945Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:46:29.046Z] Target [object Object]
+[2014-10-12T12:46:29.047Z] 0
+[2014-10-12T12:46:29.047Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:14.044Z] ENTRY test.log
+[2014-10-12T12:47:14.053Z] ENTRY test.log
+[2014-10-12T12:47:14.053Z] ENTRY test.log
+[2014-10-12T12:47:14.056Z] ENTRY test.log
+[2014-10-12T12:47:14.058Z] ENTRY test.log
+[2014-10-12T12:47:14.061Z] ENTRY test.log
+[2014-10-12T12:47:14.083Z] [4] Listening on port: port 4080
+[2014-10-12T12:47:14.084Z] [4] Listening on port: port 40443
+[2014-10-12T12:47:14.084Z] [4] Start successful
+[2014-10-12T12:47:14.085Z] [1] Listening on port: port 4080
+[2014-10-12T12:47:14.085Z] ENTRY test.log
+[2014-10-12T12:47:14.086Z] [1] Listening on port: port 40443
+[2014-10-12T12:47:14.086Z] [1] Start successful
+[2014-10-12T12:47:14.089Z] [2] Listening on port: port 4080
+[2014-10-12T12:47:14.090Z] [3] Listening on port: port 4080
+[2014-10-12T12:47:14.090Z] [2] Listening on port: port 40443
+[2014-10-12T12:47:14.090Z] [2] Start successful
+[2014-10-12T12:47:14.091Z] [3] Listening on port: port 40443
+[2014-10-12T12:47:14.091Z] [3] Start successful
+[2014-10-12T12:47:14.094Z] [6] Listening on port: port 4080
+[2014-10-12T12:47:14.095Z] [6] Listening on port: port 40443
+[2014-10-12T12:47:14.095Z] [6] Start successful
+[2014-10-12T12:47:14.097Z] [5] Listening on port: port 4080
+[2014-10-12T12:47:14.098Z] [5] Listening on port: port 40443
+[2014-10-12T12:47:14.099Z] [5] Start successful
+[2014-10-12T12:47:14.101Z] ENTRY test.log
+[2014-10-12T12:47:14.112Z] [8] Listening on port: port 4080
+[2014-10-12T12:47:14.113Z] [8] Listening on port: port 40443
+[2014-10-12T12:47:14.113Z] [8] Start successful
+[2014-10-12T12:47:14.119Z] [7] Listening on port: port 4080
+[2014-10-12T12:47:14.120Z] [7] Listening on port: port 40443
+[2014-10-12T12:47:14.120Z] [7] Start successful
+[2014-10-12T12:47:14.120Z] All workers started in 261ms
+[2014-10-12T12:47:15.020Z] Target [object Object]
+[2014-10-12T12:47:15.021Z]
+[2014-10-12T12:47:15.021Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:15.164Z] Target [object Object]
+[2014-10-12T12:47:15.164Z]
+[2014-10-12T12:47:15.164Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:16.093Z] Target [object Object]
+[2014-10-12T12:47:16.093Z]
+[2014-10-12T12:47:16.094Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:16.189Z] Target [object Object]
+[2014-10-12T12:47:16.189Z]
+[2014-10-12T12:47:16.189Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:23.252Z] ENTRY test.log
+[2014-10-12T12:47:23.268Z] ENTRY test.log
+[2014-10-12T12:47:23.273Z] ENTRY test.log
+[2014-10-12T12:47:23.286Z] [1] Listening on port: port 4080
+[2014-10-12T12:47:23.287Z] [1] Listening on port: port 40443
+[2014-10-12T12:47:23.287Z] [1] Start successful
+[2014-10-12T12:47:23.294Z] ENTRY test.log
+[2014-10-12T12:47:23.304Z] ENTRY test.log
+[2014-10-12T12:47:23.304Z] [4] Listening on port: port 4080
+[2014-10-12T12:47:23.304Z] [2] Listening on port: port 4080
+[2014-10-12T12:47:23.305Z] [4] Listening on port: port 40443
+[2014-10-12T12:47:23.305Z] [4] Start successful
+[2014-10-12T12:47:23.305Z] [2] Listening on port: port 40443
+[2014-10-12T12:47:23.305Z] [2] Start successful
+[2014-10-12T12:47:23.313Z] ENTRY test.log
+[2014-10-12T12:47:23.326Z] [5] Listening on port: port 4080
+[2014-10-12T12:47:23.327Z] [5] Listening on port: port 40443
+[2014-10-12T12:47:23.327Z] [5] Start successful
+[2014-10-12T12:47:23.329Z] [3] Listening on port: port 4080
+[2014-10-12T12:47:23.330Z] ENTRY test.log
+[2014-10-12T12:47:23.331Z] [3] Listening on port: port 40443
+[2014-10-12T12:47:23.331Z] [3] Start successful
+[2014-10-12T12:47:23.332Z] ENTRY test.log
+[2014-10-12T12:47:23.333Z] [8] Listening on port: port 4080
+[2014-10-12T12:47:23.333Z] [8] Listening on port: port 40443
+[2014-10-12T12:47:23.333Z] [8] Start successful
+[2014-10-12T12:47:23.350Z] [7] Listening on port: port 4080
+[2014-10-12T12:47:23.350Z] [6] Listening on port: port 4080
+[2014-10-12T12:47:23.351Z] [7] Listening on port: port 40443
+[2014-10-12T12:47:23.351Z] [7] Start successful
+[2014-10-12T12:47:23.351Z] [6] Listening on port: port 40443
+[2014-10-12T12:47:23.351Z] [6] Start successful
+[2014-10-12T12:47:23.352Z] All workers started in 281ms
+[2014-10-12T12:47:23.943Z] Target [object Object]
+[2014-10-12T12:47:23.943Z] [object Object]
+[2014-10-12T12:47:23.944Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:24.046Z] Target [object Object]
+[2014-10-12T12:47:24.046Z] [object Object]
+[2014-10-12T12:47:24.046Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:34.409Z] ENTRY test.log
+[2014-10-12T12:47:34.412Z] ENTRY test.log
+[2014-10-12T12:47:34.424Z] ENTRY test.log
+[2014-10-12T12:47:34.425Z] ENTRY test.log
+[2014-10-12T12:47:34.430Z] ENTRY test.log
+[2014-10-12T12:47:34.431Z] ENTRY test.log
+[2014-10-12T12:47:34.433Z] ENTRY test.log
+[2014-10-12T12:47:34.435Z] ENTRY test.log
+[2014-10-12T12:47:34.441Z] [1] Listening on port: port 4080
+[2014-10-12T12:47:34.441Z] [1] Listening on port: port 40443
+[2014-10-12T12:47:34.442Z] [1] Start successful
+[2014-10-12T12:47:34.444Z] [3] Listening on port: port 4080
+[2014-10-12T12:47:34.445Z] [3] Listening on port: port 40443
+[2014-10-12T12:47:34.446Z] [3] Start successful
+[2014-10-12T12:47:34.457Z] [8] Listening on port: port 4080
+[2014-10-12T12:47:34.457Z] [8] Listening on port: port 40443
+[2014-10-12T12:47:34.458Z] [8] Start successful
+[2014-10-12T12:47:34.459Z] [2] Listening on port: port 4080
+[2014-10-12T12:47:34.459Z] [6] Listening on port: port 4080
+[2014-10-12T12:47:34.460Z] [2] Listening on port: port 40443
+[2014-10-12T12:47:34.460Z] [2] Start successful
+[2014-10-12T12:47:34.460Z] [6] Listening on port: port 40443
+[2014-10-12T12:47:34.460Z] [6] Start successful
+[2014-10-12T12:47:34.461Z] [4] Listening on port: port 4080
+[2014-10-12T12:47:34.462Z] [5] Listening on port: port 4080
+[2014-10-12T12:47:34.462Z] [4] Listening on port: port 40443
+[2014-10-12T12:47:34.462Z] [4] Start successful
+[2014-10-12T12:47:34.463Z] [7] Listening on port: port 4080
+[2014-10-12T12:47:34.463Z] [5] Listening on port: port 40443
+[2014-10-12T12:47:34.463Z] [5] Start successful
+[2014-10-12T12:47:34.463Z] [7] Listening on port: port 40443
+[2014-10-12T12:47:34.464Z] [7] Start successful
+[2014-10-12T12:47:34.464Z] All workers started in 241ms
+[2014-10-12T12:47:35.186Z] Target [object Object]
+[2014-10-12T12:47:35.186Z] {}
+[2014-10-12T12:47:35.186Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:35.321Z] Target [object Object]
+[2014-10-12T12:47:35.321Z] {}
+[2014-10-12T12:47:35.321Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:35.876Z] Target [object Object]
+[2014-10-12T12:47:35.876Z] {}
+[2014-10-12T12:47:35.876Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:35.982Z] Target [object Object]
+[2014-10-12T12:47:35.982Z] {}
+[2014-10-12T12:47:35.982Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:36.214Z] Target [object Object]
+[2014-10-12T12:47:36.214Z] {}
+[2014-10-12T12:47:36.214Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:36.301Z] Target [object Object]
+[2014-10-12T12:47:36.301Z] {}
+[2014-10-12T12:47:36.301Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:36.442Z] Target [object Object]
+[2014-10-12T12:47:36.442Z] {}
+[2014-10-12T12:47:36.442Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:36.531Z] Target [object Object]
+[2014-10-12T12:47:36.531Z] {}
+[2014-10-12T12:47:36.531Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:53.361Z] ENTRY test.log
+[2014-10-12T12:47:53.366Z] ENTRY test.log
+[2014-10-12T12:47:53.367Z] ENTRY test.log
+[2014-10-12T12:47:53.368Z] ENTRY test.log
+[2014-10-12T12:47:53.374Z] ENTRY test.log
+[2014-10-12T12:47:53.383Z] ENTRY test.log
+[2014-10-12T12:47:53.384Z] ENTRY test.log
+[2014-10-12T12:47:53.393Z] [1] Listening on port: port 4080
+[2014-10-12T12:47:53.394Z] [1] Listening on port: port 40443
+[2014-10-12T12:47:53.395Z] [1] Start successful
+[2014-10-12T12:47:53.398Z] [5] Listening on port: port 4080
+[2014-10-12T12:47:53.398Z] [5] Listening on port: port 40443
+[2014-10-12T12:47:53.398Z] [5] Start successful
+[2014-10-12T12:47:53.400Z] [4] Listening on port: port 4080
+[2014-10-12T12:47:53.402Z] [4] Listening on port: port 40443
+[2014-10-12T12:47:53.402Z] [4] Start successful
+[2014-10-12T12:47:53.402Z] [3] Listening on port: port 4080
+[2014-10-12T12:47:53.403Z] [3] Listening on port: port 40443
+[2014-10-12T12:47:53.403Z] [3] Start successful
+[2014-10-12T12:47:53.403Z] ENTRY test.log
+[2014-10-12T12:47:53.409Z] [7] Listening on port: port 4080
+[2014-10-12T12:47:53.409Z] [7] Listening on port: port 40443
+[2014-10-12T12:47:53.410Z] [7] Start successful
+[2014-10-12T12:47:53.410Z] [2] Listening on port: port 4080
+[2014-10-12T12:47:53.411Z] [2] Listening on port: port 40443
+[2014-10-12T12:47:53.411Z] [2] Start successful
+[2014-10-12T12:47:53.411Z] [6] Listening on port: port 4080
+[2014-10-12T12:47:53.412Z] [6] Listening on port: port 40443
+[2014-10-12T12:47:53.412Z] [6] Start successful
+[2014-10-12T12:47:53.424Z] [8] Listening on port: port 4080
+[2014-10-12T12:47:53.425Z] [8] Listening on port: port 40443
+[2014-10-12T12:47:53.425Z] [8] Start successful
+[2014-10-12T12:47:53.425Z] All workers started in 253ms
+[2014-10-12T12:47:54.516Z] Target [object Object]
+[2014-10-12T12:47:54.517Z] function () { [native code] }
+[2014-10-12T12:47:54.517Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:54.621Z] Target [object Object]
+[2014-10-12T12:47:54.621Z] function () { [native code] }
+[2014-10-12T12:47:54.621Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:55.194Z] Target [object Object]
+[2014-10-12T12:47:55.194Z] function () { [native code] }
+[2014-10-12T12:47:55.194Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:47:55.283Z] Target [object Object]
+[2014-10-12T12:47:55.283Z] function () { [native code] }
+[2014-10-12T12:47:55.283Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:48:07.394Z] ENTRY test.log
+[2014-10-12T12:48:07.420Z] ENTRY test.log
+[2014-10-12T12:48:07.421Z] ENTRY test.log
+[2014-10-12T12:48:07.421Z] ENTRY test.log
+[2014-10-12T12:48:07.426Z] [1] Listening on port: port 4080
+[2014-10-12T12:48:07.427Z] [1] Listening on port: port 40443
+[2014-10-12T12:48:07.427Z] [1] Start successful
+[2014-10-12T12:48:07.439Z] ENTRY test.log
+[2014-10-12T12:48:07.440Z] ENTRY test.log
+[2014-10-12T12:48:07.451Z] [5] Listening on port: port 4080
+[2014-10-12T12:48:07.452Z] [7] Listening on port: port 4080
+[2014-10-12T12:48:07.452Z] [4] Listening on port: port 4080
+[2014-10-12T12:48:07.452Z] [5] Listening on port: port 40443
+[2014-10-12T12:48:07.452Z] [5] Start successful
+[2014-10-12T12:48:07.453Z] [7] Listening on port: port 40443
+[2014-10-12T12:48:07.453Z] [4] Listening on port: port 40443
+[2014-10-12T12:48:07.453Z] [4] Start successful
+[2014-10-12T12:48:07.453Z] [7] Start successful
+[2014-10-12T12:48:07.458Z] ENTRY test.log
+[2014-10-12T12:48:07.468Z] ENTRY test.log
+[2014-10-12T12:48:07.468Z] [6] Listening on port: port 4080
+[2014-10-12T12:48:07.469Z] [6] Listening on port: port 40443
+[2014-10-12T12:48:07.469Z] [6] Start successful
+[2014-10-12T12:48:07.471Z] [8] Listening on port: port 4080
+[2014-10-12T12:48:07.472Z] [8] Listening on port: port 40443
+[2014-10-12T12:48:07.472Z] [8] Start successful
+[2014-10-12T12:48:07.484Z] [2] Listening on port: port 4080
+[2014-10-12T12:48:07.484Z] [2] Listening on port: port 40443
+[2014-10-12T12:48:07.484Z] [2] Start successful
+[2014-10-12T12:48:07.489Z] [3] Listening on port: port 4080
+[2014-10-12T12:48:07.490Z] [3] Listening on port: port 40443
+[2014-10-12T12:48:07.490Z] [3] Start successful
+[2014-10-12T12:48:07.491Z] All workers started in 282ms
+[2014-10-12T12:48:08.189Z] Target [object Object]
+[2014-10-12T12:48:08.190Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:48:08.293Z] Target [object Object]
+[2014-10-12T12:48:08.293Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:14.655Z] ENTRY test.log
+[2014-10-12T12:49:14.662Z] ENTRY test.log
+[2014-10-12T12:49:14.665Z] ENTRY test.log
+[2014-10-12T12:49:14.667Z] ENTRY test.log
+[2014-10-12T12:49:14.667Z] ENTRY test.log
+[2014-10-12T12:49:14.676Z] ENTRY test.log
+[2014-10-12T12:49:14.692Z] [1] Listening on port: port 4080
+[2014-10-12T12:49:14.693Z] [1] Listening on port: port 40443
+[2014-10-12T12:49:14.693Z] [1] Start successful
+[2014-10-12T12:49:14.695Z] [2] Listening on port: port 4080
+[2014-10-12T12:49:14.696Z] [2] Listening on port: port 40443
+[2014-10-12T12:49:14.696Z] [2] Start successful
+[2014-10-12T12:49:14.697Z] ENTRY test.log
+[2014-10-12T12:49:14.698Z] [3] Listening on port: port 4080
+[2014-10-12T12:49:14.699Z] [3] Listening on port: port 40443
+[2014-10-12T12:49:14.699Z] [3] Start successful
+[2014-10-12T12:49:14.699Z] [6] Listening on port: port 4080
+[2014-10-12T12:49:14.700Z] [6] Listening on port: port 40443
+[2014-10-12T12:49:14.700Z] [6] Start successful
+[2014-10-12T12:49:14.701Z] [5] Listening on port: port 4080
+[2014-10-12T12:49:14.702Z] [5] Listening on port: port 40443
+[2014-10-12T12:49:14.702Z] [5] Start successful
+[2014-10-12T12:49:14.712Z] [4] Listening on port: port 4080
+[2014-10-12T12:49:14.713Z] [4] Listening on port: port 40443
+[2014-10-12T12:49:14.713Z] [4] Start successful
+[2014-10-12T12:49:14.713Z] ENTRY test.log
+[2014-10-12T12:49:14.717Z] [7] Listening on port: port 4080
+[2014-10-12T12:49:14.718Z] [7] Listening on port: port 40443
+[2014-10-12T12:49:14.718Z] [7] Start successful
+[2014-10-12T12:49:14.731Z] [8] Listening on port: port 4080
+[2014-10-12T12:49:14.732Z] [8] Listening on port: port 40443
+[2014-10-12T12:49:14.732Z] [8] Start successful
+[2014-10-12T12:49:14.732Z] All workers started in 261ms
+[2014-10-12T12:49:15.777Z] Target [object Object]
+[2014-10-12T12:49:15.777Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:15.932Z] Target [object Object]
+[2014-10-12T12:49:15.932Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:16.066Z] Target [object Object]
+[2014-10-12T12:49:16.066Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:16.198Z] Target [object Object]
+[2014-10-12T12:49:16.198Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:16.270Z] Target [object Object]
+[2014-10-12T12:49:16.271Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:16.360Z] Target [object Object]
+[2014-10-12T12:49:16.360Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:16.465Z] Target [object Object]
+[2014-10-12T12:49:16.465Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:49:16.550Z] Target [object Object]
+[2014-10-12T12:49:16.550Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:41.352Z] ENTRY test.log
+[2014-10-12T12:52:41.366Z] ENTRY test.log
+[2014-10-12T12:52:41.370Z] ENTRY test.log
+[2014-10-12T12:52:41.371Z] ENTRY test.log
+[2014-10-12T12:52:41.372Z] ENTRY test.log
+[2014-10-12T12:52:41.376Z] [4] Listening on port: port 4080
+[2014-10-12T12:52:41.377Z] [4] Listening on port: port 40443
+[2014-10-12T12:52:41.377Z] [4] Start successful
+[2014-10-12T12:52:41.395Z] [5] Listening on port: port 4080
+[2014-10-12T12:52:41.396Z] [5] Listening on port: port 40443
+[2014-10-12T12:52:41.396Z] [5] Start successful
+[2014-10-12T12:52:41.397Z] [3] Listening on port: port 4080
+[2014-10-12T12:52:41.397Z] ENTRY test.log
+[2014-10-12T12:52:41.398Z] [3] Listening on port: port 40443
+[2014-10-12T12:52:41.398Z] [3] Start successful
+[2014-10-12T12:52:41.406Z] [2] Listening on port: port 4080
+[2014-10-12T12:52:41.407Z] [2] Listening on port: port 40443
+[2014-10-12T12:52:41.407Z] [2] Start successful
+[2014-10-12T12:52:41.408Z] [1] Listening on port: port 4080
+[2014-10-12T12:52:41.409Z] [1] Listening on port: port 40443
+[2014-10-12T12:52:41.409Z] [1] Start successful
+[2014-10-12T12:52:41.422Z] [8] Listening on port: port 4080
+[2014-10-12T12:52:41.423Z] [8] Listening on port: port 40443
+[2014-10-12T12:52:41.423Z] [8] Start successful
+[2014-10-12T12:52:41.443Z] ENTRY test.log
+[2014-10-12T12:52:41.447Z] ENTRY test.log
+[2014-10-12T12:52:41.462Z] [6] Listening on port: port 4080
+[2014-10-12T12:52:41.462Z] [6] Listening on port: port 40443
+[2014-10-12T12:52:41.463Z] [6] Start successful
+[2014-10-12T12:52:41.465Z] [7] Listening on port: port 4080
+[2014-10-12T12:52:41.466Z] [7] Listening on port: port 40443
+[2014-10-12T12:52:41.466Z] [7] Start successful
+[2014-10-12T12:52:41.467Z] All workers started in 292ms
+[2014-10-12T12:52:48.045Z] Target [object Object]
+[2014-10-12T12:52:48.045Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:48.194Z] Target [object Object]
+[2014-10-12T12:52:48.194Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:48.442Z] Target [object Object]
+[2014-10-12T12:52:48.443Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:48.567Z] Target [object Object]
+[2014-10-12T12:52:48.567Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.020Z] Target [object Object]
+[2014-10-12T12:52:49.020Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.138Z] Target [object Object]
+[2014-10-12T12:52:49.138Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.316Z] Target [object Object]
+[2014-10-12T12:52:49.316Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.445Z] Target [object Object]
+[2014-10-12T12:52:49.445Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.583Z] Target [object Object]
+[2014-10-12T12:52:49.583Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.719Z] Target [object Object]
+[2014-10-12T12:52:49.719Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.877Z] Target [object Object]
+[2014-10-12T12:52:49.877Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:52:49.985Z] Target [object Object]
+[2014-10-12T12:52:49.986Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:11.858Z] ENTRY test.log
+[2014-10-12T12:53:11.888Z] [1] Listening on port: port 4080
+[2014-10-12T12:53:11.889Z] [1] Listening on port: port 40443
+[2014-10-12T12:53:11.889Z] [1] Start successful
+[2014-10-12T12:53:11.902Z] ENTRY test.log
+[2014-10-12T12:53:11.902Z] ENTRY test.log
+[2014-10-12T12:53:11.918Z] ENTRY test.log
+[2014-10-12T12:53:11.929Z] [2] Listening on port: port 4080
+[2014-10-12T12:53:11.929Z] [2] Listening on port: port 40443
+[2014-10-12T12:53:11.929Z] [2] Start successful
+[2014-10-12T12:53:11.929Z] ENTRY test.log
+[2014-10-12T12:53:11.931Z] ENTRY test.log
+[2014-10-12T12:53:11.935Z] [4] Listening on port: port 4080
+[2014-10-12T12:53:11.936Z] [4] Listening on port: port 40443
+[2014-10-12T12:53:11.936Z] [4] Start successful
+[2014-10-12T12:53:11.943Z] ENTRY test.log
+[2014-10-12T12:53:11.944Z] [6] Listening on port: port 4080
+[2014-10-12T12:53:11.944Z] [6] Listening on port: port 40443
+[2014-10-12T12:53:11.944Z] [6] Start successful
+[2014-10-12T12:53:11.951Z] ENTRY test.log
+[2014-10-12T12:53:11.953Z] [8] Listening on port: port 4080
+[2014-10-12T12:53:11.954Z] [8] Listening on port: port 40443
+[2014-10-12T12:53:11.954Z] [8] Start successful
+[2014-10-12T12:53:11.956Z] [5] Listening on port: port 4080
+[2014-10-12T12:53:11.957Z] [5] Listening on port: port 40443
+[2014-10-12T12:53:11.957Z] [5] Start successful
+[2014-10-12T12:53:11.967Z] [3] Listening on port: port 4080
+[2014-10-12T12:53:11.968Z] [3] Listening on port: port 40443
+[2014-10-12T12:53:11.968Z] [3] Start successful
+[2014-10-12T12:53:11.970Z] [7] Listening on port: port 4080
+[2014-10-12T12:53:11.971Z] [7] Listening on port: port 40443
+[2014-10-12T12:53:11.971Z] [7] Start successful
+[2014-10-12T12:53:11.972Z] All workers started in 259ms
+[2014-10-12T12:53:12.518Z] Target [object Object]
+[2014-10-12T12:53:12.520Z] { middleware: [Function] }
+[2014-10-12T12:53:12.521Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:12.658Z] Target [object Object]
+[2014-10-12T12:53:12.658Z] { middleware: [Function] }
+[2014-10-12T12:53:12.658Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:13.035Z] Target [object Object]
+[2014-10-12T12:53:13.035Z] { middleware: [Function] }
+[2014-10-12T12:53:13.035Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:13.169Z] Target [object Object]
+[2014-10-12T12:53:13.169Z] { middleware: [Function] }
+[2014-10-12T12:53:13.169Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:13.267Z] Target [object Object]
+[2014-10-12T12:53:13.268Z] { middleware: [Function] }
+[2014-10-12T12:53:13.268Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:13.359Z] Target [object Object]
+[2014-10-12T12:53:13.359Z] { middleware: [Function] }
+[2014-10-12T12:53:13.359Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:13.453Z] Target [object Object]
+[2014-10-12T12:53:13.454Z] { middleware: [Function] }
+[2014-10-12T12:53:13.454Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:13.540Z] Target [object Object]
+[2014-10-12T12:53:13.540Z] { middleware: [Function] }
+[2014-10-12T12:53:13.540Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:44.790Z] ENTRY test.log
+[2014-10-12T12:53:44.791Z] ENTRY test.log
+[2014-10-12T12:53:44.791Z] ENTRY test.log
+[2014-10-12T12:53:44.792Z] ENTRY test.log
+[2014-10-12T12:53:44.793Z] ENTRY test.log
+[2014-10-12T12:53:44.803Z] ENTRY test.log
+[2014-10-12T12:53:44.809Z] ENTRY test.log
+[2014-10-12T12:53:44.820Z] [3] Listening on port: port 4080
+[2014-10-12T12:53:44.821Z] [3] Listening on port: port 40443
+[2014-10-12T12:53:44.822Z] [3] Start successful
+[2014-10-12T12:53:44.822Z] [5] Listening on port: port 4080
+[2014-10-12T12:53:44.822Z] [6] Listening on port: port 4080
+[2014-10-12T12:53:44.823Z] [5] Listening on port: port 40443
+[2014-10-12T12:53:44.823Z] [5] Start successful
+[2014-10-12T12:53:44.823Z] [6] Listening on port: port 40443
+[2014-10-12T12:53:44.823Z] [6] Start successful
+[2014-10-12T12:53:44.823Z] [2] Listening on port: port 4080
+[2014-10-12T12:53:44.824Z] [2] Listening on port: port 40443
+[2014-10-12T12:53:44.824Z] [2] Start successful
+[2014-10-12T12:53:44.830Z] [7] Listening on port: port 4080
+[2014-10-12T12:53:44.830Z] [4] Listening on port: port 4080
+[2014-10-12T12:53:44.831Z] [7] Listening on port: port 40443
+[2014-10-12T12:53:44.831Z] [7] Start successful
+[2014-10-12T12:53:44.831Z] [4] Listening on port: port 40443
+[2014-10-12T12:53:44.831Z] [4] Start successful
+[2014-10-12T12:53:44.835Z] [1] Listening on port: port 4080
+[2014-10-12T12:53:44.836Z] [1] Listening on port: port 40443
+[2014-10-12T12:53:44.836Z] [1] Start successful
+[2014-10-12T12:53:44.838Z] ENTRY test.log
+[2014-10-12T12:53:44.856Z] [8] Listening on port: port 4080
+[2014-10-12T12:53:44.856Z] [8] Listening on port: port 40443
+[2014-10-12T12:53:44.856Z] [8] Start successful
+[2014-10-12T12:53:44.857Z] All workers started in 269ms
+[2014-10-12T12:53:45.705Z] Target [object Object]
+[2014-10-12T12:53:45.706Z] [ { middleware: [Function] } ]
+[2014-10-12T12:53:45.706Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:45.847Z] Target [object Object]
+[2014-10-12T12:53:45.847Z] [ { middleware: [Function] } ]
+[2014-10-12T12:53:45.848Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:46.366Z] Target [object Object]
+[2014-10-12T12:53:46.366Z] [ { middleware: [Function] } ]
+[2014-10-12T12:53:46.366Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:53:46.492Z] Target [object Object]
+[2014-10-12T12:53:46.492Z] [ { middleware: [Function] } ]
+[2014-10-12T12:53:46.492Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:54:12.856Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.865Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.873Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.875Z] ENTRY test.log
+[2014-10-12T12:54:12.878Z] ENTRY test.log
+[2014-10-12T12:54:12.879Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.884Z] ENTRY test.log
+[2014-10-12T12:54:12.886Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.889Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.892Z] ENTRY test.log
+[2014-10-12T12:54:12.893Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.899Z] ENTRY test.log
+[2014-10-12T12:54:12.902Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.903Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.904Z] ENTRY test.log
+[2014-10-12T12:54:12.906Z] [1] Listening on port: port 4080
+[2014-10-12T12:54:12.907Z] [1] Listening on port: port 40443
+[2014-10-12T12:54:12.908Z] [1] Start successful
+[2014-10-12T12:54:12.911Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.914Z] [4] Listening on port: port 4080
+[2014-10-12T12:54:12.915Z] [4] Listening on port: port 40443
+[2014-10-12T12:54:12.916Z] [4] Start successful
+[2014-10-12T12:54:12.917Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.917Z] [2] Listening on port: port 4080
+[2014-10-12T12:54:12.918Z] [2] Listening on port: port 40443
+[2014-10-12T12:54:12.918Z] [2] Start successful
+[2014-10-12T12:54:12.921Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.921Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.925Z] [5] Listening on port: port 4080
+[2014-10-12T12:54:12.926Z] [5] Listening on port: port 40443
+[2014-10-12T12:54:12.926Z] [5] Start successful
+[2014-10-12T12:54:12.928Z] ENTRY test.log
+[2014-10-12T12:54:12.928Z] [ { middleware: [Function] } ]
+[2014-10-12T12:54:12.931Z] [8] Listening on port: port 4080
+[2014-10-12T12:54:12.932Z] [8] Listening on port: port 40443
+[2014-10-12T12:54:12.932Z] [8] Start successful
+[2014-10-12T12:54:12.935Z] [3] Listening on port: port 4080
+[2014-10-12T12:54:12.936Z] [3] Listening on port: port 40443
+[2014-10-12T12:54:12.936Z] ENTRY test.log
+[2014-10-12T12:54:12.936Z] [3] Start successful
+[2014-10-12T12:54:12.942Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.949Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:54:12.950Z] [7] Listening on port: port 4080
+[2014-10-12T12:54:12.951Z] [7] Listening on port: port 40443
+[2014-10-12T12:54:12.951Z] [7] Start successful
+[2014-10-12T12:54:12.957Z] [6] Listening on port: port 4080
+[2014-10-12T12:54:12.958Z] [6] Listening on port: port 40443
+[2014-10-12T12:54:12.958Z] [6] Start successful
+[2014-10-12T12:54:12.959Z] All workers started in 270ms
+[2014-10-12T12:55:15.829Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.836Z] ENTRY test.log
+[2014-10-12T12:55:15.849Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.855Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.858Z] [1] Listening on port: port 4080
+[2014-10-12T12:55:15.859Z] [1] Listening on port: port 40443
+[2014-10-12T12:55:15.859Z] [1] Start successful
+[2014-10-12T12:55:15.866Z] ENTRY test.log
+[2014-10-12T12:55:15.867Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.875Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.879Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.880Z] ENTRY test.log
+[2014-10-12T12:55:15.881Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.885Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.889Z] ENTRY test.log
+[2014-10-12T12:55:15.892Z] ENTRY test.log
+[2014-10-12T12:55:15.892Z] ENTRY test.log
+[2014-10-12T12:55:15.899Z] [6] Listening on port: port 4080
+[2014-10-12T12:55:15.899Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.900Z] [6] Listening on port: port 40443
+[2014-10-12T12:55:15.901Z] [6] Start successful
+[2014-10-12T12:55:15.906Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.906Z] [3] Listening on port: port 4080
+[2014-10-12T12:55:15.907Z] [3] Listening on port: port 40443
+[2014-10-12T12:55:15.907Z] [3] Start successful
+[2014-10-12T12:55:15.908Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.911Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.916Z] [7] Listening on port: port 4080
+[2014-10-12T12:55:15.917Z] [7] Listening on port: port 40443
+[2014-10-12T12:55:15.917Z] [7] Start successful
+[2014-10-12T12:55:15.919Z] [5] Listening on port: port 4080
+[2014-10-12T12:55:15.920Z] [2] Listening on port: port 4080
+[2014-10-12T12:55:15.920Z] [5] Listening on port: port 40443
+[2014-10-12T12:55:15.920Z] [5] Start successful
+[2014-10-12T12:55:15.921Z] [2] Listening on port: port 40443
+[2014-10-12T12:55:15.921Z] [2] Start successful
+[2014-10-12T12:55:15.929Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.936Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:15.936Z] ENTRY test.log
+[2014-10-12T12:55:15.943Z] ENTRY test.log
+[2014-10-12T12:55:15.947Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.954Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:15.955Z] [4] Listening on port: port 4080
+[2014-10-12T12:55:15.956Z] [4] Listening on port: port 40443
+[2014-10-12T12:55:15.956Z] [4] Start successful
+[2014-10-12T12:55:15.961Z] [8] Listening on port: port 4080
+[2014-10-12T12:55:15.962Z] [8] Listening on port: port 40443
+[2014-10-12T12:55:15.962Z] [8] Start successful
+[2014-10-12T12:55:15.962Z] All workers started in 275ms
+[2014-10-12T12:55:28.478Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.483Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.488Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.489Z] ENTRY test.log
+[2014-10-12T12:55:28.491Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.497Z] ENTRY test.log
+[2014-10-12T12:55:28.502Z] ENTRY test.log
+[2014-10-12T12:55:28.503Z] ENTRY test.log
+[2014-10-12T12:55:28.507Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.512Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.513Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.514Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.515Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.522Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.523Z] [1] Listening on port: port 4080
+[2014-10-12T12:55:28.524Z] [1] Listening on port: port 40443
+[2014-10-12T12:55:28.524Z] [1] Start successful
+[2014-10-12T12:55:28.525Z] ENTRY test.log
+[2014-10-12T12:55:28.526Z] ENTRY test.log
+[2014-10-12T12:55:28.529Z] [3] Listening on port: port 4080
+[2014-10-12T12:55:28.530Z] [3] Listening on port: port 40443
+[2014-10-12T12:55:28.530Z] [3] Start successful
+[2014-10-12T12:55:28.533Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.533Z] ENTRY test.log
+[2014-10-12T12:55:28.534Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:28.537Z] [5] Listening on port: port 4080
+[2014-10-12T12:55:28.538Z] [5] Listening on port: port 40443
+[2014-10-12T12:55:28.538Z] [5] Start successful
+[2014-10-12T12:55:28.542Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.544Z] [2] Listening on port: port 4080
+[2014-10-12T12:55:28.544Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.545Z] [2] Listening on port: port 40443
+[2014-10-12T12:55:28.545Z] [2] Start successful
+[2014-10-12T12:55:28.546Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.547Z] ENTRY test.log
+[2014-10-12T12:55:28.552Z] [8] Listening on port: port 4080
+[2014-10-12T12:55:28.553Z] [8] Listening on port: port 40443
+[2014-10-12T12:55:28.553Z] [8] Start successful
+[2014-10-12T12:55:28.555Z] [7] Listening on port: port 4080
+[2014-10-12T12:55:28.555Z] [7] Listening on port: port 40443
+[2014-10-12T12:55:28.556Z] [7] Start successful
+[2014-10-12T12:55:28.556Z] [4] Listening on port: port 4080
+[2014-10-12T12:55:28.557Z] [4] Listening on port: port 40443
+[2014-10-12T12:55:28.557Z] [4] Start successful
+[2014-10-12T12:55:28.561Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ]
+[2014-10-12T12:55:28.569Z] [6] Listening on port: port 4080
+[2014-10-12T12:55:28.570Z] [6] Listening on port: port 40443
+[2014-10-12T12:55:28.570Z] [6] Start successful
+[2014-10-12T12:55:28.570Z] All workers started in 269ms
+[2014-10-12T12:55:29.544Z] Target [object Object]
+[2014-10-12T12:55:29.544Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:29.545Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:55:29.683Z] Target [object Object]
+[2014-10-12T12:55:29.683Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:29.683Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:55:30.244Z] Target [object Object]
+[2014-10-12T12:55:30.244Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:30.244Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:55:30.330Z] Target [object Object]
+[2014-10-12T12:55:30.330Z] [ { middleware: [Function] } ]
+[2014-10-12T12:55:30.330Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:55:57.736Z] 1
+[2014-10-12T12:55:57.746Z] 1
+[2014-10-12T12:55:57.747Z] ENTRY test.log
+[2014-10-12T12:55:57.758Z] 1
+[2014-10-12T12:55:57.758Z] ENTRY test.log
+[2014-10-12T12:55:57.764Z] 2
+[2014-10-12T12:55:57.766Z] 1
+[2014-10-12T12:55:57.768Z] 1
+[2014-10-12T12:55:57.770Z] ENTRY test.log
+[2014-10-12T12:55:57.776Z] 2
+[2014-10-12T12:55:57.779Z] [2] Listening on port: port 4080
+[2014-10-12T12:55:57.779Z] ENTRY test.log
+[2014-10-12T12:55:57.779Z] ENTRY test.log
+[2014-10-12T12:55:57.780Z] [2] Listening on port: port 40443
+[2014-10-12T12:55:57.781Z] [2] Start successful
+[2014-10-12T12:55:57.782Z] 1
+[2014-10-12T12:55:57.787Z] 2
+[2014-10-12T12:55:57.787Z] 1
+[2014-10-12T12:55:57.790Z] [1] Listening on port: port 4080
+[2014-10-12T12:55:57.791Z] [1] Listening on port: port 40443
+[2014-10-12T12:55:57.792Z] [1] Start successful
+[2014-10-12T12:55:57.796Z] 2
+[2014-10-12T12:55:57.797Z] ENTRY test.log
+[2014-10-12T12:55:57.799Z] ENTRY test.log
+[2014-10-12T12:55:57.799Z] 2
+[2014-10-12T12:55:57.799Z] [3] Listening on port: port 4080
+[2014-10-12T12:55:57.801Z] [3] Listening on port: port 40443
+[2014-10-12T12:55:57.801Z] [3] Start successful
+[2014-10-12T12:55:57.806Z] [7] Listening on port: port 4080
+[2014-10-12T12:55:57.807Z] [7] Listening on port: port 40443
+[2014-10-12T12:55:57.807Z] [7] Start successful
+[2014-10-12T12:55:57.813Z] 2
+[2014-10-12T12:55:57.813Z] 2
+[2014-10-12T12:55:57.814Z] [4] Listening on port: port 4080
+[2014-10-12T12:55:57.815Z] [4] Listening on port: port 40443
+[2014-10-12T12:55:57.815Z] [4] Start successful
+[2014-10-12T12:55:57.821Z] 1
+[2014-10-12T12:55:57.822Z] [8] Listening on port: port 4080
+[2014-10-12T12:55:57.822Z] [6] Listening on port: port 4080
+[2014-10-12T12:55:57.823Z] [8] Listening on port: port 40443
+[2014-10-12T12:55:57.823Z] [8] Start successful
+[2014-10-12T12:55:57.823Z] [6] Listening on port: port 40443
+[2014-10-12T12:55:57.823Z] [6] Start successful
+[2014-10-12T12:55:57.828Z] ENTRY test.log
+[2014-10-12T12:55:57.839Z] 2
+[2014-10-12T12:55:57.847Z] [5] Listening on port: port 4080
+[2014-10-12T12:55:57.847Z] [5] Listening on port: port 40443
+[2014-10-12T12:55:57.847Z] [5] Start successful
+[2014-10-12T12:55:57.848Z] All workers started in 275ms
+[2014-10-12T12:55:58.823Z] Target [object Object]
+[2014-10-12T12:55:58.823Z] 1
+[2014-10-12T12:55:58.824Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:55:58.958Z] Target [object Object]
+[2014-10-12T12:55:58.958Z] 1
+[2014-10-12T12:55:58.958Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:24.250Z] 1
+[2014-10-12T12:56:24.255Z] 1
+[2014-10-12T12:56:24.257Z] 1
+[2014-10-12T12:56:24.261Z] ENTRY test.log
+[2014-10-12T12:56:24.262Z] ENTRY test.log
+[2014-10-12T12:56:24.267Z] 1
+[2014-10-12T12:56:24.269Z] 1
+[2014-10-12T12:56:24.272Z] ENTRY test.log
+[2014-10-12T12:56:24.277Z] 2
+[2014-10-12T12:56:24.278Z] 2
+[2014-10-12T12:56:24.279Z] ENTRY test.log
+[2014-10-12T12:56:24.284Z] ENTRY test.log
+[2014-10-12T12:56:24.290Z] [6] Listening on port: port 4080
+[2014-10-12T12:56:24.291Z] [6] Listening on port: port 40443
+[2014-10-12T12:56:24.292Z] [6] Start successful
+[2014-10-12T12:56:24.292Z] 2
+[2014-10-12T12:56:24.294Z] [1] Listening on port: port 4080
+[2014-10-12T12:56:24.295Z] [1] Listening on port: port 40443
+[2014-10-12T12:56:24.295Z] [1] Start successful
+[2014-10-12T12:56:24.300Z] 2
+[2014-10-12T12:56:24.301Z] 2
+[2014-10-12T12:56:24.307Z] [2] Listening on port: port 4080
+[2014-10-12T12:56:24.308Z] [2] Listening on port: port 40443
+[2014-10-12T12:56:24.308Z] [2] Start successful
+[2014-10-12T12:56:24.310Z] [8] Listening on port: port 4080
+[2014-10-12T12:56:24.310Z] [8] Listening on port: port 40443
+[2014-10-12T12:56:24.310Z] [8] Start successful
+[2014-10-12T12:56:24.311Z] 1
+[2014-10-12T12:56:24.313Z] 1
+[2014-10-12T12:56:24.314Z] [4] Listening on port: port 4080
+[2014-10-12T12:56:24.314Z] [4] Listening on port: port 40443
+[2014-10-12T12:56:24.315Z] [4] Start successful
+[2014-10-12T12:56:24.319Z] ENTRY test.log
+[2014-10-12T12:56:24.321Z] 1
+[2014-10-12T12:56:24.321Z] ENTRY test.log
+[2014-10-12T12:56:24.329Z] ENTRY test.log
+[2014-10-12T12:56:24.329Z] 2
+[2014-10-12T12:56:24.331Z] 2
+[2014-10-12T12:56:24.339Z] 2
+[2014-10-12T12:56:24.339Z] [7] Listening on port: port 4080
+[2014-10-12T12:56:24.340Z] [3] Listening on port: port 4080
+[2014-10-12T12:56:24.340Z] [7] Listening on port: port 40443
+[2014-10-12T12:56:24.340Z] [3] Listening on port: port 40443
+[2014-10-12T12:56:24.340Z] [3] Start successful
+[2014-10-12T12:56:24.341Z] [7] Start successful
+[2014-10-12T12:56:24.347Z] [5] Listening on port: port 4080
+[2014-10-12T12:56:24.348Z] [5] Listening on port: port 40443
+[2014-10-12T12:56:24.348Z] [5] Start successful
+[2014-10-12T12:56:24.348Z] All workers started in 276ms
+[2014-10-12T12:56:25.102Z] Target [object Object]
+[2014-10-12T12:56:25.102Z] 1
+[2014-10-12T12:56:25.103Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:25.245Z] Target [object Object]
+[2014-10-12T12:56:25.245Z] 1
+[2014-10-12T12:56:25.245Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:25.697Z] Target [object Object]
+[2014-10-12T12:56:25.697Z] 1
+[2014-10-12T12:56:25.697Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:25.782Z] Target [object Object]
+[2014-10-12T12:56:25.782Z] 1
+[2014-10-12T12:56:25.782Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:25.953Z] Target [object Object]
+[2014-10-12T12:56:25.953Z] 1
+[2014-10-12T12:56:25.954Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:26.041Z] Target [object Object]
+[2014-10-12T12:56:26.043Z] 1
+[2014-10-12T12:56:26.043Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:26.155Z] Target [object Object]
+[2014-10-12T12:56:26.155Z] 1
+[2014-10-12T12:56:26.156Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:56:26.251Z] Target [object Object]
+[2014-10-12T12:56:26.251Z] 1
+[2014-10-12T12:56:26.251Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:57:01.739Z] 1
+[2014-10-12T12:57:01.748Z] 1
+[2014-10-12T12:57:01.751Z] ENTRY test.log
+[2014-10-12T12:57:01.758Z] 1
+[2014-10-12T12:57:01.762Z] ENTRY test.log
+[2014-10-12T12:57:01.769Z] 2
+[2014-10-12T12:57:01.770Z] 1
+[2014-10-12T12:57:01.771Z] ENTRY test.log
+[2014-10-12T12:57:01.779Z] 2
+[2014-10-12T12:57:01.782Z] ENTRY test.log
+[2014-10-12T12:57:01.783Z] [6] Listening on port: port 4080
+[2014-10-12T12:57:01.784Z] [6] Listening on port: port 40443
+[2014-10-12T12:57:01.784Z] [6] Start successful
+[2014-10-12T12:57:01.790Z] 1
+[2014-10-12T12:57:01.792Z] 2
+[2014-10-12T12:57:01.795Z] [2] Listening on port: port 4080
+[2014-10-12T12:57:01.796Z] [2] Listening on port: port 40443
+[2014-10-12T12:57:01.796Z] [2] Start successful
+[2014-10-12T12:57:01.799Z] 2
+[2014-10-12T12:57:01.801Z] 1
+[2014-10-12T12:57:01.802Z] ENTRY test.log
+[2014-10-12T12:57:01.804Z] [3] Listening on port: port 4080
+[2014-10-12T12:57:01.805Z] [3] Listening on port: port 40443
+[2014-10-12T12:57:01.805Z] [3] Start successful
+[2014-10-12T12:57:01.809Z] ENTRY test.log
+[2014-10-12T12:57:01.813Z] [1] Listening on port: port 4080
+[2014-10-12T12:57:01.814Z] 1
+[2014-10-12T12:57:01.814Z] [1] Listening on port: port 40443
+[2014-10-12T12:57:01.814Z] [1] Start successful
+[2014-10-12T12:57:01.815Z] 1
+[2014-10-12T12:57:01.820Z] 2
+[2014-10-12T12:57:01.823Z] ENTRY test.log
+[2014-10-12T12:57:01.823Z] 2
+[2014-10-12T12:57:01.825Z] ENTRY test.log
+[2014-10-12T12:57:01.834Z] 2
+[2014-10-12T12:57:01.835Z] [8] Listening on port: port 4080
+[2014-10-12T12:57:01.836Z] [8] Listening on port: port 40443
+[2014-10-12T12:57:01.837Z] [8] Start successful
+[2014-10-12T12:57:01.838Z] [4] Listening on port: port 4080
+[2014-10-12T12:57:01.838Z] [4] Listening on port: port 40443
+[2014-10-12T12:57:01.838Z] [4] Start successful
+[2014-10-12T12:57:01.840Z] 2
+[2014-10-12T12:57:01.845Z] [5] Listening on port: port 4080
+[2014-10-12T12:57:01.846Z] [5] Listening on port: port 40443
+[2014-10-12T12:57:01.846Z] [5] Start successful
+[2014-10-12T12:57:01.848Z] [7] Listening on port: port 4080
+[2014-10-12T12:57:01.849Z] [7] Listening on port: port 40443
+[2014-10-12T12:57:01.849Z] [7] Start successful
+[2014-10-12T12:57:01.850Z] All workers started in 275ms
+[2014-10-12T12:59:34.445Z] 1
+[2014-10-12T12:59:34.447Z] 1
+[2014-10-12T12:59:34.447Z] 1
+[2014-10-12T12:59:34.460Z] ENTRY test.log
+[2014-10-12T12:59:34.462Z] ENTRY test.log
+[2014-10-12T12:59:34.466Z] ENTRY test.log
+[2014-10-12T12:59:34.469Z] 1
+[2014-10-12T12:59:34.480Z] 1
+[2014-10-12T12:59:34.481Z] 2
+[2014-10-12T12:59:34.481Z] ENTRY test.log
+[2014-10-12T12:59:34.483Z] 2
+[2014-10-12T12:59:34.484Z] 1
+[2014-10-12T12:59:34.486Z] 1
+[2014-10-12T12:59:34.488Z] 2
+[2014-10-12T12:59:34.494Z] ENTRY test.log
+[2014-10-12T12:59:34.496Z] [2] Listening on port: port 4080
+[2014-10-12T12:59:34.496Z] [5] Listening on port: port 4080
+[2014-10-12T12:59:34.497Z] [2] Listening on port: port 40443
+[2014-10-12T12:59:34.497Z] [2] Start successful
+[2014-10-12T12:59:34.497Z] ENTRY test.log
+[2014-10-12T12:59:34.497Z] [5] Listening on port: port 40443
+[2014-10-12T12:59:34.497Z] [5] Start successful
+[2014-10-12T12:59:34.498Z] 2
+[2014-10-12T12:59:34.499Z] ENTRY test.log
+[2014-10-12T12:59:34.505Z] 1
+[2014-10-12T12:59:34.506Z] [4] Listening on port: port 4080
+[2014-10-12T12:59:34.507Z] [4] Listening on port: port 40443
+[2014-10-12T12:59:34.507Z] [4] Start successful
+[2014-10-12T12:59:34.511Z] 2
+[2014-10-12T12:59:34.511Z] [6] Listening on port: port 4080
+[2014-10-12T12:59:34.512Z] [6] Listening on port: port 40443
+[2014-10-12T12:59:34.512Z] [6] Start successful
+[2014-10-12T12:59:34.513Z] 2
+[2014-10-12T12:59:34.514Z] ENTRY test.log
+[2014-10-12T12:59:34.515Z] 2
+[2014-10-12T12:59:34.520Z] [8] Listening on port: port 4080
+[2014-10-12T12:59:34.520Z] [8] Listening on port: port 40443
+[2014-10-12T12:59:34.520Z] [8] Start successful
+[2014-10-12T12:59:34.523Z] [1] Listening on port: port 4080
+[2014-10-12T12:59:34.523Z] [3] Listening on port: port 4080
+[2014-10-12T12:59:34.523Z] [1] Listening on port: port 40443
+[2014-10-12T12:59:34.523Z] [1] Start successful
+[2014-10-12T12:59:34.524Z] [3] Listening on port: port 40443
+[2014-10-12T12:59:34.524Z] [3] Start successful
+[2014-10-12T12:59:34.524Z] 2
+[2014-10-12T12:59:34.533Z] [7] Listening on port: port 4080
+[2014-10-12T12:59:34.534Z] [7] Listening on port: port 40443
+[2014-10-12T12:59:34.534Z] [7] Start successful
+[2014-10-12T12:59:34.534Z] All workers started in 272ms
+[2014-10-12T12:59:40.295Z] Target [object Object]
+[2014-10-12T12:59:40.295Z] 1
+[2014-10-12T12:59:40.295Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:59:40.436Z] Target [object Object]
+[2014-10-12T12:59:40.436Z] 1
+[2014-10-12T12:59:40.436Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:59:50.379Z] 1
+[2014-10-12T12:59:50.390Z] ENTRY test.log
+[2014-10-12T12:59:50.393Z] 1
+[2014-10-12T12:59:50.395Z] 1
+[2014-10-12T12:59:50.403Z] 1
+[2014-10-12T12:59:50.407Z] 1
+[2014-10-12T12:59:50.407Z] ENTRY test.log
+[2014-10-12T12:59:50.408Z] ENTRY test.log
+[2014-10-12T12:59:50.409Z] 2
+[2014-10-12T12:59:50.417Z] ENTRY test.log
+[2014-10-12T12:59:50.418Z] 1
+[2014-10-12T12:59:50.419Z] ENTRY test.log
+[2014-10-12T12:59:50.423Z] [7] Listening on port: port 4080
+[2014-10-12T12:59:50.424Z] [7] Listening on port: port 40443
+[2014-10-12T12:59:50.424Z] [7] Start successful
+[2014-10-12T12:59:50.425Z] 2
+[2014-10-12T12:59:50.426Z] 2
+[2014-10-12T12:59:50.431Z] ENTRY test.log
+[2014-10-12T12:59:50.436Z] 2
+[2014-10-12T12:59:50.436Z] 2
+[2014-10-12T12:59:50.441Z] [3] Listening on port: port 4080
+[2014-10-12T12:59:50.442Z] [3] Listening on port: port 40443
+[2014-10-12T12:59:50.442Z] [3] Start successful
+[2014-10-12T12:59:50.444Z] 1
+[2014-10-12T12:59:50.445Z] [4] Listening on port: port 4080
+[2014-10-12T12:59:50.446Z] [4] Listening on port: port 40443
+[2014-10-12T12:59:50.446Z] [4] Start successful
+[2014-10-12T12:59:50.447Z] 2
+[2014-10-12T12:59:50.450Z] [5] Listening on port: port 4080
+[2014-10-12T12:59:50.450Z] [1] Listening on port: port 4080
+[2014-10-12T12:59:50.451Z] [1] Listening on port: port 40443
+[2014-10-12T12:59:50.451Z] [5] Listening on port: port 40443
+[2014-10-12T12:59:50.451Z] [5] Start successful
+[2014-10-12T12:59:50.451Z] [1] Start successful
+[2014-10-12T12:59:50.452Z] ENTRY test.log
+[2014-10-12T12:59:50.455Z] [6] Listening on port: port 4080
+[2014-10-12T12:59:50.455Z] [6] Listening on port: port 40443
+[2014-10-12T12:59:50.456Z] [6] Start successful
+[2014-10-12T12:59:50.462Z] 2
+[2014-10-12T12:59:50.466Z] 1
+[2014-10-12T12:59:50.470Z] [2] Listening on port: port 4080
+[2014-10-12T12:59:50.471Z] [2] Listening on port: port 40443
+[2014-10-12T12:59:50.471Z] [2] Start successful
+[2014-10-12T12:59:50.473Z] ENTRY test.log
+[2014-10-12T12:59:50.485Z] 2
+[2014-10-12T12:59:50.492Z] [8] Listening on port: port 4080
+[2014-10-12T12:59:50.493Z] [8] Listening on port: port 40443
+[2014-10-12T12:59:50.493Z] [8] Start successful
+[2014-10-12T12:59:50.493Z] All workers started in 277ms
+[2014-10-12T12:59:52.725Z] Target [object Object]
+[2014-10-12T12:59:52.725Z] 1
+[2014-10-12T12:59:52.725Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:59:52.830Z] Target [object Object]
+[2014-10-12T12:59:52.830Z] 1
+[2014-10-12T12:59:52.830Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:59:53.200Z] Target [object Object]
+[2014-10-12T12:59:53.200Z] 1
+[2014-10-12T12:59:53.200Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:59:53.287Z] Target [object Object]
+[2014-10-12T12:59:53.287Z] 1
+[2014-10-12T12:59:53.287Z] Request handler proxy 4000/test/[path]
+[2014-10-12T12:59:58.406Z] 1
+[2014-10-12T12:59:58.416Z] 1
+[2014-10-12T12:59:58.418Z] ENTRY test.log
+[2014-10-12T12:59:58.420Z] 1
+[2014-10-12T12:59:58.424Z] 1
+[2014-10-12T12:59:58.427Z] 1
+[2014-10-12T12:59:58.430Z] ENTRY test.log
+[2014-10-12T12:59:58.432Z] ENTRY test.log
+[2014-10-12T12:59:58.434Z] 1
+[2014-10-12T12:59:58.436Z] 2
+[2014-10-12T12:59:58.437Z] ENTRY test.log
+[2014-10-12T12:59:58.441Z] ENTRY test.log
+[2014-10-12T12:59:58.442Z] 1
+[2014-10-12T12:59:58.444Z] 1
+[2014-10-12T12:59:58.447Z] ENTRY test.log
+[2014-10-12T12:59:58.450Z] 2
+[2014-10-12T12:59:58.450Z] [1] Listening on port: port 4080
+[2014-10-12T12:59:58.450Z] 2
+[2014-10-12T12:59:58.451Z] [1] Listening on port: port 40443
+[2014-10-12T12:59:58.451Z] [1] Start successful
+[2014-10-12T12:59:58.454Z] 2
+[2014-10-12T12:59:58.454Z] ENTRY test.log
+[2014-10-12T12:59:58.454Z] ENTRY test.log
+[2014-10-12T12:59:58.461Z] 2
+[2014-10-12T12:59:58.464Z] [2] Listening on port: port 4080
+[2014-10-12T12:59:58.465Z] 2
+[2014-10-12T12:59:58.465Z] [2] Listening on port: port 40443
+[2014-10-12T12:59:58.465Z] [2] Start successful
+[2014-10-12T12:59:58.466Z] [3] Listening on port: port 4080
+[2014-10-12T12:59:58.467Z] [3] Listening on port: port 40443
+[2014-10-12T12:59:58.467Z] [3] Start successful
+[2014-10-12T12:59:58.468Z] [4] Listening on port: port 4080
+[2014-10-12T12:59:58.469Z] [4] Listening on port: port 40443
+[2014-10-12T12:59:58.469Z] [4] Start successful
+[2014-10-12T12:59:58.469Z] 2
+[2014-10-12T12:59:58.469Z] 2
+[2014-10-12T12:59:58.475Z] [6] Listening on port: port 4080
+[2014-10-12T12:59:58.476Z] [5] Listening on port: port 4080
+[2014-10-12T12:59:58.476Z] [6] Listening on port: port 40443
+[2014-10-12T12:59:58.476Z] [6] Start successful
+[2014-10-12T12:59:58.476Z] [5] Listening on port: port 40443
+[2014-10-12T12:59:58.476Z] [5] Start successful
+[2014-10-12T12:59:58.477Z] [8] Listening on port: port 4080
+[2014-10-12T12:59:58.478Z] [8] Listening on port: port 40443
+[2014-10-12T12:59:58.478Z] [8] Start successful
+[2014-10-12T12:59:58.480Z] [7] Listening on port: port 4080
+[2014-10-12T12:59:58.481Z] [7] Listening on port: port 40443
+[2014-10-12T12:59:58.481Z] [7] Start successful
+[2014-10-12T12:59:58.482Z] All workers started in 247ms
+[2014-10-12T13:00:34.039Z] 1
+[2014-10-12T13:00:34.049Z] ENTRY test.log
+[2014-10-12T13:00:34.050Z] 1
+[2014-10-12T13:00:34.062Z] 1
+[2014-10-12T13:00:34.065Z] 2
+[2014-10-12T13:00:34.072Z] ENTRY test.log
+[2014-10-12T13:00:34.074Z] ENTRY test.log
+[2014-10-12T13:00:34.076Z] 1
+[2014-10-12T13:00:34.079Z] [4] Listening on port: port 4080
+[2014-10-12T13:00:34.080Z] [4] Listening on port: port 40443
+[2014-10-12T13:00:34.081Z] [4] Start successful
+[2014-10-12T13:00:34.088Z] ENTRY test.log
+[2014-10-12T13:00:34.089Z] 1
+[2014-10-12T13:00:34.092Z] 2
+[2014-10-12T13:00:34.097Z] 2
+[2014-10-12T13:00:34.102Z] ENTRY test.log
+[2014-10-12T13:00:34.104Z] 1
+[2014-10-12T13:00:34.105Z] 2
+[2014-10-12T13:00:34.107Z] [1] Listening on port: port 4080
+[2014-10-12T13:00:34.107Z] [1] Listening on port: port 40443
+[2014-10-12T13:00:34.107Z] [1] Start successful
+[2014-10-12T13:00:34.115Z] 2
+[2014-10-12T13:00:34.116Z] ENTRY test.log
+[2014-10-12T13:00:34.117Z] [3] Listening on port: port 4080
+[2014-10-12T13:00:34.119Z] [7] Listening on port: port 4080
+[2014-10-12T13:00:34.119Z] [3] Listening on port: port 40443
+[2014-10-12T13:00:34.120Z] [3] Start successful
+[2014-10-12T13:00:34.120Z] [7] Listening on port: port 40443
+[2014-10-12T13:00:34.120Z] [7] Start successful
+[2014-10-12T13:00:34.123Z] [6] Listening on port: port 4080
+[2014-10-12T13:00:34.124Z] [6] Listening on port: port 40443
+[2014-10-12T13:00:34.124Z] [6] Start successful
+[2014-10-12T13:00:34.128Z] 2
+[2014-10-12T13:00:34.134Z] 1
+[2014-10-12T13:00:34.136Z] [2] Listening on port: port 4080
+[2014-10-12T13:00:34.137Z] [2] Listening on port: port 40443
+[2014-10-12T13:00:34.137Z] [2] Start successful
+[2014-10-12T13:00:34.138Z] 1
+[2014-10-12T13:00:34.142Z] ENTRY test.log
+[2014-10-12T13:00:34.147Z] ENTRY test.log
+[2014-10-12T13:00:34.152Z] 2
+[2014-10-12T13:00:34.157Z] 2
+[2014-10-12T13:00:34.160Z] [5] Listening on port: port 4080
+[2014-10-12T13:00:34.161Z] [5] Listening on port: port 40443
+[2014-10-12T13:00:34.161Z] [5] Start successful
+[2014-10-12T13:00:34.165Z] [8] Listening on port: port 4080
+[2014-10-12T13:00:34.165Z] [8] Listening on port: port 40443
+[2014-10-12T13:00:34.166Z] [8] Start successful
+[2014-10-12T13:00:34.166Z] All workers started in 281ms
+[2014-10-12T13:01:03.342Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.349Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.352Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.352Z] ENTRY test.log
+[2014-10-12T13:01:03.360Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.361Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.363Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.363Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.363Z] ENTRY test.log
+[2014-10-12T13:01:03.364Z] ENTRY test.log
+[2014-10-12T13:01:03.370Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.373Z] ENTRY test.log
+[2014-10-12T13:01:03.373Z] ENTRY test.log
+[2014-10-12T13:01:03.374Z] ENTRY test.log
+[2014-10-12T13:01:03.374Z] ENTRY test.log
+[2014-10-12T13:01:03.381Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.384Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.385Z] [2] Listening on port: port 4080
+[2014-10-12T13:01:03.386Z] [2] Listening on port: port 40443
+[2014-10-12T13:01:03.386Z] [2] Start successful
+[2014-10-12T13:01:03.390Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.391Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.391Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.396Z] [3] Listening on port: port 4080
+[2014-10-12T13:01:03.397Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.397Z] [3] Listening on port: port 40443
+[2014-10-12T13:01:03.397Z] [3] Start successful
+[2014-10-12T13:01:03.397Z] [4] Listening on port: port 4080
+[2014-10-12T13:01:03.398Z] [4] Listening on port: port 40443
+[2014-10-12T13:01:03.398Z] [4] Start successful
+[2014-10-12T13:01:03.400Z] [5] Listening on port: port 4080
+[2014-10-12T13:01:03.400Z] [5] Listening on port: port 40443
+[2014-10-12T13:01:03.400Z] [5] Start successful
+[2014-10-12T13:01:03.401Z] [8] Listening on port: port 4080
+[2014-10-12T13:01:03.402Z] [8] Listening on port: port 40443
+[2014-10-12T13:01:03.402Z] [8] Start successful
+[2014-10-12T13:01:03.404Z] [7] Listening on port: port 4080
+[2014-10-12T13:01:03.404Z] [7] Listening on port: port 40443
+[2014-10-12T13:01:03.405Z] [7] Start successful
+[2014-10-12T13:01:03.406Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:03.408Z] [6] Listening on port: port 4080
+[2014-10-12T13:01:03.409Z] [6] Listening on port: port 40443
+[2014-10-12T13:01:03.409Z] [6] Start successful
+[2014-10-12T13:01:03.413Z] ENTRY test.log
+[2014-10-12T13:01:03.423Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:03.431Z] [1] Listening on port: port 4080
+[2014-10-12T13:01:03.432Z] [1] Listening on port: port 40443
+[2014-10-12T13:01:03.432Z] [1] Start successful
+[2014-10-12T13:01:03.432Z] All workers started in 276ms
+[2014-10-12T13:01:54.694Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:01:54.700Z] ENTRY test.log
+[2014-10-12T13:01:54.709Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:01:54.717Z] [1] Listening on port: port 4080
+[2014-10-12T13:01:54.717Z] [1] Listening on port: port 40443
+[2014-10-12T13:01:54.717Z] [1] Start successful
+[2014-10-12T13:01:54.718Z] All workers started in 135ms
+[2014-10-12T13:02:39.047Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:02:39.054Z] ENTRY test.log
+[2014-10-12T13:02:39.063Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:02:39.072Z] [1] Listening on port: port 4080
+[2014-10-12T13:02:39.073Z] [1] Listening on port: port 40443
+[2014-10-12T13:02:39.073Z] [1] Start successful
+[2014-10-12T13:02:39.074Z] All workers started in 141ms
+[2014-10-12T13:02:39.937Z] Target [object Object]
+[2014-10-12T13:02:39.937Z] 1
+[2014-10-12T13:02:39.937Z] 0
+[2014-10-12T13:02:39.938Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:40.084Z] Target [object Object]
+[2014-10-12T13:02:40.084Z] 1
+[2014-10-12T13:02:40.084Z] 0
+[2014-10-12T13:02:40.084Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:40.593Z] Target [object Object]
+[2014-10-12T13:02:40.593Z] 1
+[2014-10-12T13:02:40.593Z] 0
+[2014-10-12T13:02:40.593Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:40.679Z] Target [object Object]
+[2014-10-12T13:02:40.679Z] 1
+[2014-10-12T13:02:40.679Z] 0
+[2014-10-12T13:02:40.679Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:41.084Z] Target [object Object]
+[2014-10-12T13:02:41.084Z] 1
+[2014-10-12T13:02:41.085Z] 0
+[2014-10-12T13:02:41.085Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:41.174Z] Target [object Object]
+[2014-10-12T13:02:41.174Z] 1
+[2014-10-12T13:02:41.174Z] 0
+[2014-10-12T13:02:41.174Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:41.508Z] Target [object Object]
+[2014-10-12T13:02:41.508Z] 1
+[2014-10-12T13:02:41.508Z] 0
+[2014-10-12T13:02:41.508Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:41.607Z] Target [object Object]
+[2014-10-12T13:02:41.607Z] 1
+[2014-10-12T13:02:41.607Z] 0
+[2014-10-12T13:02:41.607Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:41.885Z] Target [object Object]
+[2014-10-12T13:02:41.885Z] 1
+[2014-10-12T13:02:41.885Z] 0
+[2014-10-12T13:02:41.885Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:41.981Z] Target [object Object]
+[2014-10-12T13:02:41.981Z] 1
+[2014-10-12T13:02:41.981Z] 0
+[2014-10-12T13:02:41.981Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:42.140Z] Target [object Object]
+[2014-10-12T13:02:42.141Z] 1
+[2014-10-12T13:02:42.141Z] 0
+[2014-10-12T13:02:42.141Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:42.236Z] Target [object Object]
+[2014-10-12T13:02:42.236Z] 1
+[2014-10-12T13:02:42.236Z] 0
+[2014-10-12T13:02:42.236Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:42.400Z] Target [object Object]
+[2014-10-12T13:02:42.400Z] 1
+[2014-10-12T13:02:42.400Z] 0
+[2014-10-12T13:02:42.400Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:42.489Z] Target [object Object]
+[2014-10-12T13:02:42.490Z] 1
+[2014-10-12T13:02:42.490Z] 0
+[2014-10-12T13:02:42.490Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:42.652Z] Target [object Object]
+[2014-10-12T13:02:42.653Z] 1
+[2014-10-12T13:02:42.654Z] 0
+[2014-10-12T13:02:42.654Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:02:42.755Z] Target [object Object]
+[2014-10-12T13:02:42.755Z] 1
+[2014-10-12T13:02:42.755Z] 0
+[2014-10-12T13:02:42.755Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:03:38.541Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:03:38.547Z] ENTRY test.log
+[2014-10-12T13:03:38.557Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:03:38.564Z] [1] Listening on port: port 4080
+[2014-10-12T13:03:38.565Z] [1] Listening on port: port 40443
+[2014-10-12T13:03:38.565Z] [1] Start successful
+[2014-10-12T13:03:38.565Z] All workers started in 138ms
+[2014-10-12T13:03:42.225Z] Target [object Object]
+[2014-10-12T13:03:42.225Z] 1
+[2014-10-12T13:03:42.225Z] 0
+[2014-10-12T13:03:42.225Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:03:42.357Z] Target [object Object]
+[2014-10-12T13:03:42.357Z] 1
+[2014-10-12T13:03:42.357Z] 0
+[2014-10-12T13:03:42.357Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:03:58.767Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:03:58.772Z] ENTRY test.log
+[2014-10-12T13:03:58.782Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:03:58.790Z] [1] Listening on port: port 4080
+[2014-10-12T13:03:58.790Z] [1] Listening on port: port 40443
+[2014-10-12T13:03:58.790Z] [1] Start successful
+[2014-10-12T13:03:58.791Z] All workers started in 135ms
+[2014-10-12T13:03:59.746Z] Target [object Object]
+[2014-10-12T13:03:59.747Z] 1
+[2014-10-12T13:03:59.747Z] 0 { middleware: [Function] }
+[2014-10-12T13:03:59.747Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:03:59.859Z] Target [object Object]
+[2014-10-12T13:03:59.859Z] 1
+[2014-10-12T13:03:59.859Z] 0 { middleware: [Function] }
+[2014-10-12T13:03:59.859Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:00.439Z] Target [object Object]
+[2014-10-12T13:04:00.439Z] 1
+[2014-10-12T13:04:00.439Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:00.439Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:00.529Z] Target [object Object]
+[2014-10-12T13:04:00.529Z] 1
+[2014-10-12T13:04:00.529Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:00.529Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:00.736Z] Target [object Object]
+[2014-10-12T13:04:00.736Z] 1
+[2014-10-12T13:04:00.736Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:00.736Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:00.825Z] Target [object Object]
+[2014-10-12T13:04:00.825Z] 1
+[2014-10-12T13:04:00.825Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:00.825Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:01.014Z] Target [object Object]
+[2014-10-12T13:04:01.014Z] 1
+[2014-10-12T13:04:01.014Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:01.014Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:01.105Z] Target [object Object]
+[2014-10-12T13:04:01.105Z] 1
+[2014-10-12T13:04:01.105Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:01.105Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:16.390Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:04:16.396Z] ENTRY test.log
+[2014-10-12T13:04:16.406Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:04:16.414Z] [1] Listening on port: port 4080
+[2014-10-12T13:04:16.414Z] [1] Listening on port: port 40443
+[2014-10-12T13:04:16.415Z] [1] Start successful
+[2014-10-12T13:04:16.415Z] All workers started in 146ms
+[2014-10-12T13:04:17.262Z] Target [object Object]
+[2014-10-12T13:04:17.262Z] Middleware length 1
+[2014-10-12T13:04:17.262Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:17.263Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:17.382Z] Target [object Object]
+[2014-10-12T13:04:17.382Z] Middleware length 1
+[2014-10-12T13:04:17.382Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:17.382Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:18.304Z] Target [object Object]
+[2014-10-12T13:04:18.304Z] Middleware length 1
+[2014-10-12T13:04:18.304Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:18.304Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:18.406Z] Target [object Object]
+[2014-10-12T13:04:18.406Z] Middleware length 1
+[2014-10-12T13:04:18.407Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:18.407Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:18.818Z] Target [object Object]
+[2014-10-12T13:04:18.818Z] Middleware length 1
+[2014-10-12T13:04:18.818Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:18.818Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:18.910Z] Target [object Object]
+[2014-10-12T13:04:18.910Z] Middleware length 1
+[2014-10-12T13:04:18.910Z] 0 { middleware: [Function] }
+[2014-10-12T13:04:18.910Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:04:46.683Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:04:46.689Z] ENTRY test.log
+[2014-10-12T13:04:46.699Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:04:46.707Z] [1] Listening on port: port 4080
+[2014-10-12T13:04:46.707Z] [1] Listening on port: port 40443
+[2014-10-12T13:04:46.708Z] [1] Start successful
+[2014-10-12T13:04:46.708Z] All workers started in 138ms
+[2014-10-12T13:05:21.164Z] Target [object Object]
+[2014-10-12T13:05:21.164Z] Middleware length 1
+[2014-10-12T13:05:21.164Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:21.165Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:21.314Z] Target [object Object]
+[2014-10-12T13:05:21.315Z] Middleware length 1
+[2014-10-12T13:05:21.315Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:21.315Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:21.944Z] Target [object Object]
+[2014-10-12T13:05:21.945Z] Middleware length 1
+[2014-10-12T13:05:21.945Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:21.945Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:22.071Z] Target [object Object]
+[2014-10-12T13:05:22.071Z] Middleware length 1
+[2014-10-12T13:05:22.072Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:22.072Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:22.564Z] Target [object Object]
+[2014-10-12T13:05:22.564Z] Middleware length 1
+[2014-10-12T13:05:22.564Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:22.564Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:22.662Z] Target [object Object]
+[2014-10-12T13:05:22.662Z] Middleware length 1
+[2014-10-12T13:05:22.662Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:22.662Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:44.870Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:05:44.876Z] ENTRY test.log
+[2014-10-12T13:05:44.886Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:05:44.896Z] [1] Listening on port: port 4080
+[2014-10-12T13:05:44.896Z] [1] Listening on port: port 40443
+[2014-10-12T13:05:44.897Z] [1] Start successful
+[2014-10-12T13:05:44.897Z] All workers started in 140ms
+[2014-10-12T13:05:45.685Z] Target {}
+[2014-10-12T13:05:45.685Z] Middleware length 1
+[2014-10-12T13:05:45.685Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:45.685Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:45.800Z] Target {}
+[2014-10-12T13:05:45.800Z] Middleware length 1
+[2014-10-12T13:05:45.800Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:45.800Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:46.443Z] Target {}
+[2014-10-12T13:05:46.443Z] Middleware length 1
+[2014-10-12T13:05:46.443Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:46.443Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:46.529Z] Target {}
+[2014-10-12T13:05:46.529Z] Middleware length 1
+[2014-10-12T13:05:46.529Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:46.529Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:46.751Z] Target {}
+[2014-10-12T13:05:46.751Z] Middleware length 1
+[2014-10-12T13:05:46.752Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:46.752Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:46.841Z] Target {}
+[2014-10-12T13:05:46.841Z] Middleware length 1
+[2014-10-12T13:05:46.841Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:46.841Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:57.607Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:05:57.614Z] ENTRY test.log
+[2014-10-12T13:05:57.623Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:05:57.630Z] [1] Listening on port: port 4080
+[2014-10-12T13:05:57.631Z] [1] Listening on port: port 40443
+[2014-10-12T13:05:57.631Z] [1] Start successful
+[2014-10-12T13:05:57.632Z] All workers started in 138ms
+[2014-10-12T13:05:58.222Z] Target [object Object]
+[2014-10-12T13:05:58.223Z] Middleware length 1
+[2014-10-12T13:05:58.223Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:58.223Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:05:58.360Z] Target [object Object]
+[2014-10-12T13:05:58.360Z] Middleware length 1
+[2014-10-12T13:05:58.360Z] 0 { middleware: [Function] }
+[2014-10-12T13:05:58.360Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:10.551Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:06:10.557Z] ENTRY test.log
+[2014-10-12T13:06:10.567Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:06:10.574Z] [1] Listening on port: port 4080
+[2014-10-12T13:06:10.575Z] [1] Listening on port: port 40443
+[2014-10-12T13:06:10.575Z] [1] Start successful
+[2014-10-12T13:06:10.575Z] All workers started in 138ms
+[2014-10-12T13:06:11.288Z] Target middleware
+[2014-10-12T13:06:11.288Z] Middleware length 1
+[2014-10-12T13:06:11.288Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:11.289Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:11.386Z] Target middleware
+[2014-10-12T13:06:11.386Z] Middleware length 1
+[2014-10-12T13:06:11.386Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:11.386Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:11.907Z] Target middleware
+[2014-10-12T13:06:11.907Z] Middleware length 1
+[2014-10-12T13:06:11.907Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:11.907Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:12.003Z] Target middleware
+[2014-10-12T13:06:12.003Z] Middleware length 1
+[2014-10-12T13:06:12.003Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:12.003Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:12.183Z] Target middleware
+[2014-10-12T13:06:12.183Z] Middleware length 1
+[2014-10-12T13:06:12.183Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:12.183Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:12.271Z] Target middleware
+[2014-10-12T13:06:12.271Z] Middleware length 1
+[2014-10-12T13:06:12.271Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:12.271Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:12.413Z] Target middleware
+[2014-10-12T13:06:12.414Z] Middleware length 1
+[2014-10-12T13:06:12.414Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:12.414Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:06:12.504Z] Target middleware
+[2014-10-12T13:06:12.504Z] Middleware length 1
+[2014-10-12T13:06:12.504Z] 0 { middleware: [Function] }
+[2014-10-12T13:06:12.504Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:09:42.408Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:09:42.414Z] ENTRY test.log
+[2014-10-12T13:09:42.424Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:09:42.432Z] [1] Listening on port: port 4080
+[2014-10-12T13:09:42.432Z] [1] Listening on port: port 40443
+[2014-10-12T13:09:42.432Z] [1] Start successful
+[2014-10-12T13:09:42.433Z] All workers started in 137ms
+[2014-10-12T13:10:23.677Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:10:23.683Z] ENTRY test.log
+[2014-10-12T13:10:23.694Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:10:23.703Z] [1] Listening on port: port 4080
+[2014-10-12T13:10:23.704Z] [1] Listening on port: port 40443
+[2014-10-12T13:10:23.704Z] [1] Start successful
+[2014-10-12T13:10:23.704Z] All workers started in 143ms
+[2014-10-12T13:10:26.598Z] Target middleware
+[2014-10-12T13:10:26.598Z] Middleware length 1
+[2014-10-12T13:10:26.598Z] 0 { middleware: [Function] }
+[2014-10-12T13:10:26.599Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:10:26.607Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:10:26.736Z] Target middleware
+[2014-10-12T13:10:26.736Z] Middleware length 1
+[2014-10-12T13:10:26.736Z] 0 { middleware: [Function] }
+[2014-10-12T13:10:26.736Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:10:26.738Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:11:16.604Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:11:16.606Z] BLAH!!
+[2014-10-12T13:11:16.610Z] ENTRY test.log
+[2014-10-12T13:11:16.622Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:11:16.631Z] [1] Listening on port: port 4080
+[2014-10-12T13:11:16.631Z] [1] Listening on port: port 40443
+[2014-10-12T13:11:16.631Z] [1] Start successful
+[2014-10-12T13:11:16.632Z] All workers started in 142ms
+[2014-10-12T13:11:29.948Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:11:29.951Z] [1] [Uncaught exception] TypeError: Object.keys called on non-object
+ at Function.keys (native)
+ at new DispatchTable (/home/rush/Programowanie/http-master/src/DispatchTable.js:78:10)
+ at /home/rush/Programowanie/http-master/modules/middleware/router.js:74:29
+ at Array.map (native)
+ at Object.RouterMiddleware.entryParser (/home/rush/Programowanie/http-master/modules/middleware/router.js:69:42)
+ at EventEmitter.createHandlers (/home/rush/Programowanie/http-master/src/HttpMasterWorker.js:193:23)
+ at EventEmitter.handleConfigEntryAfterLoadingKeys (/home/rush/Programowanie/http-master/src/HttpMasterWorker.js:210:33)
+ at /home/rush/Programowanie/http-master/src/HttpMasterWorker.js:127:39
+ at loadKeysforConfigEntry (/home/rush/Programowanie/http-master/src/HttpMasterWorker.js:113:7)
+ at EventEmitter.handlePortEntryConfig (/home/rush/Programowanie/http-master/src/HttpMasterWorker.js:123:3)
+[2014-10-12T13:11:29.952Z] Worker 1 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:30.050Z] Worker 2 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:30.148Z] Worker 3 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:30.249Z] Worker 4 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:30.348Z] Worker 5 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:30.446Z] Worker 6 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:30.547Z] Worker 7 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:30.647Z] Worker 8 failed with code 1/null ... starting replacement
+[2014-10-12T13:11:34.971Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:11:34.977Z] ENTRY test.log
+[2014-10-12T13:11:34.987Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:11:34.996Z] [1] Listening on port: port 4080
+[2014-10-12T13:11:34.997Z] [1] Listening on port: port 40443
+[2014-10-12T13:11:34.997Z] [1] Start successful
+[2014-10-12T13:11:34.998Z] All workers started in 143ms
+[2014-10-12T13:12:06.285Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:12:06.288Z] PARSE SINGLE ENTRY log -> test.log
+[2014-10-12T13:12:06.291Z] ENTRY test.log
+[2014-10-12T13:12:06.302Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:12:06.312Z] [1] Listening on port: port 4080
+[2014-10-12T13:12:06.313Z] [1] Listening on port: port 40443
+[2014-10-12T13:12:06.313Z] [1] Start successful
+[2014-10-12T13:12:06.313Z] All workers started in 148ms
+[2014-10-12T13:12:33.591Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:12:33.598Z] ENTRY test.log
+[2014-10-12T13:12:33.609Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:12:33.618Z] [1] Listening on port: port 4080
+[2014-10-12T13:12:33.619Z] [1] Listening on port: port 40443
+[2014-10-12T13:12:33.619Z] [1] Start successful
+[2014-10-12T13:12:33.620Z] All workers started in 146ms
+[2014-10-12T13:12:34.475Z] Target middleware
+[2014-10-12T13:12:34.475Z] Middleware length 1
+[2014-10-12T13:12:34.475Z] 0 { middleware: [Function] }
+[2014-10-12T13:12:34.475Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:12:34.482Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:12:34.589Z] Target middleware
+[2014-10-12T13:12:34.589Z] Middleware length 1
+[2014-10-12T13:12:34.590Z] 0 { middleware: [Function] }
+[2014-10-12T13:12:34.590Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:12:34.593Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:12:34.970Z] Target middleware
+[2014-10-12T13:12:34.970Z] Middleware length 1
+[2014-10-12T13:12:34.971Z] 0 { middleware: [Function] }
+[2014-10-12T13:12:34.971Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:12:34.973Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:12:35.058Z] Target middleware
+[2014-10-12T13:12:35.058Z] Middleware length 1
+[2014-10-12T13:12:35.058Z] 0 { middleware: [Function] }
+[2014-10-12T13:12:35.058Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:12:35.059Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:13:56.178Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:13:56.185Z] ENTRY test.log
+[2014-10-12T13:13:56.195Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:13:56.203Z] [1] Listening on port: port 4080
+[2014-10-12T13:13:56.204Z] [1] Listening on port: port 40443
+[2014-10-12T13:13:56.204Z] [1] Start successful
+[2014-10-12T13:13:56.204Z] All workers started in 142ms
+[2014-10-12T13:15:07.774Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:15:07.780Z] ENTRY test.log
+[2014-10-12T13:15:07.790Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:15:07.797Z] [1] Listening on port: port 4080
+[2014-10-12T13:15:07.798Z] [1] Listening on port: port 40443
+[2014-10-12T13:15:07.798Z] [1] Start successful
+[2014-10-12T13:15:07.798Z] All workers started in 138ms
+[2014-10-12T13:15:15.869Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:15:15.875Z] ENTRY test.log
+[2014-10-12T13:15:15.885Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:15:15.894Z] [1] Listening on port: port 4080
+[2014-10-12T13:15:15.894Z] [1] Listening on port: port 40443
+[2014-10-12T13:15:15.894Z] [1] Start successful
+[2014-10-12T13:15:15.895Z] All workers started in 141ms
+[2014-10-12T13:15:18.452Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:15:18.458Z] ENTRY test.log
+[2014-10-12T13:15:18.467Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:15:18.475Z] [1] Listening on port: port 4080
+[2014-10-12T13:15:18.475Z] [1] Listening on port: port 40443
+[2014-10-12T13:15:18.475Z] [1] Start successful
+[2014-10-12T13:15:18.476Z] All workers started in 139ms
+[2014-10-12T13:15:20.854Z] Target middleware,moduleName,entry
+[2014-10-12T13:15:20.854Z] Middleware length 1
+[2014-10-12T13:15:20.854Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:20.854Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:20.861Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:20.961Z] Target middleware,moduleName,entry
+[2014-10-12T13:15:20.961Z] Middleware length 1
+[2014-10-12T13:15:20.962Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:20.962Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:20.965Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:34.649Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:15:34.655Z] ENTRY test.log
+[2014-10-12T13:15:34.664Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:15:34.672Z] [1] Listening on port: port 4080
+[2014-10-12T13:15:34.673Z] [1] Listening on port: port 40443
+[2014-10-12T13:15:34.673Z] [1] Start successful
+[2014-10-12T13:15:34.674Z] All workers started in 139ms
+[2014-10-12T13:15:35.349Z] Target [object Object]
+[2014-10-12T13:15:35.350Z] Middleware length 1
+[2014-10-12T13:15:35.350Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:35.350Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:35.361Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:35.455Z] Target [object Object]
+[2014-10-12T13:15:35.455Z] Middleware length 1
+[2014-10-12T13:15:35.456Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:35.456Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:35.458Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:36.085Z] Target [object Object]
+[2014-10-12T13:15:36.085Z] Middleware length 1
+[2014-10-12T13:15:36.085Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:36.085Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:36.086Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:36.169Z] Target [object Object]
+[2014-10-12T13:15:36.169Z] Middleware length 1
+[2014-10-12T13:15:36.169Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:36.169Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:36.170Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:36.508Z] Target [object Object]
+[2014-10-12T13:15:36.508Z] Middleware length 1
+[2014-10-12T13:15:36.508Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:36.508Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:36.508Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:36.593Z] Target [object Object]
+[2014-10-12T13:15:36.594Z] Middleware length 1
+[2014-10-12T13:15:36.594Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:36.594Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:36.594Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:36.787Z] Target [object Object]
+[2014-10-12T13:15:36.788Z] Middleware length 1
+[2014-10-12T13:15:36.788Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:36.788Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:36.788Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:36.877Z] Target [object Object]
+[2014-10-12T13:15:36.878Z] Middleware length 1
+[2014-10-12T13:15:36.878Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:36.878Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:36.879Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:37.019Z] Target [object Object]
+[2014-10-12T13:15:37.020Z] Middleware length 1
+[2014-10-12T13:15:37.020Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:37.020Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:37.020Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:37.098Z] Target [object Object]
+[2014-10-12T13:15:37.098Z] Middleware length 1
+[2014-10-12T13:15:37.098Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:37.098Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:37.098Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:50.449Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:15:50.455Z] ENTRY test.log
+[2014-10-12T13:15:50.465Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:15:50.472Z] [1] Listening on port: port 4080
+[2014-10-12T13:15:50.473Z] [1] Listening on port: port 40443
+[2014-10-12T13:15:50.473Z] [1] Start successful
+[2014-10-12T13:15:50.474Z] All workers started in 138ms
+[2014-10-12T13:15:51.171Z] Target [object Object]
+[2014-10-12T13:15:51.172Z] Middleware length 1
+[2014-10-12T13:15:51.172Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:51.172Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:51.180Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:51.279Z] Target [object Object]
+[2014-10-12T13:15:51.279Z] Middleware length 1
+[2014-10-12T13:15:51.279Z] 0 { middleware: [Function] }
+[2014-10-12T13:15:51.279Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:15:51.282Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:15:59.398Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:15:59.405Z] ENTRY test.log
+[2014-10-12T13:15:59.414Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:15:59.421Z] [1] Listening on port: port 4080
+[2014-10-12T13:15:59.422Z] [1] Listening on port: port 40443
+[2014-10-12T13:15:59.422Z] [1] Start successful
+[2014-10-12T13:15:59.423Z] All workers started in 137ms
+[2014-10-12T13:16:00.167Z] Target [object Object]
+[2014-10-12T13:16:00.167Z] Middleware length 1
+[2014-10-12T13:16:00.167Z] 0 { middleware: [Function] }
+[2014-10-12T13:16:00.167Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:16:00.174Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:16:00.266Z] Target [object Object]
+[2014-10-12T13:16:00.266Z] Middleware length 1
+[2014-10-12T13:16:00.267Z] 0 { middleware: [Function] }
+[2014-10-12T13:16:00.268Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:16:00.269Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:16:49.800Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:16:49.806Z] ENTRY test.log
+[2014-10-12T13:16:49.816Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:16:49.823Z] [1] Listening on port: port 4080
+[2014-10-12T13:16:49.824Z] [1] Listening on port: port 40443
+[2014-10-12T13:16:49.824Z] [1] Start successful
+[2014-10-12T13:16:49.824Z] All workers started in 137ms
+[2014-10-12T13:16:50.815Z] Target [object Object]
+[2014-10-12T13:16:50.815Z] Middleware length 1
+[2014-10-12T13:16:50.815Z] 0 { middleware: [Function] }
+[2014-10-12T13:16:50.816Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:16:50.823Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:16:50.934Z] Target [object Object]
+[2014-10-12T13:16:50.934Z] Middleware length 1
+[2014-10-12T13:16:50.935Z] 0 { middleware: [Function] }
+[2014-10-12T13:16:50.935Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:16:50.937Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:38.314Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:18:38.320Z] ENTRY test.log
+[2014-10-12T13:18:38.330Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:18:38.338Z] [1] Listening on port: port 4080
+[2014-10-12T13:18:38.339Z] [1] Listening on port: port 40443
+[2014-10-12T13:18:38.339Z] [1] Start successful
+[2014-10-12T13:18:38.339Z] All workers started in 139ms
+[2014-10-12T13:18:48.243Z] Target [object Object]
+[2014-10-12T13:18:48.243Z] Middleware length 1
+[2014-10-12T13:18:48.243Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:48.244Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:48.254Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:48.390Z] Target [object Object]
+[2014-10-12T13:18:48.390Z] Middleware length 1
+[2014-10-12T13:18:48.390Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:48.390Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:48.392Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:48.570Z] Target [object Object]
+[2014-10-12T13:18:48.570Z] Middleware length 1
+[2014-10-12T13:18:48.570Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:48.570Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:48.571Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:48.700Z] Target [object Object]
+[2014-10-12T13:18:48.700Z] Middleware length 1
+[2014-10-12T13:18:48.700Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:48.700Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:48.701Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:48.803Z] Target [object Object]
+[2014-10-12T13:18:48.803Z] Middleware length 1
+[2014-10-12T13:18:48.803Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:48.803Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:48.804Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:48.899Z] Target [object Object]
+[2014-10-12T13:18:48.899Z] Middleware length 1
+[2014-10-12T13:18:48.899Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:48.899Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:48.901Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:49.010Z] Target [object Object]
+[2014-10-12T13:18:49.010Z] Middleware length 1
+[2014-10-12T13:18:49.010Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:49.010Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:49.011Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:49.097Z] Target [object Object]
+[2014-10-12T13:18:49.097Z] Middleware length 1
+[2014-10-12T13:18:49.097Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:49.097Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:49.098Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:56.446Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:18:56.452Z] ENTRY test.log
+[2014-10-12T13:18:56.462Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:18:56.470Z] [1] Listening on port: port 4080
+[2014-10-12T13:18:56.471Z] [1] Listening on port: port 40443
+[2014-10-12T13:18:56.471Z] [1] Start successful
+[2014-10-12T13:18:56.471Z] All workers started in 137ms
+[2014-10-12T13:18:57.404Z] Target [object Object]
+[2014-10-12T13:18:57.404Z] Middleware length 1
+[2014-10-12T13:18:57.404Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:57.404Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:57.411Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:57.501Z] Target [object Object]
+[2014-10-12T13:18:57.501Z] Middleware length 1
+[2014-10-12T13:18:57.501Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:57.502Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:57.505Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:57.617Z] Target [object Object]
+[2014-10-12T13:18:57.617Z] Middleware length 1
+[2014-10-12T13:18:57.618Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:57.618Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:57.618Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:57.705Z] Target [object Object]
+[2014-10-12T13:18:57.705Z] Middleware length 1
+[2014-10-12T13:18:57.705Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:57.706Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:57.706Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:57.833Z] Target [object Object]
+[2014-10-12T13:18:57.834Z] Middleware length 1
+[2014-10-12T13:18:57.834Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:57.834Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:57.834Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:57.916Z] Target [object Object]
+[2014-10-12T13:18:57.916Z] Middleware length 1
+[2014-10-12T13:18:57.916Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:57.916Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:57.917Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:58.044Z] Target [object Object]
+[2014-10-12T13:18:58.044Z] Middleware length 1
+[2014-10-12T13:18:58.044Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:58.044Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:58.045Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:58.129Z] Target [object Object]
+[2014-10-12T13:18:58.129Z] Middleware length 1
+[2014-10-12T13:18:58.129Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:58.129Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:58.130Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:58.265Z] Target [object Object]
+[2014-10-12T13:18:58.266Z] Middleware length 1
+[2014-10-12T13:18:58.266Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:58.266Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:58.266Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:18:58.351Z] Target [object Object]
+[2014-10-12T13:18:58.351Z] Middleware length 1
+[2014-10-12T13:18:58.351Z] 0 { middleware: [Function] }
+[2014-10-12T13:18:58.351Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:18:58.352Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:19:16.106Z] Target [object Object]
+[2014-10-12T13:19:16.106Z] Middleware length 1
+[2014-10-12T13:19:16.106Z] 0 { middleware: [Function] }
+[2014-10-12T13:19:16.106Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:19:16.107Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:19:16.210Z] Target [object Object]
+[2014-10-12T13:19:16.210Z] Middleware length 1
+[2014-10-12T13:19:16.210Z] 0 { middleware: [Function] }
+[2014-10-12T13:19:16.211Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:19:16.211Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:19:16.306Z] Target [object Object]
+[2014-10-12T13:19:16.306Z] Middleware length 1
+[2014-10-12T13:19:16.306Z] 0 { middleware: [Function] }
+[2014-10-12T13:19:16.306Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:19:16.307Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:19:16.391Z] Target [object Object]
+[2014-10-12T13:19:16.391Z] Middleware length 1
+[2014-10-12T13:19:16.391Z] 0 { middleware: [Function] }
+[2014-10-12T13:19:16.391Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:19:16.392Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:19:43.171Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:19:43.177Z] ENTRY test.log
+[2014-10-12T13:19:43.187Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:19:43.194Z] [1] Listening on port: port 4080
+[2014-10-12T13:19:43.195Z] [1] Listening on port: port 40443
+[2014-10-12T13:19:43.195Z] [1] Start successful
+[2014-10-12T13:19:43.195Z] All workers started in 137ms
+[2014-10-12T13:19:44.008Z] Target [object Object]
+[2014-10-12T13:19:44.009Z] Middleware length 1
+[2014-10-12T13:19:44.009Z] 0 { middleware: [Function] }
+[2014-10-12T13:19:44.009Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:19:44.017Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:19:44.143Z] Target [object Object]
+[2014-10-12T13:19:44.143Z] Middleware length 1
+[2014-10-12T13:19:44.143Z] 0 { middleware: [Function] }
+[2014-10-12T13:19:44.143Z] Request handler proxy 4000/test/[path]
+[2014-10-12T13:19:44.146Z] Err { [Error: connect ECONNREFUSED]
+ code: 'ECONNREFUSED',
+ errno: 'ECONNREFUSED',
+ syscall: 'connect' }
+[2014-10-12T13:20:59.716Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:20:59.722Z] ENTRY test.log
+[2014-10-12T13:20:59.731Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:20:59.739Z] [1] Listening on port: port 4080
+[2014-10-12T13:20:59.740Z] [1] Listening on port: port 40443
+[2014-10-12T13:20:59.740Z] [1] Start successful
+[2014-10-12T13:20:59.740Z] All workers started in 138ms
+[2014-10-12T13:21:07.573Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:21:07.579Z] ENTRY test.log
+[2014-10-12T13:21:07.589Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:21:07.597Z] [1] Listening on port: port 4080
+[2014-10-12T13:21:07.598Z] [1] Listening on port: port 40443
+[2014-10-12T13:21:07.598Z] [1] Start successful
+[2014-10-12T13:21:07.598Z] All workers started in 136ms
+[2014-10-12T13:21:25.323Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:21:25.329Z] ENTRY test.log
+[2014-10-12T13:21:25.338Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:21:25.347Z] [1] Listening on port: port 4080
+[2014-10-12T13:21:25.347Z] [1] Listening on port: port 40443
+[2014-10-12T13:21:25.347Z] [1] Start successful
+[2014-10-12T13:21:25.348Z] All workers started in 137ms
+[2014-10-12T13:21:39.314Z] Target [object Object]
+[2014-10-12T13:21:39.314Z] Middleware length 2
+[2014-10-12T13:21:39.315Z] 0 { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' }
+[2014-10-12T13:21:39.315Z] ENTRY HANDLER
+[2014-10-12T13:21:39.315Z] Err undefined
+[2014-10-12T13:21:39.315Z] 1 { middleware: [Function] }
+[2014-10-12T13:21:39.315Z] Err undefined
+[2014-10-12T13:21:39.316Z] 2 undefined
+[2014-10-12T13:21:39.454Z] Target [object Object]
+[2014-10-12T13:21:39.454Z] Middleware length 2
+[2014-10-12T13:21:39.455Z] 0 { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' }
+[2014-10-12T13:21:39.455Z] ENTRY HANDLER
+[2014-10-12T13:21:39.455Z] Err undefined
+[2014-10-12T13:21:39.455Z] 1 { middleware: [Function] }
+[2014-10-12T13:21:39.455Z] Err undefined
+[2014-10-12T13:21:39.455Z] 2 undefined
+[2014-10-12T13:21:56.787Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:21:56.794Z] ENTRY test.log
+[2014-10-12T13:21:56.803Z] [ { middleware: [Function],
+ dispatchTarget: [Function: logger],
+ moduleName: 'log',
+ entry: 'test.log' },
+ { middleware: [Function] } ] 2
+[2014-10-12T13:21:56.811Z] [1] Listening on port: port 4080
+[2014-10-12T13:21:56.812Z] [1] Listening on port: port 40443
+[2014-10-12T13:21:56.812Z] [1] Start successful
+[2014-10-12T13:21:56.813Z] All workers started in 143ms
+[2014-10-12T13:22:39.333Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:22:39.343Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:22:39.350Z] [1] Listening on port: port 4080
+[2014-10-12T13:22:39.351Z] [1] Listening on port: port 40443
+[2014-10-12T13:22:39.351Z] [1] Start successful
+[2014-10-12T13:22:39.351Z] All workers started in 133ms
+[2014-10-12T13:23:26.315Z] { tlsSessionStore: { get: [Function], set: [Function] } }
+[2014-10-12T13:23:26.329Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:23:26.333Z] { tlsSessionStore: { get: [Function], set: [Function] } }
+[2014-10-12T13:23:26.341Z] [ { middleware: [Function] } ] 1
+[2014-10-12T13:23:26.349Z] [1] Listening on port: port 4080
+[2014-10-12T13:23:26.349Z] [1] Listening on port: port 40443
+[2014-10-12T13:23:26.350Z] [1] Start successful
+[2014-10-12T13:23:26.350Z] All workers started in 143ms
+[2014-10-14T23:05:54.607Z] [2] Listening on port: port 4080
+[2014-10-14T23:05:54.610Z] [2] Listening on port: port 40443
+[2014-10-14T23:05:54.611Z] [2] Start successful
+[2014-10-14T23:05:54.612Z] [1] Listening on port: port 4080
+[2014-10-14T23:05:54.613Z] [1] Listening on port: port 40443
+[2014-10-14T23:05:54.613Z] [1] Start successful
+[2014-10-14T23:05:54.615Z] [3] Listening on port: port 4080
+[2014-10-14T23:05:54.615Z] [4] Listening on port: port 4080
+[2014-10-14T23:05:54.616Z] [4] Listening on port: port 40443
+[2014-10-14T23:05:54.616Z] [4] Start successful
+[2014-10-14T23:05:54.616Z] [3] Listening on port: port 40443
+[2014-10-14T23:05:54.617Z] [3] Start successful
+[2014-10-14T23:05:54.619Z] All workers started in 352ms
+[2014-10-15T00:30:01.717Z] [4] Listening on port: port 4080
+[2014-10-15T00:30:01.719Z] [1] Listening on port: port 4080
+[2014-10-15T00:30:01.719Z] [1] Listening on port: port 40443
+[2014-10-15T00:30:01.719Z] [1] Start successful
+[2014-10-15T00:30:01.721Z] [4] Listening on port: port 40443
+[2014-10-15T00:30:01.721Z] [4] Start successful
+[2014-10-15T00:30:01.725Z] [2] Listening on port: port 4080
+[2014-10-15T00:30:01.726Z] [2] Listening on port: port 40443
+[2014-10-15T00:30:01.726Z] [2] Start successful
+[2014-10-15T00:30:01.736Z] [3] Listening on port: port 4080
+[2014-10-15T00:30:01.740Z] [3] Listening on port: port 40443
+[2014-10-15T00:30:01.740Z] [3] Start successful
+[2014-10-15T00:30:01.742Z] All workers started in 333ms
diff --git a/bin/cert-scan b/bin/cert-scan
index 444903c..6d61715 100755
--- a/bin/cert-scan
+++ b/bin/cert-scan
@@ -1,16 +1,18 @@
#!/usr/bin/env node
-var CertScanner = require('../certScanner');
+var CertScanner = require('../src/certScanner');
-var argv = require('optimist').argv;
+var argv = require('yargs').usage('Usage: cert-scan [path]\nTry to provide a relatively small directory, idealy containing only certificates. A JSON result will be returned.').demand(1).argv;
-var scanner = new CertScanner(process.argv[2], argv);
+var scanner = new CertScanner(argv._[0], argv);
scanner.on('notice', function(msg) {
console.warn(msg);
});
scanner.scan(function(err, config) {
- if(err)
- return console.log(err.stack);
- console.log(config);
+ if(err) {
+ console.err(err.stack);
+ return process.exit(1);
+ }
+ console.log(JSON.stringify(config, null, 4));
});
\ No newline at end of file
diff --git a/http-master b/bin/http-master
similarity index 74%
rename from http-master
rename to bin/http-master
index 0107490..0fce4ce 100755
--- a/http-master
+++ b/bin/http-master
@@ -3,17 +3,24 @@
var path = require('path'),
fs = require('fs'),
- argv = require('optimist').argv,
+ argv = require('yargs')
+ .argv,
extend = require('extend'),
- HttpMaster = require('./HttpMaster'),
- friendlyConfig = require('./friendlyConfig');
+ HttpMaster = require('../src/HttpMaster'),
+ util = require('util');
+
+process.title = 'http-master';
function logError(str) {
if (argv.silent || config.silent)
return;
- console.log(str);
+ console.error(str);
+}
+function logNotice(str) {
+ if (argv.silent || config.silent)
+ return;
+ console.log(str);
}
-var logNotice = logError;
var help = [
'usage: http-master [options] ',
@@ -25,20 +32,21 @@ var help = [
' --config CONFIGFILE Configuration file (YAML or JSON)',
' --configloader JS-FILE Provide js file as config loader',
' --configloader-test Test config configloader by printing out its output',
- ' --watch Watch config for changes',
+ ' --watch Watch config for changes and automatically reload with zero downtime',
' --silent Silence the log output',
' --user USER User to drop privileges to once server socket is bound',
' --group GROUP Group to drop privileges to once server socket is bound',
' --show-rules Show all rules upon every config load',
- ' -h, --help You\'re staring at it'
+ ' -h, --help You\'re staring at it',
+ 'See https://github.com/CodeCharmLtd/http-master for further info'
].join('\n');
-if (argv.h || argv.help || Object.keys(argv).length === 2) {
- return console.log(help);
+if(argv.version) {
+ return console.log(JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'))).version);
}
-if(argv.version) {
- return console.log(JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'))).version);
+if (argv.h || argv.help || !argv.config || argv.config === true) {
+ return console.log(help);
}
var config = {};
@@ -51,7 +59,7 @@ if (argv['configloader-test']) {
require(argv.configloader)(argv, fs.readFileSync(argv.config).toString('utf8'), function(err, config) {
if(err) throw err;
- console.log(JSON.stringify(config));
+ console.log(JSON.stringify(config, null, 2));
});
return;
}
@@ -103,7 +111,6 @@ function patchConfigWithArgv(config) {
config.debug = argv.debug;
if(typeof config.workerCount == 'undefined') {
- logNotice('Setting workerCount to number of CPUs');
config.workerCount = numCPUs;
}
}
@@ -113,6 +120,7 @@ var yaml = require('js-yaml');
function fetchConfig(finish) {
var configloader;
+ //console.log(fs.statSync(argv.configloader));
if (argv.configloader) {
configloader = require(argv.configloader);
} else {
@@ -136,9 +144,8 @@ function fetchConfig(finish) {
try {
configloader(argv, data, function(err, config) {
if(err) return finish(err);
- config = extend(true, {}, config, friendlyConfig(config));
if(argv['show-rules'])
- logNotice(config.ports);
+ logNotice(util.inspect(config.ports, {depth: null}));
patchConfigWithArgv(config);
finish(err, config);
@@ -155,32 +162,52 @@ var master = new HttpMaster();
master.on('logNotice', logNotice);
master.on('logError', logError);
+var originalLog = console.log;
+var originalError = console.error;
+
+function setConsole(config) {
+ if(config.silent) {
+ console.log = function(msg) {
+ master.emit('feedNotice', msg);
+ }
+ console.error = function(msg) {
+ master.emit('feedError', msg);
+ }
+ } else {
+ console.log = originalLog;
+ console.error = originalError;
+ }
+}
+
var numCPUs = require('os').cpus().length;
fetchConfig(function(err, parsedConfig) {
if(err) {
throw err;
}
config = parsedConfig;
+ setConsole(config);
master.init(config, function(err) {
if(err) {
logError('Workers failed to start');
throw err;
}
- logNotice('All workers started in ' + (new Date().getTime() - startTime) + 'ms');
+ master.logNotice('All workers started in ' + (new Date().getTime() - startTime) + 'ms');
dropPrivileges();
var watch = require('node-watch');
if (config.watchConfig || argv.watch) {
watch(argv.config, function() {
- logNotice('Reloading workers due to config change');
+ master.logNotice('Reloading workers due to config change');
fetchConfig(function(err, parsedConfig) {
if(err) return logNotice('Skipping reload due to config error: ' + err.stack.toString());
config = parsedConfig;
+ setConsole(config);
+
var startTime = new Date().getTime();
master.reload(config, function(err) {
- logNotice('All workers reloaded, downtime was ' + (new Date().getTime() - startTime) + 'ms');
+ master.logNotice('All workers reloaded, downtime was ' + (new Date().getTime() - startTime) + 'ms');
});
});
});
@@ -193,15 +220,17 @@ fetchConfig(function(err, parsedConfig) {
fetchConfig(function(err, parsedConfig) {
if(err) return logNotice('Skipping reload due to config error');
config = parsedConfig;
+ setConsole(config);
var startTime = new Date().getTime();
master.reload(config, function(err) {
- logNotice('All workers reloaded, downtime was ' + (new Date().getTime() - startTime) + 'ms');
+ master.logNotice('All workers reloaded, downtime was ' + (new Date().getTime() - startTime) + 'ms');
});
});
});
process.on('uncaughtException', function(err) {
logError('[Uncaught exception in master] ' + err.stack || err.message);
+ console.warn('[Uncaught exception in master] ' + err.stack || err.message);
});
});
});
\ No newline at end of file
diff --git a/common.js b/common.js
deleted file mode 100644
index db42a53..0000000
--- a/common.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict';
-var path = require('path');
-var modules = require('fs').readdirSync(path.join(__dirname, 'modules')).map(function(file) {
- return require('./modules/' + file);
-}).sort(function(a, b) { // sort modules according to priority
- return (b.priority || 0) - (a.priority || 0);
-});
-
-
-function runModules(cb) {
- var args = Array.prototype.slice.call(arguments, 1);
- var name;
- if (typeof cb === 'string') {
- name = cb;
- } else {
- name = args.shift();
- }
-
- modules.forEach(function(module) {
- if (module[name]) {
-
- var ret = module[name].apply(module[name], args);
-
- if (ret && typeof cb === 'function') {
- cb(name, ret);
- }
- }
- });
-}
-
-exports.runModules = runModules;
\ No newline at end of file
diff --git a/config.json b/config.json
deleted file mode 100644
index 0f06d51..0000000
--- a/config.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "ports": {
-
- "4080" : {
- "redirect": {
- "*.code2flow.com/^(?[a-f]{6})" : "http://code2flow.com/[code]",
- "*.net/*" : "https://[1]/[2]",
- },
- "errorHtmlPage": "/home/rush/Programowanie/rush-http-proxy/test.html",
- "proxy": {
- "local.code2flow.com": 80,
- "*" : "4000"
- },
- "static": {}
- }
- },
- "logging": {
- "logFile": "/tmp/access.log",
- "appLog": "/tmp/app.log"
- }
-}
\ No newline at end of file
diff --git a/config2.json b/config2.json
deleted file mode 100644
index acdb877..0000000
--- a/config2.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "errorHtmlFile" : "error.html",
- "logging": {
- "logFile": "test.log"
- },
- "ports": {
- "8081" : {
- "redirect": {
- "test.pl/test": "https://127.0.0.1:8082/[path]"
- },
-
- "router": {
- "test.pl": "127.0.0.1:8082"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/preprocessor.js b/examples/exampleConfigLoader.js
similarity index 100%
rename from preprocessor.js
rename to examples/exampleConfigLoader.js
diff --git a/friendlyConfig.js b/friendlyConfig.js
deleted file mode 100644
index ad8ce5e..0000000
--- a/friendlyConfig.js
+++ /dev/null
@@ -1,229 +0,0 @@
-var assert = require('assert');
-
-var XRegExp = require('xregexp').XRegExp;
-
-var extend = require('extend');
-
-XRegExp.install({
- // Overrides native regex methods with fixed/extended versions that support named
- // backreferences and fix numerous cross-browser bugs
- natives: true,
-
- // Enables extensibility of XRegExp syntax and flags
- extensibility: true
-});
-
-module.exports = function(config) {
- var domains = config.routes || config.domains || {};
-
- var newConfig = {};
- if (!newConfig.ports)
- newConfig.ports = {};
-
- var allPorts = [];
-
- var ports = newConfig.ports;
-
- if (typeof config.http == 'boolean') {
- config.http = [80];
- }
- if (typeof config.https == 'boolean') {
- config.https = [443];
- }
-
- if (config.http) {
- config.http.forEach(function(portEntry) {
- allPorts.push(portEntry.port || portEntry);
-
- ports[portEntry.port || portEntry] = {};
- if (portEntry.port)
- delete portEntry.port;
- });
- }
-
-
- var sslConfig = {};
-
- if (config.https) {
- config.https.forEach(function(portEntry) {
-
- allPorts.push(portEntry.port || portEntry);
-
- ports[portEntry.port || portEntry] = {
-
- ssl: typeof portEntry === 'object' ? portEntry : sslConfig
- };
- if (portEntry.port)
- delete portEntry.port;
- });
- }
-
- var groups = config.groups || {};
- Object.keys(groups).forEach(function(groupName) {
-
- });
-
-
- function parseDomainInput(domain) {
-
- var m = domain.match(new XRegExp("^(?:(?[^/ \t]*)\\s*\\|)?\\s*(?.*?)(?::(?\\d+))?(?\\/.*)?$"));
-
- var group = groups[m.group || ""] || {};
-
- return {
- ports: m.port ? [m.port] : (group.ports ? group.ports : allPorts),
- interfaces: group.interfaces,
- host: m.host,
- path: m.path,
- group: group
- };
- }
-
- function parseEntry(entry) {
- function parseString(entry) {
- var m = entry.target.match(/^(?:(\w+)\s*:)?\s*(.*)$/);
-
- var domainInput = parseDomainInput(entry.matchDescription);
-
- return extend(domainInput, {
- matchDescription: entry.matchDescription,
- module: m[1] || 'proxy',
- value: m[2],
- interfaces: entry.interfaces,
- ports: entry.ports
- });
- }
-
- function parseNumber(entry) {
- var domainInput = parseDomainInput(entry.matchDescription);
-
- return extend(domainInput, {
- matchDescription: entry.matchDescription,
- module: 'proxy',
- value: entry.target,
- interfaces: entry.interfaces,
- ports: entry.ports
- });
- }
-
- function parseSingleEntry(entry) {
- if (typeof entry.target == 'number')
- return parseNumber(entry);
- else if (typeof entry.target == 'string') {
- return parseString(entry);
- } else {
- throw new Error('unsupported entry');
- }
- }
-
-
- var group = parseDomainInput(entry.matchDescription, entry).group;
-
- var subdomains = {};
- if (entry.target && entry.target.subdomains) {
- subdomains = extend(subdomains, entry.target.subdomains);
- }
- if (group.subdomains) {
-
-
- Object.keys(group.subdomains).forEach(function(key) {
- var value = group.subdomains[key];
- subdomains[key] = value.replace("[target]", entry.target);
- });
- }
-
- // if(typeof subdomains[''] == 'undefined') {
- // subdomains[''] = entry.target;
- // }
-
- if (typeof entry.target == 'object') {
-
- return Object.keys(subdomains).map(function(key) {
- var subdomainInput = key;
- var subdomainTarget = subdomains[key];
-
- var matchDescription = parseDomainInput(entry.matchDescription, entry);
-
- return parseSingleEntry({
- target: subdomainTarget,
- matchDescription: subdomainInput + entry.matchDescription
- });
- });
- } else { // declares as simple string or port number
- if (typeof subdomains[''] == 'undefined') {
- subdomains[''] = entry.target;
- }
- return Object.keys(subdomains).map(function(key) {
- var subdomainInput = key;
- var subdomainTarget = subdomains[key];
-
- var matchDescription = parseDomainInput(entry.matchDescription, entry);
-
- return parseSingleEntry({
- target: subdomainTarget,
- matchDescription: subdomainInput + entry.matchDescription.replace(/^.*?\|\s*/, ''),
- interfaces: matchDescription.interfaces,
- ports: matchDescription.ports
- });
- });
-
- // return [parseSingleEntry(entry)];
- }
- }
-
-
- Object.keys(domains).forEach(function(domain) {
-
- var entries = parseEntry({
- matchDescription: domain,
- target: domains[domain]
- });
-
- if (entries.length) {
- //console.log(entries[0].matchDescription);
- }
-
- entries.forEach(function(entry) {
- var destination = entry.target;
- var domainInput = parseDomainInput(entry.matchDescription, entry);
-
-
- // bind to interfaces defined in group, if not defined
- // bind to interfaces defined globally, if not defined
- // bind to all interfaces
- var interfacesToAssign = entry.interfaces || config.interfaces || ["*"];
-
- // if "*" is on the list, discard other interfaces since they are redunundand
- if (interfacesToAssign.indexOf("*") != -1)
- interfacesToAssign = ["*"];
-
-
- interfacesToAssign.forEach(function(interfaceToAssign) {
-
- entry.ports.forEach(function(port) {
- if (interfaceToAssign && interfaceToAssign != "*") {
- if (interfaceToAssign.match(/:/)) // ipv6
- port = "[" + interfaceToAssign + "]:" + port;
- else
- port = interfaceToAssign + ":" + port;
- }
-
- if (!ports[port])
- ports[port] = {};
-
- if (!ports[port][entry.module])
- ports[port][entry.module] = {};
-
- // console.log(domainInput.subdomains);
-
- ports[port][entry.module][domainInput.host + (domainInput.path || "")] = entry.value;
- });
-
- });
- });
-
- });
-
-
- return newConfig;
-};
\ No newline at end of file
diff --git a/migrateV1Config.js b/migrateV1Config.js
new file mode 100644
index 0000000..bd04099
--- /dev/null
+++ b/migrateV1Config.js
@@ -0,0 +1,68 @@
+var yaml = require('js-yaml');
+
+/* This is sample preprocessor, modify it for your needs */
+module.exports = function(argv, data, cb) {
+
+ var oldWarn = console.warn;
+ console.warn = function() {};
+
+ var config = yaml.safeLoad(data);
+
+
+ if(config.logging) {
+ if(config.logging.appLog) {
+ config.modules = config.modules || {};
+ config.modules.appLog = config.logging.appLog;
+ }
+ if(config.logging.accessLog) {
+ config.middleware = config.middleware || [];
+ config.middleware.push(
+ 'log -> ' + config.logging.accessLog
+ );
+ }
+ delete config.logging;
+ }
+ config.ports = config.ports || {};
+ if(config.gzip) {
+ config.middleware = config.middleware || [];
+ config.middleware.push(
+ 'gzip -> 9'
+ );
+ delete config.gzip;
+ }
+ Object.keys(config.ports).forEach(function(port) {
+
+ var portConfig = config.ports[port];
+ portConfig.router = portConfig.router || {};
+
+ function migrateEntries(name) {
+ Object.keys(portConfig[name]).forEach(function(key) {
+ var portConfigEntry = portConfig[name][key];
+ if(name !== 'proxy')
+ portConfigEntry = name + " -> " + portConfigEntry.toString();
+ portConfig.router[key] = portConfigEntry;
+ });
+ }
+ delete portConfig.silent;
+ if(portConfig.reject) {
+ migrateEntries('reject');
+ delete portConfig.reject;
+ }
+ if(portConfig.redirect) {
+ migrateEntries('redirect');
+ delete portConfig.redirect;
+ }
+ if(portConfig.proxy) {
+ migrateEntries('proxy');
+ delete portConfig.proxy;
+ }
+ if(portConfig.ssl) { // make sure ssl is appended at the end
+ var sslConfig = portConfig.ssl;
+ delete portConfig.ssl;
+ portConfig.ssl = sslConfig;
+ }
+
+ });
+ console.log("Migrated old config!");
+ cb(null, config);
+};
\ No newline at end of file
diff --git a/modules/appLog.js b/modules/appLog.js
new file mode 100644
index 0000000..72f8097
--- /dev/null
+++ b/modules/appLog.js
@@ -0,0 +1,44 @@
+var util = require('util');
+var fs = require('fs');
+var util = require('util');
+
+module.exports = function Logging(logFileService, master, moduleConfig) {
+ var appStream;
+ if(!master)
+ return;
+
+ var appStream = logFileService(moduleConfig);
+
+ function timestamp() {
+ return '[' + new Date().toISOString() + ']';
+ }
+
+ function logNotice(msg) {
+ appStream.write(timestamp() + ' ' + msg + "\n");
+
+ }
+ function logError(msg) {
+ appStream.write(timestamp() + ' ' + msg + "\n");
+ }
+
+ master.on('logNotice', logNotice);
+ master.on('logError', logError);
+
+ // second instance of Logging will load after reload, unbind event handlers
+ master.once('reload', function() {
+ master.removeListener('logNotice', logNotice);
+ master.removeListener('logError', logError);
+ });
+
+ function logFunction() {
+ var args = Array.prototype.slice.call(arguments);
+ args.unshift('[' + new Date().toISOString() + ']');
+ str = util.format.apply(this, args) + "\n";
+ appStream.write(str);
+ }
+
+ return {
+ notice: logNotice,
+ error: logError
+ }
+};
diff --git a/modules/logging.js b/modules/logging.js
deleted file mode 100644
index 9f75124..0000000
--- a/modules/logging.js
+++ /dev/null
@@ -1,114 +0,0 @@
-var util = require('util');
-var fs = require('fs');
-var logging = false;
-var util = require('util');
-
-
-var appStream;
-
-
-var watcher = {};
-
-function openLogFile(logFile) {
- var stream = fs.createWriteStream(logFile, {
- 'flags': 'a'
- });
- stream.on('open', function() {
- watcher[logFile] = fs.watch(logFile, function(action, filename) {
- if (action == 'rename') {
- watcher[logFile].close();
- openLogFile(logFile);
- }
- });
- });
- return stream;
-}
-
-var uidNumber = require('uid-number');
-
-function loadAppLog(file, user, group) {
- if(appStream)
- appStream.end();
- appStream = openLogFile(file);
- if(user || group) {
- uidNumber(user, group, function(err, userId, groupId) {
- fs.chown(file, userId, groupId);
- });
- }
-
- console.log = function() {
- var args = Array.prototype.slice.call(arguments);
- args.unshift('[' + new Date().toISOString() + ']');
- str = util.format.apply(this, args) + "\n";
- appStream.write(str);
- }
- process.removeAllListeners('msg:appLog');
- process.on('msg:appLog', function(data) {
- appStream.write(data);
- });
-}
-
-
-module.exports = {
- name: 'logging',
- initMaster: function(master, config) {
- if (config.logging) {
- if (config.logging.appLog) {
- loadAppLog(config.logging.appLog, config.user, config.group);
- }
- master.on('allWorkersStarted', function() {
- var logStream = process.stdout;
-
- if (config.logging) {
- if (config.logging.accessLog)
- logStream = openLogFile(config.logging.accessLog);
- if (config.logging.appLog) {
- loadAppLog(config.logging.appLog);
- }
- }
-
- process.on('msg:log', function(data) {
- var str = JSON.stringify(data) + "\n";
- logStream.write(str);
- });
- });
- }
- },
- initWorker: function(config) {
- if (config.logging) {
- logging = true;
-
- if (config.logging.appLog) {
- console.log = function() {
- var args = Array.prototype.slice.call(arguments);
- args.unshift('[' + new Date().toISOString() + ']');
- str = util.format.apply(this, args) + "\n";
- process.sendMessage('appLog', str);
- }
- }
- }
- },
- priority: 10, // make sure it is run first
- middleware: function(configEntry) {
- if (logging) // middle overhead only when logging is enabled
- return function(req, res, next) {
- var startTime = (new Date().getTime());
- var origEnd = res.end;
- res.end = function() {
- var logObject = {
- timestamp: startTime,
- method: req.method,
- httpVersion: req.httpVersion,
- headers: req.headers,
- url: req.url,
- statusCode: res.statusCode,
- responseTime: (new Date().getTime()) - startTime
- };
- process.sendMessage('log', logObject);
- origEnd.apply(res);
- };
-
- next();
- };
- }
-};
\ No newline at end of file
diff --git a/modules/middleware/addHeader.js b/modules/middleware/addHeader.js
new file mode 100644
index 0000000..c1fac53
--- /dev/null
+++ b/modules/middleware/addHeader.js
@@ -0,0 +1,14 @@
+module.exports = function AddHeaderMiddleware() {
+ return {
+ requestHandler: function(req, res, next, target) {
+ req.headers[target[0]] = target[1];
+ next();
+ },
+ entryParser: function(config) {
+ if(!config.match(/\s*=\s*/)) {
+ throw new Error('Bad format, should be key=value');
+ }
+ return config.split(/\s*=\s*/);
+ }
+ };
+};
\ No newline at end of file
diff --git a/modules/middleware/auth.js b/modules/middleware/auth.js
new file mode 100644
index 0000000..4d5b8c2
--- /dev/null
+++ b/modules/middleware/auth.js
@@ -0,0 +1,25 @@
+var httpAuth = require('http-auth');
+
+module.exports = function AuthMiddleware() {
+ return {
+ requestHandler: function(req, res, next, auth) {
+ auth(req, res, function(err) {
+ delete req.headers.authorization;
+ next(err);
+ });
+ },
+ entryParser: function(authConfig) {
+
+ if(typeof authConfig === 'object') {
+ authConfig.realm = authConfig.realm || 'Enter password';
+ }
+ if(typeof authConfig === 'string') {
+ authConfig = {
+ file: authConfig,
+ realm: 'Enter password'
+ }
+ }
+ return httpAuth.connect(httpAuth.basic(authConfig));
+ }
+ };
+};
\ No newline at end of file
diff --git a/modules/middleware/gzip.js b/modules/middleware/gzip.js
new file mode 100644
index 0000000..45cec33
--- /dev/null
+++ b/modules/middleware/gzip.js
@@ -0,0 +1,14 @@
+var compression = require('compression');
+
+module.exports = function GzipMiddleware() {
+ return {
+ requestHandler: function(req, res, next, middlewareInstance) {
+ middlewareInstance(req, res, next);
+ },
+ entryParser: function(entry) {
+ return require('compression')({
+ level: parseInt(entry)
+ });
+ }
+ };
+};
\ No newline at end of file
diff --git a/modules/middleware/log.js b/modules/middleware/log.js
new file mode 100644
index 0000000..88a4b39
--- /dev/null
+++ b/modules/middleware/log.js
@@ -0,0 +1,14 @@
+var morgan = require('morgan');
+
+module.exports = function LogMiddleware(logFileService) {
+ return {
+ requestHandler: function(req, res, next, middlewareInstance) {
+ middlewareInstance(req, res, next);
+ },
+ entryParser: function(entry) {
+ return morgan(entry.type || 'combined', {
+ stream: logFileService(entry.file || entry)
+ });
+ }
+ };
+};
\ No newline at end of file
diff --git a/modules/middleware/proxy.js b/modules/middleware/proxy.js
new file mode 100644
index 0000000..e6c195e
--- /dev/null
+++ b/modules/middleware/proxy.js
@@ -0,0 +1,95 @@
+'use strict';
+
+var httpProxy = require('http-proxy');
+var url = require('url');
+var fs = require('fs');
+var path = require('path');
+var regexpHelper = require('../../src/regexpHelper');
+var assert = require('assert');
+
+function parseEntry(entry) {
+ var m;
+ if(typeof entry == 'number')
+ entry = entry.toString();
+
+ assert(typeof entry === 'string');
+
+ var withPath = false;
+ withPath = !!entry.replace(/https?:\/\//, '').match(/.*\//);
+
+ if((m = entry.match(/^\d+(?:|\/.*)$/))) {
+ entry = '127.0.0.1:' + entry;
+ }
+ if(!entry.match(/https?:\/\//)) {
+ entry = 'http://' + entry;
+ }
+ entry = url.parse(entry, true, true)
+ entry.withPath = withPath;
+ return entry;
+}
+
+
+module.exports = function ProxyMiddleware(portConfig, di) {
+
+ var proxy = httpProxy.createProxyServer({xfwd: true, agent: false});
+ proxy.on('error', function(err, req, res) {
+ req.err = err;
+ req.next(err);
+ });
+
+ var rewriteTargetAndPathIfNeeded = function(req, target) {
+ if(!req.match) {
+ return target;
+ }
+
+ var processed = regexpHelper(target.href, req.match);
+
+ if(req.parsedUrl.search)
+ processed += req.parsedUrl.search;
+
+ var newTarget = url.parse(processed);
+ if(target.withPath) {
+ req.url = newTarget.path;
+ }
+ return newTarget;
+ };
+
+ return {
+ requestHandler: function(req, res, next, dispatchTarget) {
+ req.connection.proxy = proxy;
+ req.next = next;
+ // workaround for node-http-proxy/#591
+ if(!req.headers.host) {
+ req.headers.host = '';
+ }
+ var proxyTarget = rewriteTargetAndPathIfNeeded(req, dispatchTarget);
+ var m = req.headers.host.match(/^(.+):\d+$/);
+ if(m) {
+ req.headers.host = m[1] + ':' + proxyTarget.port;
+ }
+
+ // work around weirdness of new http-proxy url handling
+ // for the purpose of passing the tests
+ if(proxyTarget.pathname !== '/') {
+ req.url = '';
+ }
+ else {
+ proxyTarget.path = '';
+ }
+
+ var options = {
+ target: proxyTarget,
+ proxyTimeout: portConfig.proxyTargetTimeout,
+ timeout: portConfig.proxyTimeout
+ };
+
+ if(req.upgrade) {
+ return proxy.ws(req, req.upgrade.socket, req.upgrade.head, options);
+ }
+ proxy.web(req, res, options);
+ },
+ entryParser: function(entry) {
+ return parseEntry(entry.target || entry);
+ }
+ };
+}
\ No newline at end of file
diff --git a/modules/middleware/redirect.js b/modules/middleware/redirect.js
new file mode 100644
index 0000000..2d64546
--- /dev/null
+++ b/modules/middleware/redirect.js
@@ -0,0 +1,16 @@
+
+var regexpHelper = require('../../src/regexpHelper');
+
+module.exports = function RedirectMiddleware() {
+ return {
+ requestHandler: function(req, res, next, target) {
+ if (req.match)
+ target = regexpHelper(target, req.match);
+
+ target = target.replace("[path]", req.url.substring(1));
+ res.statusCode = 302;
+ res.setHeader("Location", target);
+ return res.end();
+ }
+ };
+}
\ No newline at end of file
diff --git a/modules/middleware/reject.js b/modules/middleware/reject.js
new file mode 100644
index 0000000..03ee806
--- /dev/null
+++ b/modules/middleware/reject.js
@@ -0,0 +1,58 @@
+var http = require('http');
+var fs = require('fs');
+var path = require('path');
+
+function loadHtmlFile(errorHtmlFile) {
+ var content = fs.readFileSync(errorHtmlFile).toString('utf8');
+ content = content.replace(/src="(.+?)"/g, function(m, fileName) {
+ var imagePath = path.join(path.dirname(errorHtmlFile), fileName);
+ return 'src="data:image/'+path.extname(fileName).substr(1)+';base64,' + fs.readFileSync(imagePath).toString('base64') + '"';
+ });
+ return content;
+}
+
+module.exports = function RejectMiddleware(config, portConfig) {
+
+ var content;
+ var errorHtmlFile = portConfig.errorHtmlFile || config.errorHtmlFile;
+ if(errorHtmlFile) {
+ content = loadHtmlFile(errorHtmlFile);
+ }
+
+ return {
+ requestHandler: function(req, res, next, target) {
+ if(req.upgrade) return;
+ res.statusCode = target.code;
+ var head = {};
+
+ content = target.html || content;
+
+ if(content) {
+ head['Content-Type'] = 'text/html';
+ res.writeHead(target.code, head);
+ res.write(content);
+ res.end();
+ } else {
+ res.statusCode = target.code;
+ res.end(target.code + ' ' + (http.STATUS_CODES[target.code] || 'Forbidden') );
+ }
+
+ },
+ entryParser: function(entry) {
+ var code;
+ entry = entry || 403;
+ if(typeof entry ==='string' || typeof entry === 'number') {
+ code = parseInt(entry) || 403;
+ }
+ else {
+ code = 403;
+ }
+ return {
+ code: code,
+ html: entry.htmlFile?loadHtmlFile(entry.htmlFile):undefined
+ };
+ }
+ };
+};
+
+
diff --git a/modules/middleware/router.js b/modules/middleware/router.js
new file mode 100644
index 0000000..d26267a
--- /dev/null
+++ b/modules/middleware/router.js
@@ -0,0 +1,94 @@
+var DispatchTable = require('../../src/DispatchTable');
+
+var defaultModule = 'proxy';
+var entryRegexp = /^\s*(?:(\w+)\s*(?:->|: )\s*)?(.*)/;
+
+function handlerForMiddlewareList(middleware) {
+ return {
+ middleware: function(req, res, next) {
+ var length = middleware.length;
+
+ function runMiddleware(i) {
+ if (i < length) {
+ middleware[i].middleware(req, res, function(err) {
+ if (err) {
+ return next(err);
+ }
+
+ runMiddleware(i+1);
+ }, middleware[i].dispatchTarget);
+ } else {
+ next();
+ }
+ }
+ runMiddleware(0);
+ },
+ moduleName: 'middlewareList',
+ entry: middleware
+ };
+}
+
+module.exports = function RouterMiddleware(di, portConfig, portNumber) {
+
+ function passEntryToModule(moduleName, entry) {
+ var instance = di.resolve(moduleName + 'Middleware');
+ var dispatchTarget = entry;
+ if(instance.entryParser) {
+ // allow modules to cache arbitrary data per entry
+ dispatchTarget = instance.entryParser(entry);
+ }
+ return {
+ middleware: instance.requestHandler,
+ dispatchTarget: dispatchTarget,
+ moduleName: moduleName, // for debug
+ entry: entry // for debug
+ };
+ }
+
+ function parseSingleEntry(entry) {
+ var m = entry.toString().match(entryRegexp);
+ var moduleName = m[1] || defaultModule;
+ var entryKey = m[2];
+
+ return passEntryToModule(moduleName, entryKey);
+ }
+
+
+ return {
+ entryParser: function(routerEntries) {
+ if (!(routerEntries instanceof Array)) {
+ routerEntries = [routerEntries];
+ }
+ var middlewareList = routerEntries.map(function(routerEntry) {
+ if(typeof routerEntry !== 'object' && typeof routerEntry !== 'undefined') {
+ return parseSingleEntry(routerEntry);
+ }
+ var dispatchTable = new DispatchTable(portNumber, {
+ config: routerEntry,
+ entryParser: function(entry) {
+ if (typeof entry === 'object') {
+ if(entry instanceof Array) {
+ return handlerForMiddlewareList(entry.map(parseSingleEntry));
+ }
+ else {
+ return passEntryToModule('router', entry);
+ }
+ }
+ return parseSingleEntry(entry);
+ },
+ requestHandler: function(req, res, next, target) {
+ target.middleware(req, res, next, target.dispatchTarget);
+ }
+ });
+ return {
+ middleware: DispatchTable.prototype.dispatchRequest.bind(dispatchTable)
+ }
+ });
+
+ return handlerForMiddlewareList(middlewareList);
+ },
+ requestHandler: function(req, res, next, target) {
+ target.middleware(req, res, next, target.dispatchTarget);
+ }
+ };
+}
\ No newline at end of file
diff --git a/modules/middleware/static.js b/modules/middleware/static.js
new file mode 100644
index 0000000..9d992e6
--- /dev/null
+++ b/modules/middleware/static.js
@@ -0,0 +1,30 @@
+var nodeStatic = require('node-static');
+var regexpHelper = require('../../src/regexpHelper');
+
+module.exports = function StaticMiddleware() {
+ return {
+ requestHandler: function(req, res, next, target) {
+ var fileServer = target.server;
+ target = target.target;
+ target = target.replace('[path]', req.url);
+
+ req.url = regexpHelper(target, req.hostMatch, req.pathMatch);
+
+ fileServer.serve(req, res, function(e, serveRes) {
+ if (e && (e.status === 404)) { // If the file wasn't found
+ var promise = fileServer.serveFile('/404.html', 404, {}, req, res);
+ promise.on('error', function(err) {
+ res.writeHead(500, {
+ 'Content-Type': 'text/plain'
+ });
+ res.write('');
+ res.end();
+ });
+ }
+ });
+ },
+ entryParser: function(entryKey, entry) {
+ return {server: new nodeStatic.Server(entry.path || entry), target: entry.target || "[path]"};
+ }
+ };
+}
diff --git a/modules/middleware/websockify.js b/modules/middleware/websockify.js
new file mode 100644
index 0000000..8b6f1c1
--- /dev/null
+++ b/modules/middleware/websockify.js
@@ -0,0 +1,72 @@
+var WebSocketServer = require('ws').Server;
+var EventEmitter = require('events').EventEmitter;
+
+var regexpHelper = require('../../src/regexpHelper');
+var net = require('net');
+var url = require('url');
+
+module.exports = function WebsockifyMiddleware() {
+ return {
+ requestHandler: function(req, res, next, parsedEntry) {
+ if(req.upgrade) {
+ var socket = new net.Socket();
+
+ var target = parsedEntry.target;
+
+ if (req.match) {
+ target = regexpHelper(target, req.match);
+ }
+ if(target.match(/^(\d+)$/)) {
+ target = 'localhost:' + target;
+ }
+ var parsedTarget = url.parse('tcp://' + target);
+
+ socket.connect(parseInt(parsedTarget.port), parsedTarget.hostname || 'localhost', function() {
+ parsedEntry.wsServer.handleUpgrade(req, req.upgrade.socket, req.upgrade.head, function(client) {
+ client.tcpSocket = socket;
+ socket.on('data', function(data) {
+ try {
+ if(client.protocol === 'base64')
+ client.send(new Buffer(data).toString('base64'));
+ else
+ client.send(data, {binary: true});
+ } catch(e) {
+ socket.end();
+ }
+ });
+ socket.on('end', function() {
+ client.close();
+ });
+ socket.on('error', function() {
+ socket.end();
+ client.close();
+ });
+
+ client.on('message', function(msg) {
+ if(client.protocol === 'base64')
+ socket.write(new Buffer(msg, 'base64'));
+ else
+ socket.write(msg, 'binary');
+ });
+ client.on('close', function(code, reason) {
+ socket.end();
+ });
+ client.on('error', function(err) {
+ socket.end();
+ });
+ });
+ });
+ }
+ next();
+ },
+ entryParser: function(entry) {
+
+ return {
+ wsServer: new WebSocketServer({
+ server: new EventEmitter() // fake server for web socket server
+ }),
+ target: entry
+ };
+ }
+ };
+};
\ No newline at end of file
diff --git a/modules/proxy.js b/modules/proxy.js
deleted file mode 100644
index 9876478..0000000
--- a/modules/proxy.js
+++ /dev/null
@@ -1,144 +0,0 @@
-var httpProxy = require('http-proxy');
-var DispatchTable = require('../DispatchTable');
-var url = require('url');
-var fs = require('fs');
-var path = require('path');
-
-function splitFirst(str, delim) {
- var index = str.indexOf(delim);
- if(index == -1)
- return [str];
- return [str.substr(0,index), str.substr(index)];
-}
-
-function parseEntry(entry) {
- var m;
- if(typeof entry == 'number')
- entry = entry.toString();
-
- var withPath = false;
- if(typeof entry == 'string') {
- withPath = !!entry.match(/(?:https?:\/\/)?.*\//);
-
- if((m = entry.match(/^\d+(?:|\/.*)$/))) {
- entry = '127.0.0.1:' + entry;
- }
- if(!entry.match(/https?:\/\//)) {
- entry = 'http://' + entry;
- }
- }
- entry = url.parse(entry, true, true)
- entry.withPath = withPath;
- entry.ws = true;
- return entry;
-}
-
-var proxy = httpProxy.createProxyServer({xfwd: true});
-var regexpHelper = require('../regexpHelper');
-
-var proxyFailErrorHandler;
-
-proxy.on('error', function(err, req, res) {
- if(proxyFailErrorHandler) {
- return proxyFailErrorHandler(err, req, res);
- }
- // forward to next route and save error for potential handler
- req.err = err;
- req.next();
-});
-
-var httpAuth = require('http-auth');
-
-module.exports = {
- priority: 8,
- middleware: function(config) {
- if(!config.proxy) return;
-
- if(config.errorHtmlFile) {
- var content = fs.readFileSync(config.errorHtmlFile).toString('utf8');
- content = content.replace(/src="(.+?)"/g, function(m, fileName) {
- var imagePath = path.join(path.dirname(config.errorHtmlFile), fileName);
- return 'src="data:image/'+path.extname(fileName).substr(1)+';base64,' + fs.readFileSync(imagePath).toString('base64') + '"';
- });
-
- proxyFailErrorHandler = function(err, req, res) {
- res.writeHead(500, {
- 'Content-Type': 'text/html'
- });
- res.write(content);
- res.end();
- };
- }
-
- var rewriteTargetAndPathIfNeeded = function(req, target) {
- if(!(req.pathMatch || req.hostMatch)) {
- return target;
- }
-
- var processed = regexpHelper(target.href, req.hostMatch, req.pathMatch);
-
- if(req.parsedUrl.search)
- processed += req.parsedUrl.search;
-
- var newTarget = url.parse(processed);
- if(target.withPath) {
- req.url = newTarget.path;
- }
- return newTarget;
- };
-
- return new DispatchTable({
- config: config.proxy,
- requestHandler: function(req, res, next, dispatchTarget) {
- req.connection.proxy = proxy;
- req.next = next;
-
- // workaround for node-http-proxy/#591
- if(!req.headers.host) {
- req.headers.host = '';
- }
-
- var proxyTarget = rewriteTargetAndPathIfNeeded(req, dispatchTarget.target);
- if(dispatchTarget.auth) {
- dispatchTarget.auth(req, res, function(err) {
- // delete the authorization header
- delete req.headers.authorization;
- proxy.web(req, res, {target: proxyTarget});
- });
- }
- else {
- proxy.web(req, res, {target: proxyTarget});
- }
- },
- upgradeHandler: function(req, socket, head, dispatchTarget) {
- var proxyTarget = rewriteTargetAndPathIfNeeded(req, dispatchTarget.target);
- proxy.ws(req, socket, head, {target: proxyTarget});
- },
- entryParser: function(entryKey, entry) {
- var parsedEntry = parseEntry(entry.target || entry);
-
- var authConfig = entry.auth;
- if(typeof authConfig === 'object') {
- authConfig.realm = authConfig.realm || 'Enter password';
- }
- else if(typeof authConfig === 'string') {
- authConfig = {
- file: authConfig,
- realm: 'Enter password'
- }
- }
-
- var auth;
- if(typeof authConfig === 'object') {
- auth = httpAuth.connect(httpAuth.basic(authConfig));
- }
- var entryResult = {
- target: parsedEntry,
- auth: auth
- };
- return [entryKey, entryResult];
- },
- port: config.port
- });
- }
-};
\ No newline at end of file
diff --git a/modules/redirect.js b/modules/redirect.js
deleted file mode 100644
index b0a2467..0000000
--- a/modules/redirect.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var DispatchTable = require('../DispatchTable');
-
-var regexpHelper = require('../regexpHelper');
-
-function splitFirst(str) {
- var index = str.indexOf('/');
- if (index == -1)
- return [str];
- return [str.substr(0, index), str.substr(index)];
-
-}
-
-module.exports = {
- priority: 9,
- middleware: function(config) {
- if (!config.redirect) return;
-
- return new DispatchTable({
- config: config.redirect,
- requestHandler: function(req, res, next, target) {
- if (req.pathMatch || req.hostMatch)
- target = regexpHelper(target, req.hostMatch, req.pathMatch);
-
- target = target.replace("[path]", req.url.substring(1));
- res.statusCode = 302;
- res.setHeader("Location", target);
- return res.end();
- },
- port: config.port
- });
- }
-}
\ No newline at end of file
diff --git a/modules/reject.js b/modules/reject.js
deleted file mode 100644
index 0cd9459..0000000
--- a/modules/reject.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var DispatchTable = require('../DispatchTable');
-var http = require('http');
-
-module.exports = {
- priority: 10,
- middleware: function(config) {
- if (!config.reject) return;
-
- return new DispatchTable({
- config: config.reject,
- requestHandler: function(req, res, next, target) {
- res.statusCode = target;
- res.end((target || 403) + ' ' + (http.STATUS_CODES[target] || 'Forbidden') );
- },
- entryParser: function(entryKey, entry) {
- var code;
- if(typeof entry ==='string' || typeof entry === 'number') {
- code = parseInt(entry) || 403;
- }
- else {
- code = 403;
- }
- return [entryKey, code];
- },
- port: config.port
- });
-
- }
-};
\ No newline at end of file
diff --git a/modules/services/comm.js b/modules/services/comm.js
new file mode 100644
index 0000000..c9da61f
--- /dev/null
+++ b/modules/services/comm.js
@@ -0,0 +1,31 @@
+module.exports = function CommService(events, master, worker) {
+ var processListeners = [];
+
+ var controller = master?master:worker;
+
+ if(master) {
+ return function(namespace) {
+ return {
+ send: function(name, data) {
+ master.workers.forEach(function(worker) {
+ worker.sendMessage(namespace + ':' + name, data);
+ });
+ },
+ on : function(name, cb) {
+ events.on('msg:' + namespace + ':' + name, cb);
+ }
+ }
+ };
+ } else if(worker) {
+ return function(namespace) {
+ return {
+ send : function(name, data) {
+ worker.sendMessage(namespace + ':' + name, data);
+ },
+ on : function(name, cb) {
+ events.on('msg:' + namespace + ':' + name, cb);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/services/logFile.js b/modules/services/logFile.js
new file mode 100644
index 0000000..ab68f28
--- /dev/null
+++ b/modules/services/logFile.js
@@ -0,0 +1,70 @@
+var fs = require('fs');
+var uidNumber = require('uid-number');
+
+module.exports = function LogFileService(config, commService, master, worker) {
+
+ var comm = commService('logFile');
+
+ var logFileHandlers = {};
+
+ var user = config.user;
+ var group = config.group;
+
+ if(master) {
+ var serviceFunction = function(logFile) {
+ if(logFileHandlers[logFile])
+ return logFileHandlers[logFile];
+
+ var watch;
+ var stream;
+
+ function openLogFile(logFile) {
+
+ stream = fs.createWriteStream(logFile, {
+ 'flags': 'a'
+ });
+ if(user || group) {
+ uidNumber(user, group, function(err, userId, groupId) {
+ fs.chown(logFile, userId, groupId);
+ });
+ }
+ stream.once('open', function() {
+ watch = fs.watch(logFile, function(action, filename) {
+ if (action == 'rename') {
+ watcher[logFile].close();
+ openLogFile(logFile);
+ }
+ });
+ });
+ return stream;
+ }
+ openLogFile(logFile);
+
+ comm.on('write:' + logFile, function(data) {
+ stream.write(data);
+ });
+
+ logFileHandlers[logFile] = {
+ write: function(data) {
+ stream.write(data);
+ }
+ };
+
+ return logFileHandlers[logFile];
+ };
+
+ comm.on('open', serviceFunction);
+
+ return serviceFunction;
+
+ } else {
+ return function(logFile) {
+ comm.send('open', logFile);
+ return {
+ write: function(data) {
+ comm.send('write:' + logFile, data);
+ }
+ }
+ };
+ }
+};
\ No newline at end of file
diff --git a/modules/static.js b/modules/static.js
deleted file mode 100644
index 954a30b..0000000
--- a/modules/static.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var nodeStatic = require('node-static');
-var DispatchTable = require('../DispatchTable');
-
-
-var regexpHelper = require('../regexpHelper');
-
-module.exports = {
- middleware: function(config) {
- if (!config.static) return;
-
- return new DispatchTable({
- config: config.static,
- requestHandler: function(req, res, next, target) {
- var fileServer = target.server;
- target = target.target;
- target = target.replace('[path]', req.url);
-
- req.url = regexpHelper(target, req.hostMatch, req.pathMatch);
-
-
- fileServer.serve(req, res, function(e, serveRes) {
- if (e && (e.status === 404)) { // If the file wasn't found
- var promise = fileServer.serveFile('/404.html', 404, {}, req, res);
- promise.on('error', function(err) {
- res.writeHead(500, {
- 'Content-Type': 'text/plain'
- });
- res.write('');
- res.end();
- });
- }
- });
- },
- entryParser: function(entryKey, entry) {
-
-
- return [entryKey, {server: new nodeStatic.Server(entry.path || entry), target: entry.target || "[path]"}];
- },
- port: config.port
- });
-
- }
-};
\ No newline at end of file
diff --git a/package.json b/package.json
index 1790ad6..f998d69 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,10 @@
{
"name": "http-master",
- "version": "0.7.15",
+ "version": "1.0.0",
"description": "Easy to setup, convenient, universal, parallel, http/https proxy daemon. Setup in 1 minute, run, configure, adapt. Proxying based on excellent node-http-proxy.",
- "main": "master.js",
+ "main": "src/master.js",
"scripts": {
- "test": "./node_modules/istanbul/lib/cli.js cover mocha -- -R spec tests/"
+ "test": "./node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha -- -R spec tests/"
},
"repository": {
"type": "git",
@@ -15,7 +15,10 @@
"https",
"proxy"
],
- "bin": "./http-master",
+ "bin": {
+ "http-master": "./bin/http-master",
+ "cert-scan": "./bin/cert-scan"
+ },
"author": "Damian Kaczmarek ",
"contributors": [
"Damian Nowak "
@@ -23,28 +26,31 @@
"license": "MIT",
"dependencies": {
"async": "0.9.0",
- "bugsnag": "1.2",
+ "bugsnag": "1.5.0",
"compression": "1.1.0",
+ "eventemitter3": "^0.1.5",
"extend": "2.0.0",
"http-auth": "2.1.6",
- "http-proxy": "1.2.1",
+ "http-proxy": "1.5.3",
"js-yaml": "3.2.2",
"jsonlint-lines": "1.6.0",
"moment": "2.6.0",
+ "morgan": "^1.3.2",
"node-static": "0.7.2",
"node-watch": "0.3.4",
- "optimist": "0.6.0",
"parse-x509": "0.1.0",
"spdy": "1.28.2",
"uid-number": "0.0.5",
- "xregexp": "2.0.0"
+ "ws": "^0.4.32",
+ "xregexp": "2.0.0",
+ "yargs": "^1.3.2"
},
"devDependencies": {
- "chai": "1.9.2",
+ "chai": "~1.8.1",
"fs.extra": "^1.2.1",
- "istanbul": "0.3.2",
+ "istanbul": "~0.2.7",
"mocha": "^1.18.2",
- "should": "4.0.4"
+ "should": "~2.1.1"
},
"optionalDependencies": {
"codeclimate-test-reporter": "~0.0.3"
diff --git a/regexpHelper.js b/regexpHelper.js
deleted file mode 100644
index 6a2deab..0000000
--- a/regexpHelper.js
+++ /dev/null
@@ -1,27 +0,0 @@
-function processMatch(target, m, offset) {
- var keyWithOffset;
- if (m && m.length > 1) {
- for(var key in m) {
- if(offset && !isNaN(key)) {
- key = parseInt(key);
- keyWithOffset = (key + offset);
- }
- else
- keyWithOffset = key;
- var replaceValue = m[key];
- target = target.replace("[" + keyWithOffset + "]", replaceValue?replaceValue:"");
- }
- }
- return target;
-}
-
-module.exports = function(href, hostMatch, pathMatch) {
- var pathMatchOffset = 0;
- if(hostMatch) {
- pathMatchOffset = hostMatch.length - 1;
- }
- href = processMatch(href, hostMatch);
-
- href = processMatch(href, pathMatch, pathMatchOffset);
- return href;
-}
\ No newline at end of file
diff --git a/requestHandler.js b/requestHandler.js
deleted file mode 100644
index 4332d20..0000000
--- a/requestHandler.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var http = require('http');
-var url = require('url');
-
-var punycode = require('punycode');
-
-module.exports = function(config, middleware) {
- var length = middleware.length;
-
- return {
- request: function(req, res) {
- var i = 0;
- req.parsedUrl = url.parse(req.url);
-
- if(req.headers.host) { // this legally can be undefined
- var hostSplit = req.headers.host.split(':');
- try {
- hostSplit[0] = punycode.toUnicode(hostSplit[0]);
- req.unicodeHost = hostSplit.join(":");
- } catch(err) {
- req.unicodeHost = req.headers.host;
- }
- }
-
- function runMiddleware() {
- if (i < length) {
- middleware[i++](req, res, function(err) {
- if (err) {
- return;
- }
- runMiddleware();
- });
- }
- }
- runMiddleware();
- }
- };
-};
\ No newline at end of file
diff --git a/DispatchTable.js b/src/DispatchTable.js
similarity index 71%
rename from DispatchTable.js
rename to src/DispatchTable.js
index 95eb0cf..96aab04 100644
--- a/DispatchTable.js
+++ b/src/DispatchTable.js
@@ -1,5 +1,6 @@
'use strict';
var XRegExp = require('xregexp').XRegExp;
+var assert = require('assert');
// globStringToRegex from: http://stackoverflow.com/a/13818704/403571
function regexpQuote(str, delimiter) {
@@ -19,8 +20,7 @@ function regexpQuote(str, delimiter) {
}
function splitFirst(str) {
-
- var m = str.match(/^(\^?[^\/]+)\$?(?:(\/)(\^?)(.+))?$/);
+ var m = str.match(/^(\^?[^\/]*)\$?(?:(\/)(\^?)(.*))?$/);
if(m.length > 2) {
// make ^/path from /^path
return [m[1], m[3] + m[2]+m[4]];
@@ -28,9 +28,7 @@ function splitFirst(str) {
return [m[1]];
}
-
-
-function globStringToRegex(str, specialCh) {
+function globStringToRegex(str, specialCh, optionalEnding) {
if(!specialCh)
specialCh = '.';
var inside = regexpQuote(str);
@@ -44,33 +42,32 @@ function globStringToRegex(str, specialCh) {
inside = inside.replace(/\/\\\*$/g, '(?:\/(?.*|)|)');
inside = inside.replace(/\\\*/g, '([^'+specialCh+']+)');
- var regexp = new XRegExp('^' + inside + '$');
+ var regexp = new XRegExp('^' + inside + (optionalEnding?('(?:'+optionalEnding+')?'):'') + '$');
return regexp;
}
-function getRegexpIfNeeded(str, specialCh) {
+function getRegexpIfNeeded(str, specialCh, optionalEnding) {
if (typeof str == 'string') {
var m = str.match(/^\^(.*)\$?$/);
if (m) {
- return new XRegExp('^' + m[1] + '$');
+ return new XRegExp('^' + m[1] + (optionalEnding?('(?:'+optionalEnding+')?'):'') + '$');
} else if (str.match(/[*?]/)) {
- return globStringToRegex(str, specialCh);
+ return globStringToRegex(str, specialCh, optionalEnding);
}
}
return undefined;
}
function postParseKey(entryKey, entry) {
- var regexp = getRegexpIfNeeded(entryKey);
+ var regexp = getRegexpIfNeeded(entryKey, '.', ':' + entry.port);
if (regexp)
entry.regexp = regexp;
return entryKey;
}
-function DispatchTable(params) {
+function DispatchTable(port, params) {
var parseEntry = params.entryParser;
var config = params.config;
- var port = params.port;
var self = this;
this.requestHandler = params.requestHandler;
@@ -78,7 +75,7 @@ function DispatchTable(params) {
this.table = {};
this.regexpEntries = [];
this.failedEntries = {};
- Object.keys(config).forEach(function(entryKey) {
+ Object.keys(config || {}).forEach(function(entryKey) {
var entry = config[entryKey];
@@ -93,22 +90,13 @@ function DispatchTable(params) {
}
if (parseEntry) {
- try {
- var parsed = parseEntry(entryKey, entry);
- entryKey = parsed[0];
- entry = parsed[1];
- } catch(err) {
- // save failed parsed entry for future
- // error reporting
- self.failedEntries[entryKey] = {
- err: err,
- entry: entry
- };
- return;
- }
+ var parsedEntry = parseEntry(entry);
+ assert(typeof parsedEntry !== 'undefined', 'entryParser should have returned something');
+ entry = parsedEntry;
}
entry = {
target: entry,
+ port: port
};
if (entryPath) {
entry.path = entryPath;
@@ -122,7 +110,6 @@ function DispatchTable(params) {
if (entry.regexp) {
self.regexpEntries.push(entry);
} else {
-
if (self.table[entryKey]) {
if (self.table[entryKey] instanceof Array) {
self.table[entryKey].push(entry);
@@ -155,7 +142,11 @@ DispatchTable.prototype.checkPathForReq = function(req, entry) {
if(entry.pathRegexp) {
m = pathname.match(entry.pathRegexp);
if (m) {
- req.pathMatch = m;
+ if(!req.match)
+ req.match = [];
+ for(var i = 1;i < m.length;++i) {
+ req.match.push(m[i]);
+ }
return true;
}
}
@@ -169,50 +160,57 @@ DispatchTable.prototype.getTargetForReq = function(req) {
var i, m;
var host = req.unicodeHost || req.headers.host || ''; // host can be undefined
- if (this.table[host]) {
- if (this.table[host].target) {
- if(this.checkPathForReq(req, this.table[host])) {
- return this.table[host].target;
+ var self = this;
+ var target;
+
+ // look for specific host match first
+ // and generic path-only match then
+ [host, ''].some(function(host) {
+ var entry = self.table[host];
+ if (entry) {
+ if (entry.target) {
+ if(self.checkPathForReq(req, entry)) {
+ target = entry.target
+ return true;
+ }
}
- }
- else { // multiple entries, check pathnames
- var targetEntries = this.table[host];
- for (i = 0; i < targetEntries.length; ++i) {
- if(this.checkPathForReq(req, targetEntries[i]))
- return targetEntries[i].target;
+ else { // multiple entries, check pathnames
+ var targetEntries = entry;
+ for (i = 0; i < targetEntries.length; ++i) {
+ if(self.checkPathForReq(req, targetEntries[i])) {
+ target = targetEntries[i].target;
+ return true;
+ }
+ }
}
}
+ });
+ if(target) {
+ return target;
}
+ // if host-only matches failed, look for path matches
if (this.regexpEntries.length) {
var regexpEntries = this.regexpEntries;
for (i = 0; i < regexpEntries.length; ++i) {
var entry = regexpEntries[i];
if(!entry.regexp) {
// TODO: research this
- console.log('Should not happen', (new Error()).toString());
continue;
}
m = host.match(entry.regexp);
if (m) {
- req.hostMatch = m;
- if(this.checkPathForReq(req, entry))
+ if(!req.match)
+ req.match = [];
+ for(var i = 1;i < m.length;++i)
+ req.match.push(m[i]);
+ if(this.checkPathForReq(req, entry)) {
return entry.target;
+ }
}
}
}
};
-DispatchTable.prototype.dispatchUpgrade = function(req, socket, head) {
- var target = this.getTargetForReq(req);
- if(target && this.upgradeHandler) {
- this.upgradeHandler(req, socket, head, target);
- return true;
- }
- return false;
-};
-
-DispatchTable.prototype.handleUpgrade = DispatchTable.prototype.dispatchUpgrade;
-
DispatchTable.prototype.dispatchRequest = function(req, res, next) {
var target = this.getTargetForReq(req);
if(target && this.requestHandler) {
diff --git a/HttpMaster.js b/src/HttpMaster.js
similarity index 77%
rename from HttpMaster.js
rename to src/HttpMaster.js
index af816b5..eae167c 100644
--- a/HttpMaster.js
+++ b/src/HttpMaster.js
@@ -1,8 +1,6 @@
var async = require('async');
-var EventEmitter = require('events').EventEmitter;
-var common = require('./common');
-var runModules = common.runModules;
+var EventEmitter = require('eventemitter3').EventEmitter;
var path = require('path');
var CertScanner = require('./certScanner');
var extend = require('extend');
@@ -40,8 +38,10 @@ function HttpMaster()
args: []
});
+
+
-this.autoRestartWorkers = true;
+ this.autoRestartWorkers = true;
var self = this;
cluster.on('exit', function(worker, code, signal) {
@@ -77,6 +77,7 @@ function initWorker(cb) {
var msg = JSON.parse(msg);
process.emit('msg:' + msg.type, msg.data, worker);
worker.emit('msg:' + msg.type, msg.data);
+ worker.emit('msg', {type: msg.type, data: msg.data});
});
worker.once('msg:started', function() {
@@ -171,13 +172,59 @@ function preprocessConfig(config, cb) {
}
+function setupDi() {
+ var self = this;
+ var di = this.di = new DI();
+ di.onMissing = function(name) {
+ var m;
+ if( (m = name.match(/(.+)Service$/))) {
+ name = m[1];
+ try {
+ this.bindType(name + 'Service', require(path.join(__dirname , '..', 'modules', 'services', name)));
+ } catch(err) {
+ console.log(err && err.message);
+ return;
+ }
+ self.emit('loadService', name);
+ return this.resolve(name + 'Service');
+ }
+ };
+
+ di.bindInstance('di', di);
+ di.bindInstance('master', this);
+ di.bindInstance('worker', null);
+ di.bindInstance('events', process);
+
+ di.bindResolver('config', function() {
+ return self.config;
+ });
+ var config = self.config;
+
+ config.modules = config.modules || {};
+
+ Object.keys(config.modules).forEach(function(moduleName) {
+ if(!config.modules[moduleName])
+ return;
+ var di = self.di.makeChild();
+ di.bindInstance('di', di);
+ di.bindInstance('moduleConfig', config.modules[moduleName]);
+ try {
+ di.resolve(require(path.join(__dirname, '..', 'modules', moduleName)));
+ } catch(err) {
+ console.error("Error loading module:", moduleName, err);
+ }
+ });
+}
+
HttpMaster.prototype.reload = function(config, reloadDone) {
var self = this;
+ this.emit('reload');
function actualReload(config) {
self.config = config;
var workers = self.workers;
+ setupDi.call(self);
if((config.workerCount || 0) !== self.workerCount) {
//self.logError("Different workerCount, exiting! Hopefully we will be restarted and run with new workerCount");
@@ -231,6 +278,7 @@ HttpMaster.prototype.reload = function(config, reloadDone) {
preprocessConfig.call(this, config, actualReload);
};
+var DI = require('./di');
HttpMaster.prototype.init = function(config, initDone) {
var worker;
@@ -240,20 +288,28 @@ HttpMaster.prototype.init = function(config, initDone) {
function actualInit(config) {
self.config = config;
- runModules("initMaster", self, config);
+ setupDi.call(self);
+
self.workerCount = config.workerCount || 0;
if(self.workerCount === 0) {
var singleWorker = self.singleWorker = new (require('./HttpMasterWorker'))();
+
+ singleWorker.sendMessage = function(type, data) {
+ process.emit('msg:' + type, data);
+ }
singleWorker.on('logNotice', self.logNotice.bind(self));
singleWorker.on('logError', self.logError.bind(self));
+ singleWorker.on('loadService', function(name) {
+ self.di.resolve(name + 'Service');
+ });
self.singleWorker.loadConfig(config, function(err) {
if (err) {
return initDone(err);
}
self.emit('allWorkersStarted');
- runModules("allWorkersStarted", config);
+ //runModules("allWorkersStarted", config);
if(initDone)
initDone()
@@ -264,9 +320,15 @@ HttpMaster.prototype.init = function(config, initDone) {
self.token = token;
async.times((config.workerCount), function(n, next) {
- workers.push(initWorker.call(self, function() {
+ var worker = initWorker.call(self, function() {
next(null);
- }));
+ })
+ worker.on('msg:logNotice', self.logNotice.bind(self));
+ worker.on('msg:logError', self.logError.bind(self));
+ worker.on('msg:masterLoadService', function(name) {
+ self.di.resolve(name + 'Service');
+ });
+ workers.push(worker);
}, function(err) {
if (err) {
return initDone(err);
@@ -274,7 +336,7 @@ HttpMaster.prototype.init = function(config, initDone) {
self.emit('allWorkersStarted');
- runModules("allWorkersStarted", config);
+ //runModules("allWorkersStarted", config);
if(initDone)
initDone()
});
diff --git a/src/HttpMasterWorker.js b/src/HttpMasterWorker.js
new file mode 100644
index 0000000..17deb87
--- /dev/null
+++ b/src/HttpMasterWorker.js
@@ -0,0 +1,460 @@
+'use strict';
+var crypto = require('crypto'),
+ extend = require('extend'),
+ net = require('net'),
+ http = require('http'),
+ async = require('async'),
+ regexpQuote = require('./DispatchTable').regexpQuote,
+ url = require('url'),
+ tls = require('tls'),
+ DI = require('./di'),
+ path = require('path');
+
+var nodeVersion = Number(process.version.match(/^v(\d+\.\d+)/)[1]);
+
+var EventEmitter = require('eventemitter3');
+
+var argv = {}; // will be sent by master
+
+var punycode = require('punycode');
+
+var createCredentials;
+if(tls.createSecureContext) {
+ createCredentials = tls.createSecureContext;
+} else {
+ createCredentials = crypto.createCredentials;
+}
+
+function lazyGetTcpServer(port, host, cb) {
+ var tcpServers = this.tcpServers;
+
+ var entry = (host ? host + ':' + port : port);
+ if (tcpServers[entry]) {
+ cb(null, tcpServers[entry]);
+ } else {
+ var tcpServer = tcpServers[entry] = net.createServer();
+
+ var handler = function(err) {
+ if (err) return cb(err);
+ cb(null, tcpServer);
+ };
+ try {
+ if (host)
+ tcpServer.listen(port, host, handler);
+ else
+ tcpServer.listen(port, handler);
+ tcpServer.once('error', function(err) {
+ delete tcpServers[entry];
+ cb(err);
+ });
+ } catch (err) {
+ cb(err);
+ }
+ }
+}
+
+function loadKeysforConfigEntry(config, callback) {
+ var key;
+ if (config.ssl) {
+ var SNI = config.ssl.SNI;
+ var SNImatchers = {};
+ if (config.ssl.SNI) {
+ for (key in config.ssl.SNI) {
+ SNImatchers[key] = new RegExp(regexpQuote(key).replace(/^\\\*\\\./g, '^([^.]+\\.)?'), 'i'); // domain names are case insensitive
+ }
+ var sniCallback = function(hostname, cb) {
+ hostname = punycode.toUnicode(hostname);
+ for (var key in SNI) {
+ if (hostname.match(SNImatchers[key])) {
+ if (cb) // since node 0.11.5
+ return cb(null, SNI[key]);
+ else
+ return SNI[key];
+ }
+ }
+ if (cb)
+ return cb(null);
+ };
+ config.ssl.SNICallback = sniCallback;
+ }
+
+ if (SNI) {
+ var todo = [];
+ for (key in SNI) {
+ todo.push(key);
+ }
+
+ async.each(todo, function(key, sniLoaded) {
+ if(config.ssl.spdy && SNI[key].spdy === false) {
+ SNI[key].NPNProtocols = ['http/1.1', 'http/1.0'];
+ SNI[key].ALPNProtocols = ['http/1.1', 'http/1.0'];
+ }
+
+ SNI[key].ciphers = SNI[key].ciphers || config.ssl.ciphers;
+ SNI[key].honorCipherOrder = SNI[key].honorCipherOrder || config.ssl.honorCipherOrder;
+ SNI[key].ecdhCurve = SNI[key].ecdhCurve || config.ssl.ecdhCurve;
+
+ // joyent/node#7249
+ if (SNI[key].honorCipherOrder) {
+ SNI[key].secureOptions = require('constants').SSL_OP_CIPHER_SERVER_PREFERENCE;
+ }
+ if (!SNI[key].ecdhCurve) {
+ SNI[key].ecdhCurve = require('tls').DEFAULT_ECDH_CURVE;
+ }
+ try {
+ var credentials = createCredentials(SNI[key]);
+ SNI[key] = credentials.context;
+ sniLoaded();
+ } catch (err) {
+ sniLoaded(err);
+ }
+ }, callback);
+ } else { // (!SNI)
+ callback();
+ }
+ // });
+ } else { // (!config.ssl)
+ callback();
+ }
+}
+
+function handlePortEntryConfig(host, portNumber, portEntryConfig, callback) {
+ var self = this;
+ loadKeysforConfigEntry(portEntryConfig, function(err) {
+ if (err) {
+ return callback(err);
+ }
+ handleConfigEntryAfterLoadingKeys.call(self, host, portNumber, portEntryConfig, callback);
+ });
+}
+
+function patchSslConfig(portEntrySslConfig) {
+ if(nodeVersion >= 0.11) { // use fancy cipher settings only for 0.11
+ if(portEntrySslConfig.honorCipherOrder !== false) {
+ // prefer server ciphers over clients - prevents BEAST attack
+ portEntrySslConfig.honorCipherOrder = true;
+ }
+ if(!portEntrySslConfig.ciphers) {
+ portEntrySslConfig.ciphers = 'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+AES+SHA:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS::+RC4:RC4';
+ if(portEntrySslConfig.disableWeakCiphers) {
+ portEntrySslConfig.ciphers += ':!RC4';
+ }
+ }
+ else if(portEntrySslConfig.disableWeakCiphers) {
+ this.logNotice('disableWeakCiphers is incompatible with pre-set cipher list');
+ }
+ } else if(portEntrySslConfig.disableWeakCiphers) {
+ this.logNotice('disableWeakCiphers is unsupported for node 0.10');
+ }
+}
+
+
+
+function createHandlers(portNumber, portConfig) {
+ var self = this;
+
+ var di = this.di.makeChild();
+ di.bindInstance('di', di);
+
+ di.bindInstance('portConfig', portConfig);
+ di.bindInstance('portNumber', portNumber);
+
+ di.onMissing = function(name) {
+
+ var m;
+ if( (m = name.match(/(.+)Middleware$/))) {
+ name = m[1];
+ try {
+ di.bindType(name + 'Middleware', require('../' + path.join('modules/middleware/', name)));
+ } catch(err) {
+ console.log(err && err.message);
+ return;
+ }
+ return di.resolve(name + 'Middleware');
+ }
+ };
+
+ var router = di.resolve('routerMiddleware');
+
+ // allow also for specifying 80: 'http://code2flow.com:8080'
+ if(typeof portConfig !== 'object' || portConfig instanceof Array) {
+ portConfig = {
+ router: portConfig
+ };
+ }
+
+ if(!(portConfig.router instanceof Array)) {
+ portConfig.router == [portConfig.router];
+ }
+
+ portConfig.router = (self.config.middleware || []).concat(portConfig.middleware || []).concat(portConfig.router);
+
+ var reject = di.resolve('rejectMiddleware');
+
+ var target = router.entryParser(portConfig.router);
+ return {
+ request: function(req, res, next) {
+ router.requestHandler(req, res, next, target);
+ },
+ error: function(err, req, res) {
+ var code = 500;
+ if(!err)
+ code = 503;
+ reject.requestHandler(req, res, null, reject.entryParser(500));
+ }
+ };
+}
+
+function handleConfigEntryAfterLoadingKeys(host, portNumber, config, callback) {
+ var self = this;
+
+ var handlers = createHandlers.call(this, portNumber, config);
+
+ var handler = require('./requestHandler')(handlers.request, handlers.error);
+
+ var server;
+ try {
+ if (config.ssl) {
+ var baseModule = config.ssl.spdy ? require('spdy') : require('https');
+
+ patchSslConfig.call(self, config.ssl);
+
+ server = baseModule.createServer(config.ssl, handler);
+
+ if (!config.ssl.skipWorkerSessionResumption) {
+ server.on('resumeSession', self.tlsSessionStore.get.bind(self.tlsSessionStore));
+ server.on('newSession', self.tlsSessionStore.set.bind(self.tlsSessionStore));
+
+ if (self.token) {
+ if (server._setServerData) {
+ server._setServerData({
+ ticketKeys: self.token
+ });
+ } else {
+ self.logNotice('SSL/TLS ticket session resumption may not work due to missing method _setServerData, you might be using an old version of Node');
+ }
+ }
+ }
+ } else {
+ server = http.createServer(handler);
+ }
+ } catch (err) {
+ return callback(err, null);
+ }
+
+ function listeningHandler() {
+ server.removeAllListeners('error'); // remove the below handler
+ callback(null, server);
+ server.removeListener('error', errorHandler);
+ }
+
+ function errorHandler(err) {
+ server.removeAllListeners('listening'); // remove the above handler
+ callback(err, server);
+ server.removeListener('listening', listeningHandler);
+ }
+
+ server.once('listening', listeningHandler);
+ server.once('error', errorHandler);
+ server.on('upgrade', function(req, socket, head) {
+ req.upgrade = {
+ socket: socket,
+ head: head
+ };
+ handler(req, { // fake res object for log middleware to work
+ socket: socket
+ });
+ });
+
+ lazyGetTcpServer.call(self, portNumber, host, function(err, tcpServer) {
+
+ if (err) return callback(err, server);
+
+ tcpServer.removeAllListeners();
+ tcpServer.on('connection', function(socket) {
+ server.emit('connection', socket);
+ });
+ tcpServer.on('error', function(err) {
+ server.emit('error', err);
+ });
+ tcpServer.on('close', function(err) {
+ server.emit('close');
+ });
+ server.emit('listening');
+ });
+}
+
+function handleConfig(config, configHandled) {
+ var self = this;
+
+ async.parallel(Object.keys(config.ports || {}).map(function(portEntry) {
+ return function(asyncCallback) {
+ var m;
+ // TODO: IPV6?
+ if ((m = portEntry.match(/((\S+):)?(\d+)/))) {
+ var listenHost = m[2];
+ var listenPortNumber = parseInt(m[3]);
+
+ var portConfig = config.ports[portEntry];
+
+ handlePortEntryConfig.call(self, listenHost, listenPortNumber, portConfig, function(err, server) {
+ var entryString = (listenHost ? listenHost + ':' + listenPortNumber : 'port ' + listenPortNumber);
+ if (err) {
+ self.logError('Error while starting entry ' + entryString + ' : ' + err.toString());
+ if (err.stack)
+ self.logError(err.stack);
+ }
+ if (server) {
+ self.logNotice('Listening on port: ' + entryString);
+ } else
+ self.logNotice('Entry ' + entryString + ' is unusable');
+ // ignore error to not crash the entire proxy
+ asyncCallback(null, server);
+ });
+ }
+ };
+ }), function(err, results) {
+ if (err) {
+ return configHandled(err);
+ }
+ self.logNotice('Start successful');
+
+ // TODO
+ //dropPrivileges();
+
+ self.servers = results.filter(function(server) {
+ return !!server;
+ });
+ configHandled();
+ });
+}
+
+function unbindAll(cb) {
+ this.servers.forEach(function(server) {
+ server.unref();
+ });
+ this.servers = [];
+ var self = this;
+ Object.keys(this.tcpServers).forEach(function(key) {
+ self.tcpServers[key].removeAllListeners();
+ });
+ cb();
+}
+
+function HttpMasterWorker(config) {
+ config = config || {};
+ this.config = config;
+ var store = {};
+ this.tlsSessionStore = config.tlsSessionStore || {
+ get: function(id, cb) {
+ id = id.toString('base64');
+ cb(null, store[id], null);
+ },
+ set: function(id, data, cb) {
+ id = id.toString('base64');
+ store[id] = data;
+ if (cb)
+ cb();
+ }
+ };
+ this.tcpServers = {};
+ this.servers = [];
+}
+
+HttpMasterWorker.prototype = Object.create(EventEmitter.prototype);
+
+HttpMasterWorker.prototype.logNotice = function(msg) {
+ this.emit('logNotice', msg);
+};
+
+HttpMasterWorker.prototype.logError = function(msg) {
+ this.emit('logError', msg);
+};
+
+HttpMasterWorker.prototype.unbindAll = function(unbindFinished) {
+ unbindAll.call(this, unbindFinished);
+};
+
+HttpMasterWorker.prototype.loadConfig = function(config, configLoaded) {
+ var self = this;
+
+ var events = new EventEmitter();
+ function messageHandler(msg) {
+ events.emit('msg:'+msg.type, msg.data);
+ }
+ this.handleMessage = messageHandler;
+
+ this.unbindAll(function() {});
+ if(this.di) {
+ this.emit('reload');
+ }
+ var di = this.di = new DI();
+
+ di.onMissing = function(name) {
+ var m;
+ if( (m = name.match(/(.+)Service$/))) {
+ name = m[1];
+ try {
+ this.bindType(name + 'Service', require(path.join(__dirname, '..', 'modules/services/', name)));
+ } catch(err) {
+ console.log(err && err.message);
+ return;
+ }
+ self.emit('loadService', name);
+ return this.resolve(name + 'Service');
+ }
+ };
+
+ di.bindInstance('di', di);
+ di.bindInstance('worker', this);
+
+ this.once('reload', function() {
+ process.removeListener('msg', messageHandler);
+ events.emit('reload');
+ events.removeAllListeners();
+ });
+
+ di.bindInstance('events', events);
+ di.bindResolver('config', function() {
+ return self.config;
+ });
+ di.bindInstance('master', null);
+ Object.keys(config.modules || {}).forEach(function(moduleName) {
+ if(!config.modules[moduleName])
+ return;
+ var di = self.di.makeChild();
+ di.bindInstance('di', di);
+ di.bindInstance('moduleConfig', config.modules[moduleName]);
+ try {
+ di.resolve(require(path.join(__dirname, '..', 'modules', moduleName)));
+ } catch(err) {
+ console.error("Error loading module:", moduleName, err);
+ }
+ });
+
+
+ handleConfig.call(this, config, function(err) {
+ if (err) return configLoaded(err);
+ self.gcServers(configLoaded);
+ });
+};
+
+HttpMasterWorker.prototype.gcServers = function(gcFinished) {
+ var self = this;
+ var toClose = [];
+
+ Object.keys(this.tcpServers).forEach(function(key) {
+ var server = self.tcpServers[key];
+ if (require('events').EventEmitter.listenerCount(server, 'connection') === 0) {
+ toClose.push(server);
+ delete self.tcpServers[key];
+ }
+ });
+ async.each(toClose, function(server, cb) {
+ server.close();
+ cb();
+ }, gcFinished);
+
+};
+
+module.exports = HttpMasterWorker;
\ No newline at end of file
diff --git a/certScanner.js b/src/certScanner.js
similarity index 95%
rename from certScanner.js
rename to src/certScanner.js
index 9c58355..5accb77 100644
--- a/certScanner.js
+++ b/src/certScanner.js
@@ -1,4 +1,5 @@
'use strict';
+
var x509 = require('parse-x509');
var fs = require('fs');
var async = require('async');
@@ -6,7 +7,7 @@ var path = require('path');
var moment = require('moment');
var util = require('util');
-var EventEmitter = require('events').EventEmitter;
+var EventEmitter = require('eventemitter3');
module.exports = function(sslDirectory, options) {
var that = this;
@@ -45,6 +46,17 @@ module.exports = function(sslDirectory, options) {
keys[pem.publicExponent] = options.read ? rawCert : certPath;
return cb();
}
+ if(err) {
+ if(err.toString().match(/Unable to parse certificate/))
+ return cb(null);
+ if(err.toString().match(/Certificate argument provided, but left blank/))
+ return cb(null);
+ return cb(err);
+ }
+ if(!err && !cert && !pem) {
+ return cb();
+ }
+
if(!options.acceptInvalidDates) {
if(moment(cert.notBefore).diff(moment()) < 0) { // valid
@@ -70,12 +82,6 @@ module.exports = function(sslDirectory, options) {
var keyForCert = options.read ? rawCert : certPath;
certs[keyForCert] = cert.publicExponent;
- if(err) {
- if(err.toString().match(/Unable to parse certificate/))
- return cb(null);
- return cb(err);
- }
-
async.each(altNames, function(domain, cb) {
outputConfig[domain] = {};
outputConfig[domain].cert = options.read ? rawCert : certPath;
@@ -172,7 +178,9 @@ module.exports = function(sslDirectory, options) {
fs.stat(certPath, function(err, statData) {
if(statData.isDirectory()) {
- return processDirectory(certPath, cb);
+ return processDirectory(certPath, function() {
+ cb(false); // is a directory
+ });
}
that.getCaCertsFromFile(certPath, function(err, certs, rawCerts) {
@@ -181,15 +189,14 @@ module.exports = function(sslDirectory, options) {
if (that.isDomainCert(certs)) {
return cb(false);
}
-
var matchingCa = certs.filter(function(cert, i) {
var res = that.caMatches(cert, parsedCert);
+
if(res) {
caRawResults.push(rawCerts[i]);
}
return res;
});
-
return cb(matchingCa.length);
});
});
diff --git a/src/di.js b/src/di.js
new file mode 100644
index 0000000..fdd6e17
--- /dev/null
+++ b/src/di.js
@@ -0,0 +1,170 @@
+'use strict';
+var extend = require('extend');
+var assert = require('assert');
+
+var functionRegex = /function\s*([^()]*)\s*\(([^)]*)/;
+// get function arguments as array
+function functionParameters(f) {
+ assert(typeof f === 'function');
+ var matches = functionRegex.exec(f.toString());
+ if(!matches || !matches[2].length) {
+ return [];
+ }
+ return matches[2].split(/[,\s]+/).filter(function(str) {
+ return str.length;
+ });
+}
+function functionName(f) {
+ assert(typeof f === 'function');
+ var matches = functionRegex.exec(f.toString());
+ if(!matches || !matches[1].length) {
+ return null;
+ }
+ return matches[1];
+}
+
+// call new operator with array of arguments
+function construct(constructor, args) {
+ function F() {
+ return constructor.apply(this, args);
+ }
+ F.prototype = constructor.prototype;
+ return new F();
+}
+
+function DI() {
+ this.mapping = {};
+ this.parent = null;
+ this.onMissing = function(name) {
+ }
+}
+
+function stringToCamelCase(str) {
+ return str.replace(/^\w/g, function(txt) {
+ return txt.charAt(0).toLowerCase();
+ });
+}
+
+function bindTypeGeneric(doCache, name, type) {
+ // implicit name from function name
+ if(typeof name === 'function') {
+ type = name;
+ var constructorName = functionName(type);
+ if(!constructorName) {
+ throw new Error('Unable to resolve name from function');
+ }
+ // implicitly bind function MyType {} to
+ // MyType - type instance
+ // myType - instance
+ var instanceName = stringToCamelCase(constructorName);
+ if(instanceName !== constructorName) {
+ try {
+ this.bindInstance(constructorName, type);
+ } catch(err) {
+ // ignore error since we are already doing this implicitly
+ }
+ }
+ name = instanceName;
+ }
+ if(this.mapping[name]) {
+ throw new Error('\'' + name + '\' already bound');
+ }
+
+ var self = this;
+ var mapping = {
+ // this.cache is saved in mapping
+ // 'this' is mapping
+ resolve: function(overrides) {
+ var result = this.cache;
+ if(!result) {
+ result = construct(type, functionParameters(type).map(function(paramName) {
+ return self.resolve(paramName, overrides);
+ }));
+ }
+ if(doCache) {
+ this.cache = result;
+ }
+ return result;
+ }
+ };
+ this.mapping[name] = mapping;
+}
+
+DI.prototype.bindInstance = function(name, instance) {
+ if(this.mapping[name]) {
+ throw new Error('\'' + name + '\' already bound');
+ }
+ this.mapping[name] = {
+ resolve: function() {
+ return instance;
+ }
+ };
+};
+
+DI.prototype.bindResolver = function(name, resolver) {
+ if(this.mapping[name]) {
+ throw new Error('\'' + name + '\' already bound');
+ }
+ this.mapping[name] = {
+ resolve: resolver
+ };
+}
+
+DI.prototype.bindType = function(name, type) {
+ return bindTypeGeneric.call(this, true, name, type);
+};
+
+DI.prototype.bindTransientType = function(name, type) {
+ return bindTypeGeneric.call(this, false, name, type);
+};
+
+DI.prototype.resolve = function(obj, overrides) {
+ var dependencyMap = extend({}, this.mapping, overrides);
+ var args;
+ var resolved;
+
+ if(typeof obj === 'function') {
+ args = functionParameters(obj);
+ resolved = construct(obj, args.map(this.resolve.bind(this)));
+ } else if(typeof obj === 'string') {
+ if(dependencyMap[obj]) {
+ if(dependencyMap[obj].resolve) {
+ resolved = dependencyMap[obj].resolve(overrides);
+ } else {
+ resolved = dependencyMap[obj];
+ }
+ }
+ } else {
+ throw new Error('Unknown type to resolve');
+ }
+
+ if(typeof resolved ==='undefined' && this.onMissing) {
+ resolved = this.onMissing(obj);
+ }
+
+ if(typeof resolved === 'undefined' && this.parent) { // search in parent if not found
+ resolved = this.parent.resolve(obj, overrides);
+ }
+
+ if(typeof resolved === 'undefined' && !dependencyMap[obj]) {
+ throw new Error('No recipe to resolve \'' + obj + '\'');
+ }
+
+ return resolved;
+}
+
+DI.prototype.clone = function() {
+ var cloned = new DI();
+ cloned.mapping = extend({}, this.mapping);
+ cloned.parent = this.parent;
+ cloned.onMissing = this.onMissing;
+ return cloned;
+};
+
+DI.prototype.makeChild = function() {
+ var child = construct(DI, Array.prototype.slice.apply(arguments));
+ child.parent = this;
+ return child;
+};
+
+module.exports = DI;
diff --git a/keyContextLoader.js b/src/keyContextLoader.js
similarity index 100%
rename from keyContextLoader.js
rename to src/keyContextLoader.js
diff --git a/src/regexpHelper.js b/src/regexpHelper.js
new file mode 100644
index 0000000..32d52c3
--- /dev/null
+++ b/src/regexpHelper.js
@@ -0,0 +1,19 @@
+function processMatch(target, m) {
+ var keyWithOffset;
+ if (m && m.length > 0) {
+ for(var key in m) {
+ var replaceFrom = key;
+ if(!isNaN(key)) {
+ replaceFrom = parseInt(key)+1;
+ }
+ var replaceValue = m[key];
+ target = target.replace("[" + replaceFrom + "]", replaceValue?replaceValue:"");
+ }
+ }
+ return target;
+}
+
+module.exports = function(href, match) {
+ var pathMatchOffset = 0;
+ return processMatch(href, match);
+}
\ No newline at end of file
diff --git a/src/requestHandler.js b/src/requestHandler.js
new file mode 100644
index 0000000..65afb5e
--- /dev/null
+++ b/src/requestHandler.js
@@ -0,0 +1,24 @@
+var http = require('http');
+var url = require('url');
+
+var punycode = require('punycode');
+
+module.exports = function(handler, finalHandler) {
+ return function(req, res) {
+ req.parsedUrl = url.parse(req.url);
+ if(req.headers.host) { // this legally can be undefined
+ var hostSplit = req.headers.host.split(':');
+ try {
+ hostSplit[0] = punycode.toUnicode(hostSplit[0]);
+ req.unicodeHost = hostSplit.join(":");
+ } catch(err) {
+ req.unicodeHost = req.headers.host;
+ }
+ }
+ handler(req, res, function(err) {
+ if(finalHandler) {
+ finalHandler(err, req, res);
+ }
+ });
+ };
+};
\ No newline at end of file
diff --git a/testUtils.js b/src/testUtils.js
similarity index 100%
rename from testUtils.js
rename to src/testUtils.js
diff --git a/worker.js b/src/worker.js
similarity index 71%
rename from worker.js
rename to src/worker.js
index f2f3393..ae1e2e1 100644
--- a/worker.js
+++ b/src/worker.js
@@ -1,18 +1,23 @@
var config = {};
var cluster = require('cluster');
-
-var common = require('./common');
-var runModules = common.runModules;
+var util = require('util');
var droppedPrivileges = false;
+process.title = 'http-master-worker#'+cluster.worker.id;
+
function logError(str) {
- if (config.silent)
- return;
console.log('[' + cluster.worker.id + '] ' + str);
}
var logNotice = logError;
+console.log = function() {
+ process.sendMessage("logNotice", util.format.apply(this, arguments));
+};
+console.error = function() {
+ process.sendMessage("logError", util.format.apply(this, arguments));
+}
+
// TODO: move to common
function dropPrivileges() {
var strInfo;
@@ -44,14 +49,14 @@ var worker = new HttpMasterWorker({
tlsSessionStore: {
get: function(id, cb) {
process.once('msg:session:' + id.toString('base64'), function(data) {
- logNotice("Got session data " + data);
+// logNotice("Got session data " + data);
cb(null, data.length ? new Buffer(data, 'base64') : null, null);
});
- logNotice("Get session data " + id.toString('base64'));
+// logNotice("Get session data " + id.toString('base64'));
process.sendMessage('tlsSession:get', id.toString('base64'));
},
set: function(id, data, cb) {
- logNotice("Set session data " + id.toString('base64') + " " + data.toString('base64'));
+// logNotice("Set session data " + id.toString('base64') + " " + data.toString('base64'));
process.sendMessage('tlsSession:set', {
id: id.toString('base64'),
data: data.toString('base64')
@@ -72,8 +77,15 @@ process.sendMessage = function(type, data) {
}));
};
+worker.sendMessage = process.sendMessage;
+
+worker.on('loadService', function(service) {
+ process.sendMessage('masterLoadService', service);
+});
+
process.on('message', function(msg) {
var msg = JSON.parse(msg);
+ process.emit('msg', {type: msg.type, data: msg.data});
process.emit('msg:' + msg.type, msg.data);
});
@@ -84,7 +96,8 @@ process.on('uncaughtException', function(err) {
process.on('msg:start', function(data) {
config = data.config;
- runModules("initWorker", data.config);
+ process.emit('initWorker');
+
dropPrivileges();
worker.token = data.token;
worker.loadConfig(data.config, function(err) {
@@ -103,8 +116,26 @@ process.on('msg:unbind', function() {
process.sendMessage("unbindFinished");
});
});
+
+process.on('msg', function(data) {
+ if(worker.handleMessage)
+ worker.handleMessage(data);;
+});
+
+var originalLog = console.log;
+var originalError = console.error;
+
process.on('msg:reload', function(config) {
+ if (config.silent) {
+ console.log = function(msg) {}
+ console.error = function(msg) {}
+ } else {
+ console.log = originalLog;
+ console.error = originalError;
+ }
+
worker.loadConfig(config, function(err) {
+
if (err) {
process.sendMessage('exception', err);
logError("Exitting worker due to error: " + err.toString())
diff --git a/tests/DispatchTable.js b/tests/DispatchTable.js
deleted file mode 100644
index 3897c64..0000000
--- a/tests/DispatchTable.js
+++ /dev/null
@@ -1,413 +0,0 @@
-'use strict';
-var DispatchTable = require('../DispatchTable');
-var assert = require('assert');
-
-function makeReq(host, path) {
- return {
- url: path,
- headers: {
- host: host
- },
- parsedUrl: require('url').parse(path)
- };
-}
-
-describe('DispatchTable internal structure', function() {
-
- describe('Simple host based', function() {
-
- var config = {
- 'host1': {
- key1: '1'
- },
- 'host2.com': 'stringTarget',
- 'host3.subdomain.net': 400
- };
-
- var dispatchTable = new DispatchTable({
- config: config
- });
- it('should have proper key for each host', function() {
- //console.log(dispatchTable.table);
- assert.deepEqual(dispatchTable.table['host1'], {
- target: {
- key1: '1'
- }
- });
- assert.deepEqual(dispatchTable.table['host2.com'], {
- target: 'stringTarget'
- });
-
- assert.deepEqual(dispatchTable.table['host3.subdomain.net'], {
- target: 400
- });
-
- });
- it('should have empty regexp table', function() {
- dispatchTable.regexpEntries.should.be.empty;
- });
-
- });
-
- describe('Wildcards', function() {
-
- var config = {
- 'host2.*': {
- key1: '1'
- },
- '*.host2.com': 'stringTarget',
- 'host3.*.net': 400,
- '*?.host4.com': 'stringTarget',
- 'host5.*?.*': 400
- };
-
- var dispatchTable = new DispatchTable({
- config: config
- });
-
- it('should have proper regexp entries', function() {
- dispatchTable.regexpEntries.should.not.be.empty;
-
- var entry = dispatchTable.regexpEntries[0];
- assert.deepEqual(entry.target, {
- key1: '1'
- });
- assert(entry.regexp, 'has regexp');
-
- entry = dispatchTable.regexpEntries[1];
- assert.deepEqual(entry.target, 'stringTarget');
- assert(entry.regexp, 'has regexp');
-
- entry = dispatchTable.regexpEntries[2];
- assert.deepEqual(entry.target, 400);
- assert(entry.regexp, 'has regexp');
- });
-
- it('should have wildcards compiled to proper working regexps', function() {
-
- var entry;
- entry = dispatchTable.regexpEntries[0];
- assert('host2.com'.match(entry.regexp));
- assert('host2.net'.match(entry.regexp));
- assert('host2.org'.match(entry.regexp));
- assert(!'host2.co.uk'.match(entry.regexp));
- assert(!'.host2.com'.match(entry.regexp));
- assert(!'www.host2.com'.match(entry.regexp));
- entry = dispatchTable.regexpEntries[1];
-
- assert(!'host2.com'.match(entry.regexp));
- assert(!'hhost2.com'.match(entry.regexp));
- assert(!'.host2.com'.match(entry.regexp));
- assert('www.host2.com'.match(entry.regexp));
- assert('www.test.host2.com'.match(entry.regexp));
-
- entry = dispatchTable.regexpEntries[2];
- assert('host3.ddd.net'.match(entry.regexp));
- assert(!'host3..net'.match(entry.regexp));
- assert('host3.test.net'.match(entry.regexp));
- assert(!'host3.test.test2.net'.match(entry.regexp));
- assert(!'host3.net'.match(entry.regexp));
-
- entry = dispatchTable.regexpEntries[3];
- assert('host4.com'.match(entry.regexp));
- assert(!'hhost4.com'.match(entry.regexp));
- assert(!'.host4.com'.match(entry.regexp));
- assert('www.host4.com'.match(entry.regexp));
- assert('www.test.host4.com'.match(entry.regexp));
-
- entry = dispatchTable.regexpEntries[4];
- assert('host5.com'.match(entry.regexp));
- assert('host5.co.uk'.match(entry.regexp));
-
- });
-
- });
-
- describe('Regexps', function() {
-
- var config = {
- '^.+': {
- key1: '1'
- },
- '^(ala|ola)\\.ma\\.kota\\.pl': 'stringTarget',
- '^host3.*\\.net': 400
- };
-
- var dispatchTable = new DispatchTable({
- config: config
- });
-
- it('should have proper regexp entries', function() {
- dispatchTable.regexpEntries.should.not.be.empty;
-
- var entry = dispatchTable.regexpEntries[0];
- assert.deepEqual(entry.target, {
- key1: '1'
- });
- assert(entry.regexp, 'has regexp');
-
- entry = dispatchTable.regexpEntries[1];
- assert.deepEqual(entry.target, 'stringTarget');
- assert(entry.regexp, 'has regexp');
-
- entry = dispatchTable.regexpEntries[2];
- assert.deepEqual(entry.target, 400);
- assert(entry.regexp, 'has regexp');
-
- });
-
- it('should have wildcards compiled to proper working regexps', function() {
-
- var entry;
- entry = dispatchTable.regexpEntries[0];
- assert(!''.match(entry.regexp));
- assert('test'.match(entry.regexp));
- assert('...'.match(entry.regexp));
- entry = dispatchTable.regexpEntries[1];
- assert('ala.ma.kota.pl'.match(entry.regexp));
- assert('ola.ma.kota.pl'.match(entry.regexp));
- assert(!'mola.ma.kota.pl'.match(entry.regexp));
- assert(!'aga.ma.kota.pl'.match(entry.regexp));
- assert(!'ola.ma.kota_pl'.match(entry.regexp));
- assert(!'ola.ma.kota.pl_'.match(entry.regexp));
- entry = dispatchTable.regexpEntries[2];
- assert('host3.net'.match(entry.regexp));
- assert('host3.code2flow.net'.match(entry.regexp));
- });
- });
-
- describe('Multiple paths for entry', function() {
- var config = {
- 'code2flow.com/^get/(?[a-f])/?': 5070,
- 'code2flow.com/admin2': 5060,
- 'code2flow.com/admin/*': 5061,
- 'code2flow.com/test': 5050,
- 'code2flow.com/*/test': 5040,
- 'code2flow.com': 5030
- };
- var dispatchTable = new DispatchTable({
- config: config
- });
- it('should have proper entries', function() {
-
- Object.keys(dispatchTable.table).should.have.length(2);
- dispatchTable.table['code2flow.com'].should.have.length(6);
-
- });
- it('should yield proper targets for paths', function() {
-
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/test')).should.equal(5050);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/get/a')).should.equal(5070);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/get/a/')).should.equal(5070);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin2')).should.equal(5060);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin2/')).should.equal(5030);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin')).should.equal(5061);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin/dupa')).should.equal(5061);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin/dupa/')).should.equal(5061);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin/dupa/3')).should.equal(5061);
- });
-
- it('should install transformer regexp for path', function() {
- var req = makeReq('code2flow.com', '/get/a');
- dispatchTable.getTargetForReq(req);
- assert(req.pathMatch);
- req.pathMatch[1].should.equal('a');
- req.pathMatch.letter.should.equal('a');
-
- });
- });
-
- describe('explicit /* at end of path', function() {
- var config = {
- 'code2flow.com/admin/*': 5061,
- 'code2flow.com/admin2/*': 5062,
- };
- var dispatchTable = new DispatchTable({
- config: config
- });
- it('should not find any route', function() {
- assert(!dispatchTable.getTargetForReq(makeReq('code2flow.com', '/adminwhatever')), 'is null');
- assert(!dispatchTable.getTargetForReq(makeReq('code2flow.com', '/adminw2hatever')), 'is null');
- });
- it('should find proper routes', function() {
-
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin')).should.equal(5061);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin/')).should.equal(5061);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin/whatever')).should.equal(5061);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin/whatever/')).should.equal(5061);
-
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin2')).should.equal(5062);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin2/')).should.equal(5062);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin2/whatever')).should.equal(5062);
- dispatchTable.getTargetForReq(makeReq('code2flow.com', '/admin2/whatever/')).should.equal(5062);
- });
-
- });
-
-});
-
-describe('DispatchTable various routes', function() {
- var config = {
- 'local.code2flow.com/^get/(?[a-f]{6})': 5070,
- '*.code2flow.com/^(\\d+)/(?[a-f]{6})': '[2]'
- };
- var dispatchTable = new DispatchTable({
- config: config
- });
- it('should yield proper targets', function() {
- dispatchTable.getTargetForReq(makeReq('local.code2flow.com', '/get/abcdef')).should.equal(5070);
- dispatchTable.getTargetForReq(makeReq('test.code2flow.com', '/5080/abcdef')).should.equal('[2]');
- });
- it('should install proper transformer', function() {
- var req = makeReq('test.code2flow.com', '/5080/abcdef');
- var target = dispatchTable.getTargetForReq(req);
- assert(target, 'target should be found');
- target.should.equal('[2]');
- req.hostMatch[1].should.equal('test');
- req.pathMatch[1].should.equal('5080');
- req.pathMatch[2].should.equal('abcdef');
-
- var regexpHelper = require('../regexpHelper');
- var out = regexpHelper(target, req.hostMatch, req.pathMatch);
- out.should.equal('5080');
- });
-});
-
-
-describe('DispatchTable dispatcher', function() {
- var config = {
- 'code2flow.com': 5040,
- '*?.atlashost.eu': 'https://atlashost.eu',
- '^(www|test|indigo)\\.testowo\\.pl': 'localhost:5040'
- };
-
- it('should run first entry', function(finish) {
- var dispatchTable = new DispatchTable({
- config: config,
- requestHandler: function(req, res, next, target) {
- target.should.equal(5040);
- finish();
- }
- });
- dispatchTable.dispatchRequest({
- headers: {
- host: 'code2flow.com'
- }
- }, {}, function(err) {
- finish(false);
- });
- });
-
-
- it('should not run any entry', function(finish) {
- var dispatchTable = new DispatchTable({
- config: config,
- requestHandler: function(req, res, next, target) {
- finish(false);
- }
- });
- dispatchTable.dispatchRequest({
- headers: {
- host: 'table.code2flow.com'
- }
- }, {}, function(err) {
- finish();
- });
- });
-
- it('should run second entry', function(finish) {
- var dispatchTable = new DispatchTable({
- config: config,
- requestHandler: function(req, res, next, target) {
- target.should.equal('https://atlashost.eu');
- finish();
- }
- });
- dispatchTable.dispatchRequest({
- headers: {
- host: 'test.atlashost.eu'
- }
- }, {}, function(err) {
- finish(false);
- });
- });
-
-
- it('should run second entry', function(finish) {
- var dispatchTable = new DispatchTable({
- config: config,
- requestHandler: function(req, res, next, target) {
- target.should.equal('https://atlashost.eu');
- finish();
- }
- });
- dispatchTable.dispatchRequest({
- headers: {
- host: 'atlashost.eu'
- }
- }, {}, function(err) {
- finish(false);
- });
- });
-
- it('should run third entry', function(finish) {
- var dispatchTable = new DispatchTable({
- config: config,
- requestHandler: function(req, res, next, target) {
- target.should.equal('localhost:5040');
- finish();
- }
- });
- dispatchTable.dispatchRequest({
- headers: {
- host: 'www.testowo.pl'
- }
- }, {}, function(err) {
- finish(false);
- });
- });
-
- it('should transform target entry', function(finish) {
-
- var dispatchTable = new DispatchTable({
- config: config,
- requestHandler: function(req, res, next, target) {
- target.should.equal('^(www|test|indigo)\\.testowo\\.pl|localhost:5040');
- finish();
- },
- entryParser: function(key, value) {
- return [key, key + '|' + value];
- }
- });
- dispatchTable.dispatchRequest({
- headers: {
- host: 'www.testowo.pl'
- }
- }, {}, function(err) {
- finish(false);
- });
-
-
- });
-
- it('should handle undefined headers.host and dispatch via default route', function(finish) {
- var dispatchTable = new DispatchTable({
- config: {
- '*': 9999
- },
- requestHandler: function(req, res, next, target) {
- target.should.equal('*|9999');
- finish();
- },
- entryParser: function(key, value) {
- return [key, key + '|' + value];
- }
- });
- dispatchTable.dispatchRequest({
- headers: {
- }
- }, {}, function(err) {
- finish(false);
- });
- });
-});
\ No newline at end of file
diff --git a/tests/HttpMaster.js b/tests/HttpMaster.js
index c63496a..d91163d 100644
--- a/tests/HttpMaster.js
+++ b/tests/HttpMaster.js
@@ -1,9 +1,9 @@
'use strict';
-var HttpMaster = require('../HttpMaster');
+var HttpMaster = require('../src/HttpMaster');
var assert = require('chai').assert;
require('should');
-var testUtils = require('../testUtils');
+var testUtils = require('../src/testUtils');
var assurePortNotListening = testUtils.assurePortNotListening;
var assurePortIsListening = testUtils.assurePortIsListening;
@@ -46,7 +46,5 @@ describe('HttpMaster', function() {
});
});
});
-
-
});
});
\ No newline at end of file
diff --git a/tests/HttpMasterWorker.js b/tests/HttpMasterWorker.js
index 6e57dc5..84d85d6 100644
--- a/tests/HttpMasterWorker.js
+++ b/tests/HttpMasterWorker.js
@@ -2,9 +2,9 @@
var net = require('net');
var http = require('http');
var async = require('async');
-var HttpMasterWorker = require('../HttpMasterWorker');
-
-var testUtils = require('../testUtils');
+var HttpMasterWorker = require('../src/HttpMasterWorker');
+require('should');
+var testUtils = require('../src/testUtils');
var assurePortNotListening = testUtils.assurePortNotListening;
var assurePortIsListening = testUtils.assurePortIsListening;
@@ -19,10 +19,15 @@ var assert = require('assert');
function testPortConfig(portConfig, targetPort, handler) {
var worker = new HttpMasterWorker();
+
+ var listenPortNum = targetPort + 1000;
+
+ var listenConfig = {};
+ listenConfig[listenPortNum] = portConfig;
+
+
worker.loadConfig({
- ports: {
- 40880: portConfig
- }
+ ports: listenConfig
}, function(err) {
assert(!err);
});
@@ -31,12 +36,12 @@ function testPortConfig(portConfig, targetPort, handler) {
return {
server: httpServer,
- request: function(url, requestFinish, resValidator, reqValidator) {
+ request: function(url, requestFinish, resValidator, reqValidator, dataValidator) {
var parsedUrl = parseUrl(url);
var options = {
host: 'localhost',
- port: 40880,
+ port: listenPortNum,
path: parsedUrl.path,
method: 'GET',
headers: {
@@ -44,6 +49,7 @@ function testPortConfig(portConfig, targetPort, handler) {
}
};
var string = randomString();
+ var serverReq;
httpServer.once('request', function(req, res) {
if (reqValidator) {
reqValidator(req);
@@ -52,6 +58,7 @@ function testPortConfig(portConfig, targetPort, handler) {
req.url.should.equal(parsedUrl.path);
}
res.statusCode = 404;
+ serverReq = req;
res.end(string);
});
@@ -63,8 +70,11 @@ function testPortConfig(portConfig, targetPort, handler) {
res.on('error', requestFinish);
res.on('data', function(data) {
- data.toString().should.equal(string);
- requestFinish();
+ if(!dataValidator)
+ data.toString().should.equal(string);
+ else
+ dataValidator(data.toString('utf8'));
+ requestFinish(null, serverReq, res);
});
});
req.string = string;
@@ -81,24 +91,30 @@ function testPortConfig(portConfig, targetPort, handler) {
}
+var portCounter = 50880;
+
describe('HttpMasterWorker', function() {
+ beforeEach(function() {
+ portCounter++;
+ });
+
describe('basic operation', function() {
var worker = new HttpMasterWorker();
function testOpenAndCloseConfig(finished) {
- assurePortNotListening(40880, function() {
+ var _ports = {};
+ _ports[portCounter] = {};
+ assurePortNotListening(portCounter, function() {
worker.loadConfig({
- ports: {
- 40880: {}
- }
+ ports: _ports
}, function(err) {
if (err) finished(err);
- assurePortIsListening(40880, function() {
+ assurePortIsListening(portCounter, function() {
worker.loadConfig({}, function(err) {
if (err) finished(err);
- assurePortNotListening(40880, function() {
+ assurePortNotListening(portCounter, function() {
finished();
});
});
@@ -118,10 +134,8 @@ describe('HttpMasterWorker', function() {
it('should proxy multiple requests', function(finished) {
var tester = testPortConfig({
- proxy: {
- '*': 40881
- }
- }, 40881);
+ router: portCounter
+ }, portCounter);
var urls = [];
for (var i = 0; i < 20; ++i) {
@@ -137,12 +151,109 @@ describe('HttpMasterWorker', function() {
});
+ it('should proxy multiple request through second layer router', function(finished) {
+
+ var tester = testPortConfig({
+ router: {
+ '*': {
+ '*': portCounter
+ }
+ }
+ }, portCounter);
+
+ tester.request('http://alibaba/sdfsd', function(err) {
+ finished(err);
+ });
+
+ });
+
+ it('should proxy multiple request through second layer router and some middleware', function(finished) {
+ var tester = testPortConfig({
+ router: {
+ '*': {
+ '*': [
+ 'addHeader -> user-agent=x-test',
+ 'addHeader -> user-agent-2=x-test-2',
+ portCounter
+ ]
+ }
+ }
+ }, portCounter);
+
+ tester.request('http://alibaba/sdfsd', function(err, req, res) {
+
+ assert(req.headers['user-agent'] === 'x-test');
+ assert(req.headers['user-agent-2'] === 'x-test-2');
+ finished(err);
+ });
+ });
+
+
+ it('should error out not handled request', function(finished) {
+ var tester = testPortConfig({
+ router: {
+ }
+ }, portCounter);
+
+ tester.request('http://alibaba/sdfsd', function(err, req, res) {
+
+ }, function(res) {
+ res.statusCode.should.equal(500);
+ }, null, function(data) {
+ data.should.equal('500 Internal Server Error');
+ finished();
+ });
+ });
+
+ it('should error out not handled request #2', function(finished) {
+ var tester = testPortConfig({
+ router: [{
+ '*': {
+ '*': [
+ 'addHeader -> user-agent=x-test',
+ 'addHeader -> user-agent-2=x-test-2'
+ ]
+ }
+ }]
+ }, portCounter);
+
+ tester.request('http://alibaba/sdfsd', function(err, req, res) {
+
+ }, function(res) {
+ res.statusCode.should.equal(500);
+ }, null, function(data) {
+ data.should.equal('500 Internal Server Error');
+ finished();
+ });
+ });
+
+ it('should handle router/proxy errors', function(finished) {
+ var tester = testPortConfig({
+ router: {
+ '*': (portCounter+2000)
+ }
+ }, portCounter);
+ var rejectingServer = net.createServer();
+ rejectingServer.listen(portCounter+2000);
+ rejectingServer.on('connection', function(conn) {
+ conn.end();
+ });
+ tester.request('http://test.com', function(err) {
+ }, function(res) {
+ res.statusCode.should.equal(500);
+ }, null, function(data) {
+ data.should.equal('500 Internal Server Error');
+ rejectingServer.close();
+ finished();
+ });
+ });
+
it('should support unicode domains', function(finished) {
var tester = testPortConfig({
- proxy: {
- 'źdźbło.pl': 40881
+ router: {
+ 'źdźbło.pl': portCounter
}
- }, 40881);
+ }, portCounter);
tester.request('http://źdźbło.pl', function(err) {
finished(err);
tester.finish();
@@ -151,10 +262,10 @@ describe('HttpMasterWorker', function() {
it('should support http entities in requests', function(finished) {
var tester = testPortConfig({
- proxy: {
- 'test.pl/test%20kota/ d': 40881
+ router: {
+ 'test.pl/test%20kota/ d': portCounter
}
- }, 40881);
+ }, portCounter);
tester.request('http://test.pl/test%20kota/ d', function(err) {
finished(err);
tester.finish();
@@ -165,10 +276,10 @@ describe('HttpMasterWorker', function() {
it('should redirect multiple requests', function(finished) {
var tester = testPortConfig({
- redirect: {
- '*': 'http://[1]:40881/[path]'
+ router: {
+ '*': 'redirect -> http://[1]:'+portCounter+'/[path]'
}
- }, 40881);
+ }, portCounter);
var urls = [];
for (var i = 0; i < 20; ++i) {
diff --git a/tests/addHeader.js b/tests/addHeader.js
new file mode 100644
index 0000000..731bc22
--- /dev/null
+++ b/tests/addHeader.js
@@ -0,0 +1,24 @@
+var assert = require('chai').assert;
+
+describe('addHeader middleware', function() {
+
+ it('should throw on bad header definition', function() {
+ var addHeader = require('../modules/middleware/addHeader')();
+
+ try {
+ addHeader.entryParser("dfdssfd");
+ assert(false, "Failed parsing");
+ } catch(err) {
+
+ }
+ });
+ it('should set header', function() {
+ var addHeader = require('../modules/middleware/addHeader')();
+
+ var parsed = addHeader.entryParser("a = b");
+ var headers = {};
+ addHeader.requestHandler({headers: headers}, {}, function() {
+ headers.a.should.equal('b');
+ }, parsed);
+ });
+});
\ No newline at end of file
diff --git a/tests/auth.js b/tests/auth.js
new file mode 100644
index 0000000..a8a879f
--- /dev/null
+++ b/tests/auth.js
@@ -0,0 +1,104 @@
+'use strict';
+require('should');
+var assert = require('chai').assert;
+
+var path = require('path');
+
+function makeReq(user, pass, hostMatch, pathMatch) {
+ var host = '';
+ var path = '';
+
+ var headers = {
+ host: host
+ };
+ if(user && pass) {
+ headers.authorization = 'Basic ' + (new Buffer(user + ':' + pass).toString('base64'));
+ }
+
+ return {
+ url: path,
+ headers: headers,
+ parsedUrl: require('url').parse(path),
+ connection: {},
+ hostMatch: hostMatch,
+ pathMatch: pathMatch
+ };
+}
+
+var onTarget;
+
+describe('auth middleware', function() {
+ var authMiddleware;
+ beforeEach(function() {
+ authMiddleware = require('../modules/middleware/auth')({});
+ });
+ var realm;
+ function makeTest(target, user, pass, cb, hostMatch, pathMatch) {
+ onTarget = cb;
+
+ authMiddleware.requestHandler(makeReq(user, pass, hostMatch, pathMatch), {
+ end: function(str) {
+ cb(str, this);
+ },
+ setHeader: function(name, value) {
+ assert((name === 'WWW-Authenticate' && value === 'Basic realm="'+(realm || "Enter password") +'"') || name === 'Content-Type');
+ },
+ writeHead: function(code) {
+ code.should.equal(401);
+ },
+ }, function(err) {
+ onTarget('OK');
+ }, authMiddleware.entryParser(target));
+ }
+
+ ['md5', 'crypt', 'sha', 'bcrypt'].forEach(function(extension) {
+ describe('with ' + extension+ ' passwd', function() {
+ it('should not authorize without user and password', function() {
+ makeTest(path.join(__dirname, 'passwd', extension + '.htpasswd'), null, null, function(str, res) {
+ str.should.equal("401 Unauthorized");
+ });
+ });
+
+ it('should not authorize with bad user and password', function() {
+ makeTest(path.join(__dirname, 'passwd', extension +'.htpasswd'), 'dsfsd', 'wreiowreuoiwer', function(str, res) {
+ str.should.equal("401 Unauthorized");
+ });
+ });
+
+ it('should not authorize with correct user and bad password', function() {
+ makeTest(path.join(__dirname, 'passwd', extension +'.htpasswd'), 'testuser', 'wreiowreuoiwer', function(str, res) {
+ str.should.equal("401 Unauthorized");
+ });
+ });
+
+ it('should authorize with correct credentials', function() {
+ makeTest(path.join(__dirname, 'passwd', extension +'.htpasswd'), 'testuser', 'test', function(str, res) {
+ str.should.equal("OK");
+ });
+ });
+ });
+ });
+
+ it('should support custom realm', function() {
+ realm = "Secret password required";
+ makeTest({
+ file: path.join(__dirname, 'passwd', 'md5.htpasswd'),
+ realm: realm
+ }, null, null, function(str, res) {
+ str.should.equal("401 Unauthorized");
+ realm = undefined;
+ });
+ });
+
+ it('should default to Enter password realm', function() {
+ makeTest({
+ file: path.join(__dirname, 'passwd', 'md5.htpasswd')
+ }, null, null, function(str, res) {
+ str.should.equal("401 Unauthorized");
+ realm = undefined;
+ });
+ });
+
+});
+
+
diff --git a/tests/certScannerTest.js b/tests/certScannerTest.js
index 9c59cf1..2c9f1a1 100644
--- a/tests/certScannerTest.js
+++ b/tests/certScannerTest.js
@@ -7,9 +7,9 @@ var path = require('path');
//TODO: test to find out how errors are handled
describe('SSL directory scanner', function() {
- var SslScanner = require('../certScanner');
- var realSslDir = 'tests/certs/';
- var sslDir = 'tests/.work/';
+ var SslScanner = require('../src/certScanner');
+ var realSslDir = path.join(__dirname, '../tests/certs/');
+ var sslDir = path.join(__dirname, '../tests/.work/');
var scanner = null;
beforeEach(function() {
diff --git a/tests/di.js b/tests/di.js
new file mode 100644
index 0000000..488bb77
--- /dev/null
+++ b/tests/di.js
@@ -0,0 +1,205 @@
+var DI = require('../src/di');
+var assert = require('chai').assert;
+require('should');
+
+describe('Dependency Injection', function() {
+
+ var di;
+ beforeEach(function() {
+ di = new DI();
+ });
+
+ function checkAlreadyBound(method) {
+ try {
+ di[method]('foo', function() {});
+ assert(false, 'exception should have been called');
+ } catch(err) {
+ err.message.should.equal('\'foo\' already bound');
+ }
+ }
+
+ it('should throw exception on missing dependency when resolving by function', function() {
+ try {
+ di.resolve(function(a, b, c) {
+ });
+ assert(false, 'Exception should have been called');
+ }
+ catch(thrs) {
+ thrs.message.should.equal('No recipe to resolve \'a\'')
+ }
+ });
+
+ it('should throw exception on missing dependency when resolving by string', function() {
+ try {
+ di.resolve('a');
+ assert(false, 'Exception should have been called');
+ }
+ catch(thrs) {
+ thrs.message.should.equal('No recipe to resolve \'a\'')
+ }
+ });
+
+ it('should resolve bound type without dependencies', function() {
+ function MyType( ) { // test also empty space in function parens
+ }
+ di.bindType('foo', MyType);
+
+ var resolved = di.resolve('foo');
+ resolved.should.be.instanceof(MyType),
+ assert(di.resolve('foo') === resolved);
+
+ checkAlreadyBound('bindType');
+ });
+
+ it('should resolve bound type without explicit name without dependencies', function() {
+ function MyType() {
+ }
+ di.bindType(MyType);
+
+ var resolved = di.resolve('myType');
+ assert(resolved instanceof MyType);
+ assert(di.resolve('myType') === resolved);
+ di.resolve('MyType').should.equal(MyType);
+ });
+
+ it('should resolve bound type with dynamic dependencies', function() {
+ function MyType(param) {
+ this.foo = param;
+ }
+ di.bindType(MyType);
+ var resolved = di.resolve('myType', {
+ param: 'bar'
+ });
+ resolved.foo.should.equal('bar');
+ });
+
+ it('should create transient type without dependencies', function() {
+ var cnt = 0;
+ function MyType() {
+ cnt++;
+ }
+ di.bindTransientType(MyType);
+ var instance1 = di.resolve('myType');
+ var instance2 = di.resolve('myType');
+ assert(instance1 !== instance2, 'expecting separate instances');
+ cnt.should.equal(2);
+ });
+
+ it('should fail with missing dependencies for dependencies', function() {
+ function MyType1(param) {
+
+ }
+ function MyType2(myType) {
+
+ }
+ di.bindType('myType', MyType1);
+ di.bindType(MyType2);
+ try {
+ di.resolve('myType2');
+ assert(false, 'expecting exception');
+ } catch(err) {
+ err.message.should.equal('No recipe to resolve \'param\'');
+ }
+ });
+
+ it('should apply dynamic dependencies for dependencies', function() {
+ function MyType1(param) {
+ this.foo = param;
+ }
+ function MyType2(myType) {
+ myType.foo.should.equal('bar');
+ this.myType = myType;
+ }
+ di.bindType('myType', MyType1);
+ di.bindType(MyType2);
+ var instance = di.resolve('myType2', {
+ param: 'bar'
+ })
+ assert(instance instanceof MyType2);
+ assert(instance.myType instanceof MyType1);
+ });
+
+ it('should bind and resolve instance', function() {
+ var instance = {};
+ di.bindInstance('foo', instance);
+
+ assert(di.resolve('foo') === instance, 'resolve should return instance');
+ checkAlreadyBound('bindInstance');
+ });
+
+ it('should bind and resolve from resolver function', function() {
+ var instance = {};
+ di.bindResolver('foo', function() {
+ return instance;
+ });
+ assert(di.resolve('foo') === instance);
+
+ checkAlreadyBound('bindResolver');
+ });
+
+ it('should clone di object', function() {
+
+ var a = 'a', b1 = 'b1', b2 = 'b2';
+ di.bindInstance('a', a);
+
+ var clone = di.clone();
+ di.bindInstance('b', b1);
+ clone.bindInstance('b', b2);
+
+ function tester(a, b) {
+ this.a = a;
+ this.b = b;
+ }
+
+ var resolvedOriginal = di.resolve(tester);
+ var resolvedClone = clone.resolve(tester);
+ resolvedOriginal.a.should.equal(a);
+ resolvedOriginal.b.should.equal(b1);
+ resolvedClone.a.should.equal(a);
+ resolvedClone.b.should.equal(b2);
+ });
+
+ it('should make a behaving child object', function() {
+ var a = 'a', b1 = 'b1', b2 = 'b2';
+
+ di.bindInstance('a', a);
+ var child = di.makeChild();
+ child.resolve('a').should.equal(a);
+ di.bindInstance('b', b1);
+ child.resolve('b').should.equal(b1);
+ child.bindInstance('a', 'a2');
+ child.resolve('a').should.equal('a2');
+ });
+
+ it('should support working onMissing handler', function() {
+ var instance = {};
+ di.onMissing = function(name) {
+ name.should.equal('test');
+ return instance;
+ }
+ di.resolve('test').should.equal(instance);
+ });
+
+ it('should handle error when resolving with bad argument', function() {
+ try {
+ di.resolve({});
+ assert(false, 'should have thrown exception');
+ } catch(err) {
+ err.message.should.equal('Unknown type to resolve');
+ }
+ });
+ it('should handle error when binding constructor without a name', function() {
+ try {
+ var f = function() {};
+ di.bindType(f);
+ assert(false, 'should have thrown exception');
+ } catch(err) {
+ err.message.should.equal('Unable to resolve name from function');
+ }
+ });
+ it('should handle constructor with a camelCase', function() {
+ function camelType() {}
+ di.bindType(camelType);
+ di.resolve('camelType').should.be.instanceof(camelType);
+ });
+});
\ No newline at end of file
diff --git a/tests/friendlyConfig.js b/tests/friendlyConfig.js
deleted file mode 100644
index b2e1bf0..0000000
--- a/tests/friendlyConfig.js
+++ /dev/null
@@ -1,299 +0,0 @@
-'use strict';
-require('should');
-var assert = require('assert');
-var processConfig = require('../friendlyConfig');
-
-describe('domains config processor', function() {
-
- it('should handle empty config', function() {
- var input = {
-
- };
- var expected = {
- ports: {
-
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
-
- it('should generate \"ports\" keys from list of ports', function() {
- var input = {
- http: [80, 8080],
- https: [443, 80443]
- };
- var expected = {
- ports: {
- '80': {},
- '8080': {},
- '443': {
- ssl: {}
- },
- '80443': {
- ssl: {}
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
- it('should support ssl config per port', function() {
- var input = {
- https: [{
- port: 443,
- cipherList: ['CIPHER1', 'CIPHER2'],
- spdy: true
- }]
- };
- var expected = {
- ports: {
- '443': {
- ssl: {
- cipherList: ['CIPHER1', 'CIPHER2'],
- spdy: true
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
-
- it('should support simplified http entry', function() {
- var input = {
- http: true,
- https: true
- };
- var expected = {
- ports: {
- '80': {},
- '443': {
- ssl: {}
- },
- }
- };
-
- assert.deepEqual(processConfig(input), expected);
- });
-
- it('should support simple string keys with numerical target', function() {
- var input = {
- http: true,
- routes: {
- 'code2flow.com:80': 4030
- }
- };
- var expected = {
- ports: {
- '80': {
- proxy: {
- 'code2flow.com': 4030
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
- it('should support simple string keys with string target and path', function() {
-
- var input = {
- https: [{
- port: 443,
- spdy: true,
- key: 'key.pem',
- cert: 'cert.pem'
- }],
- routes: {
- 'somehost:80': 50,
- 'code2flow.com:443/test': 'redirect: https://sometarget'
- }
- };
- var expected = {
- ports: {
- '443': {
- ssl: {
- spdy: true,
- key: 'key.pem',
- cert: 'cert.pem'
- },
- redirect: {
- 'code2flow.com/test': 'https://sometarget'
- }
- },
- '80': {
- proxy: {
- 'somehost': 50
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
- it('should handle entry without port as belonging to all ports', function() {
- var input = {
- http: [80, 81],
- https: [443, 444],
- routes: {
- 'somehost': 50,
- 'code2flow.com/test': 'redirect: https://sometarget'
- }
- };
- var expected = {
- ports: {
- '80': {
- proxy: {
- 'somehost': 50
- },
- redirect: {
- 'code2flow.com/test': 'https://sometarget'
- }
- },
- '81': {
- proxy: {
- 'somehost': 50
- },
- redirect: {
- 'code2flow.com/test': 'https://sometarget'
- }
- },
- '443': {
- proxy: {
- 'somehost': 50
- },
- redirect: {
- 'code2flow.com/test': 'https://sometarget'
- },
- ssl: {}
- },
- '444': {
- proxy: {
- 'somehost': 50
- },
- redirect: {
- 'code2flow.com/test': 'https://sometarget'
- },
- ssl: {}
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
- it('should handle group with multiple interfaces', function() {
- var input = {
- groups: {
- localOnlyHttp: {
- interfaces: ['127.0.0.1', '::1'],
- ports: [80]
- }
- },
- routes: {
- 'localOnlyHttp | code2flow.com/test': 3040
- }
- };
- var expected = {
- ports: {
- '127.0.0.1:80': {
- proxy: {
- 'code2flow.com/test': 3040
- }
- },
- '[::1]:80': {
- proxy: {
- 'code2flow.com/test': 3040
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
- it('should handle global multiple interfaces', function() {
- var input = {
- interfaces: ['127.0.0.1', '::1'],
- routes: {
- 'code2flow.com:80/test': 3040
- }
- };
- var expected = {
- ports: {
- '127.0.0.1:80': {
- proxy: {
- 'code2flow.com/test': 3040
- }
- },
- '[::1]:80': {
- proxy: {
- 'code2flow.com/test': 3040
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
-
- it('should discard other interfaces if '*' is defined', function() {
- var input = {
- interfaces: ['127.0.0.1', '::1', '*'],
- routes: {
- 'code2flow.com:80/test': 3040
- }
- };
- var expected = {
- ports: {
- '80': {
- proxy: {
- 'code2flow.com/test': 3040
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
-
- it('should allow by group subdomain definitions', function() {
- var input = {
- groups: {
- 'www': {
- subdomains: {
- '': '[target]',
- 'www.': '[target]'
- }
- }
- },
- routes: {
- 'www | code2flow.com:80': 567
- }
- };
- var expected = {
- 'ports': {
- '80': {
- 'proxy': {
- 'code2flow.com': 567,
- 'www.code2flow.com': 567
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
-
- it('should allow subdomain definitions in object', function() {
- var input = {
- routes: {
- 'code2flow.com:80': {
- subdomains: {
- 'www.': 3040
- }
- }
- }
- };
- var expected = {
- 'ports': {
- '80': {
- 'proxy': {
- 'www.code2flow.com': 3040
- }
- }
- }
- };
- assert.deepEqual(processConfig(input), expected);
- });
-
-});
\ No newline at end of file
diff --git a/tests/passwd/bcrypt.htpasswd b/tests/passwd/bcrypt.htpasswd
new file mode 100644
index 0000000..d8736b1
--- /dev/null
+++ b/tests/passwd/bcrypt.htpasswd
@@ -0,0 +1 @@
+testuser:$2y$05$3W.z3JSf2wcqhTYSI185WOSiNqVuyjFizP7muHV89FgBQUKaKCi86
diff --git a/tests/passwd/crypt.htpasswd b/tests/passwd/crypt.htpasswd
new file mode 100644
index 0000000..92d7053
--- /dev/null
+++ b/tests/passwd/crypt.htpasswd
@@ -0,0 +1 @@
+testuser:9RAg9v.1jfCuU
diff --git a/tests/passwd/md5.htpasswd b/tests/passwd/md5.htpasswd
new file mode 100644
index 0000000..338c9a8
--- /dev/null
+++ b/tests/passwd/md5.htpasswd
@@ -0,0 +1 @@
+testuser:$apr1$2tMr34Ql$jOFG4aKjjXAsN7LHECkCc1
diff --git a/tests/passwd/sha.htpasswd b/tests/passwd/sha.htpasswd
new file mode 100644
index 0000000..9949e3b
--- /dev/null
+++ b/tests/passwd/sha.htpasswd
@@ -0,0 +1 @@
+testuser:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
diff --git a/tests/proxy.js b/tests/proxy.js
index 7d4589e..f16abbe 100644
--- a/tests/proxy.js
+++ b/tests/proxy.js
@@ -1,138 +1,301 @@
'use strict';
require('should');
var url = require('url');
+var http = require('http');
+var EventEmitter = require('events').EventEmitter;
+var net = require('net');
+var path = require('path');
+var fs = require('fs');
+var assert = require('chai').assert;
-function makeReq(host, path) {
- return {
- url: path,
- headers: {
- host: host
- },
- connection: {},
- parsedUrl: url.parse(path)
- };
-}
-
-
-var onTarget;
-
-var httpProxy = require('http-proxy');
-var oldProxyServer = httpProxy.createProxyServer;
-
-function patchProxyServer() {
- httpProxy.createProxyServer = function() {
-
- return {
- web: function(req, res, options) {
- if (onTarget)
- onTarget(options.target, req);
- },
- on: function() {}
- };
- };
-}
-
-function unpatchProxyServer() {
- httpProxy.createProxyServer = oldProxyServer;
-}
-
-
-patchProxyServer();
-delete require.cache[require.resolve('../modules/proxy')];
-var proxy = require('../modules/proxy');
-delete require.cache[require.resolve('../modules/proxy')];
-// clear the patched module from cache so that other tests can
-// resolve unpatched module
-unpatchProxyServer();
-
-var middleware;
-
-function makeTest(host, path, cb) {
- onTarget = cb;
- var req = makeReq(host, path);
- middleware.handleRequest(req, {}, function(err) {
- onTarget({
- href: ''
- }, {});
- });
-}
-
-var assertPath = function(host, path, mustEqual) {
- makeTest(host, path, function(target, req) {
- var reqUrl = req.url || '';
- target.path = reqUrl;
- var m = reqUrl.match(/([?])(.*)/);
-
- if(m) {
- target.search = m[1] + m[2];
- target.query = m[2];
+
+describe('proxy middleware', function() {
+
+ describe('entryParser', function() {
+ var proxyMiddleware;
+ beforeEach(function() {
+ proxyMiddleware = require('../modules/middleware/proxy')({});
+ });
+
+ it('should parse target entry by port number', function() {
+ var parsed = proxyMiddleware.entryParser(4040);
+ parsed.host.should.equal('127.0.0.1:4040');
+ parsed.path.should.equal('/');
+ parsed.withPath.should.equal(false);
+ });
+ it('should parse target entry by port string', function() {
+ var parsed = proxyMiddleware.entryParser('4040');
+ parsed.host.should.equal('127.0.0.1:4040');
+ parsed.path.should.equal('/');
+ parsed.withPath.should.equal(false);
+ });
+ it('should parse target entry by ipv4 and', function() {
+ var parsed = proxyMiddleware.entryParser('127.0.0.1:4040');
+ parsed.host.should.equal('127.0.0.1:4040');
+ parsed.path.should.equal('/');
+ parsed.withPath.should.equal(false);
+ });
+ it('should parse target entry by localhost', function() {
+ var parsed = proxyMiddleware.entryParser('localhost:4040');
+ parsed.host.should.equal('localhost:4040');
+ parsed.path.should.equal('/');
+ parsed.withPath.should.equal(false);
+ });
+ it('should parse target entry by host', function() {
+ var parsed = proxyMiddleware.entryParser('code2flow.com:80');
+ parsed.host.should.equal('code2flow.com:80');
+ parsed.path.should.equal('/');
+ parsed.withPath.should.equal(false);
+ });
+ it('should parse target entry by protocol and host', function() {
+ var parsed = proxyMiddleware.entryParser('http://code2flow.com:80');
+ parsed.host.should.equal('code2flow.com:80');
+ parsed.path.should.equal('/');
+ parsed.withPath.should.equal(false);
+ });
+ it('should parse target entry by host and path', function() {
+ var parsed = proxyMiddleware.entryParser('code2flow.com:80/');
+ parsed.host.should.equal('code2flow.com:80');
+ parsed.path.should.equal('/');
+ parsed.withPath.should.equal(true);
+ });
+ });
+ describe('requestHandler', function() {
+
+
+ var port1 = 61380;
+ var port2 = 61390;
+ var proxyMiddleware;
+ var server1, server2;
+ server1 = require('http').createServer().listen(port1);
+ server2 = require('http').createServer().listen(port2);
+
+ function handleFullRequests(server) {
+ var gotData = '';
+ server.on('request', function(req, res) {
+ req.on('data', function(data) {
+ gotData += data.toString('utf8');
+ });
+ req.on('end', function() {
+ setTimeout(function() {
+ res.statusCode = 200;
+ if(EventEmitter.listenerCount(server, 'fullRequest')) {
+ server.emit('fullRequest', req, res, gotData);
+ }
+ }, 0);
+ });
+ });
+ }
+ beforeEach(function() {
+ proxyMiddleware = require('../modules/middleware/proxy')({});
+ handleFullRequests(server1);
+ handleFullRequests(server2);
+ });
+ afterEach(function() {
+ server1.removeAllListeners('request');
+ server2.removeAllListeners('request');
+ server1.removeAllListeners('fullRequest');
+ server2.removeAllListeners('fullRequest');
+ });
+ function http11Request(input, cb, customPath) {
+ var targetPort = port1;
+ var preparedRequest = http.request({
+ hostname: '127.0.0.1',
+ port: 61380,
+ method: 'POST',
+ path: customPath || '/upload'
+ }, function(res) {
+ var gotData = '';
+ res.on('data', function(data) {
+ gotData += data.toString('utf8');
+ });
+ res.on('end', function() {
+ cb(null, gotData);
+ });
+ });
+ preparedRequest.write(input);
+ preparedRequest.end();
+ preparedRequest.on('error', function(err) {
+ cb(err);
+ });
}
- target.pathname = reqUrl.replace(/\?.*/, '');
- var formatted = url.format(target);
- formatted.should.equal(mustEqual);
- });
-};
+ function http10Request(input, cb) {
+ var opts = {
+ host: '127.0.0.1',
+ port: port1
+ };
+ var socket = net.connect(opts, function() {
+ socket.write('POST / HTTP/1.0\r\n' +
+ 'Content-Type: application/x-www-form-urlencoded\r\n' +
+ 'Content-Length: ' + input.length + '\r\n' +
+ '\r\n' + input);
+ });
+ var gotData = '';
+ socket.on('data', function(data) {
+ gotData += data.toString('utf8');
+ });
+ socket.on('end', function() {
+ gotData = gotData.replace(/^[^]+\n/, '');
+ cb(null, gotData);
+ });
+ }
+ function runTestRequest(requestFunction, endCb) {
+ var testString = 'alksjdlkadjlkqwjlkewqjlksdajds';
+ var testString2 = 'vckxjhkhoiewruweoiuroiuweoijccc';
+ var parsedTarget = proxyMiddleware.entryParser('127.0.0.1:61390');
+ server1.once('request', function(req, res) {
+ proxyMiddleware.requestHandler(req, res, function(err) {
+ assert(false, "next should not be called, error has occured");
+ }, parsedTarget);
+ });
+ server2.once('fullRequest', function(req, res, gotData) {
+ req.headers.host.should.equal('127.0.0.1:61390');
+ gotData.should.equal(testString);
+ res.write(testString2);
+ res.end();
+ });
+ requestFunction(testString, function(err, data) {
+ data.should.equal(testString2);
+ endCb();
+ });
+ }
-describe('proxy module', function() {
-
- it('should rewrite URL with implicit ending / to explicit /', function() {
+ it('should proxy simple HTTP/1.1 requests', function(endTest) {
+ runTestRequest(http11Request, endTest);
+ });
+ it('should proxy simple HTTP/1.0 requests', function(endTest) {
+ runTestRequest(http10Request, endTest);
+ });
- middleware = proxy.middleware({
- proxy: {
- 'jira.atlashost.eu/code2flow/*': 'jira:14900/code2flow/[1]'
- }
- });
- assertPath('jira.atlashost.eu', '/code2flow', 'http://jira:14900/code2flow/');
- assertPath('jira.atlashost.eu', '/code2flow/', 'http://jira:14900/code2flow/');
- assertPath('jira.atlashost.eu', '/code2flow//', 'http://jira:14900/code2flow//');
- assertPath('jira.atlashost.eu', '/code2flo', '');
+ it('should allow to set timeout which closes request socket', function(endTest) {
+ proxyMiddleware = require('../modules/middleware/proxy')({
+ proxyTimeout: 10
+ });
- });
- it('should try to connect to fake route', function() {
- middleware = proxy.middleware({
- proxy: {
- '*': 'localhost:0'
- }
- });
- assertPath('jira.atlashost.eu', '/test', 'http://localhost:0/test');
- });
- it('should forward path with query parameters', function() {
+ var parsedTarget = proxyMiddleware.entryParser('127.0.0.1:61396');
+ var server = net.createServer().listen(61396);
+ var connCounter = 0;
+ server.on('connection', function(connection) {
+ connCounter++;
+ });
- middleware = proxy.middleware({
- proxy: {
- 'jira.atlashost.eu/code2flow/*': 'jira:14900/code2flow/[rest]'
- }
+ server1.once('request', function(req, res) {
+ proxyMiddleware.requestHandler(req, res, function(err) {
+
+ }, parsedTarget);
+ });
+ http11Request('hello', function(err, data) {
+ if(err) {
+ err.code.should.equal('ECONNRESET');
+ connCounter.should.equal(1);
+ return endTest();
+ }
+ assert(false, "Err was expected");
+ });
});
- assertPath('jira.atlashost.eu', '/code2flow?params', 'http://jira:14900/code2flow/?params');
- assertPath('jira.atlashost.eu', '/code2flow/?params', 'http://jira:14900/code2flow/?params');
- assertPath('jira.atlashost.eu', '/code2flow//?params', 'http://jira:14900/code2flow//?params');
- assertPath('jira.atlashost.eu', '/code2flow/test?params', 'http://jira:14900/code2flow/test?params');
- assertPath('jira.atlashost.eu', '/code2flo', '');
+ it('should allow to set timeout and call next(err) when times out', function(endTest) {
+ proxyMiddleware = require('../modules/middleware/proxy')({
+ proxyTargetTimeout: 10
+ });
- });
+ var parsedTarget = proxyMiddleware.entryParser('127.0.0.1:61395');
+ var server = net.createServer().listen(61395);
+ var connCounter = 0;
+ server.on('connection', function(connection) {
+ connCounter++;
+ });
+
+ server1.once('request', function(req, res) {
+ proxyMiddleware.requestHandler(req, res, function(err) {
+ err.code.should.equal('ECONNRESET');
+ res.end("Got timeout but we can report it!");
+ }, parsedTarget);
+ });
+ http11Request('hello', function(err, data) {
+ if(err) {
+ return endTest(err);
+ }
+ data.should.equal('Got timeout but we can report it!');
+ connCounter.should.equal(1);
+ endTest();
+ });
+ });
+
+ it('should handle requests with match', function(endTest) {
+ var parsedTarget = proxyMiddleware.entryParser('127.0.0.1:'+port2 + '/[1]/[2]');
- it('should handle simple url rewrite', function() {
- middleware = proxy.middleware({
- proxy: {
- 'jira.atlashost.eu/waysgo/*': 'jira:14900/waysgo/[1]',
- 'dragon.rushbase.net/rush/*': '127.0.0.1:8080/~rush/[1]',
- 'test.net' : 1000
- }
+ server1.once('request', function(req, res) {
+ var hostMatch = 'foo'.match(/(foo)/);
+ var pathMatch = 'bar'.match(/(bar)/);
+ req.match = [].concat(hostMatch.slice(1)).concat(pathMatch.slice(1));
+ req.parsedUrl = url.parse(req.url);
+ proxyMiddleware.requestHandler(req, res, function(err) {
+ assert(false, "next should not be called, error has occured");
+ }, parsedTarget);
+ });
+ server2.once('request', function(req, res) {
+ req.url.should.equal('/foo/bar');
+ endTest();
+ });
+ http11Request('hello', function(err, data) {});
});
- assertPath('jira.atlashost.eu', '/waysgo/secure/MyJiraHome.jspa', 'http://jira:14900/waysgo/secure/MyJiraHome.jspa');
- assertPath('dragon.rushbase.net', '/rush/test.js', 'http://127.0.0.1:8080/~rush/test.js');
+ it('should pass query parameters to target server', function(endTest) {
+ var parsedTarget = proxyMiddleware.entryParser('127.0.0.1:'+port2 + '');
- assertPath('jira.atlashost.eu', '/waysgo/plugins/servlet/gadgets/ifr?container=atlassian&mid=0&country=US&lang=en&view=default&view-params=%7B%22writable%22%3A%22false%22%7D&st=atlassian%3AZXk4Vbj6JrQXyvhOBv0iyMrxSLRxI%2BDE1DLWB9x6GlICiJtW7i5jOjjvJjX6bTeQn4ONYISfvalhmLe0j%2Ffa18QJgwh9ksWhttnox%2B%2FvuN5daiMOVg7UcT7XzkwvEUiPgjOB2L5GJUyKerbGNh3BAQdlJOApQxk%2BlWcNWOza%2BhQDEwfko3qobsrVSSky1zuK4hOFyNN0Ds6zUx7flsC4LkOVBjO4f90uMIuG2I1DDU%2F%2FTVK0&up_isPublicMode=false&up_isElevatedSecurityCheckShown=false&up_loginFailedByPermissions=false&up_externalUserManagement=false&up_loginSucceeded=false&up_allowCookies=true&up_externalPasswordManagement=&up_captchaFailure=false&up_isAdminFormOn=true&url=https%3A%2F%2Fjira.atlashost.eu%2Fwaysgo%2Frest%2Fgadgets%2F1.0%2Fg%2Fcom.atlassian.jira.gadgets%2Fgadgets%2Flogin.xml&libs=auth-refresh#rpctoken=7574331', 'http://jira:14900/waysgo/plugins/servlet/gadgets/ifr?container=atlassian&mid=0&country=US&lang=en&view=default&view-params=%7B%22writable%22%3A%22false%22%7D&st=atlassian%3AZXk4Vbj6JrQXyvhOBv0iyMrxSLRxI%2BDE1DLWB9x6GlICiJtW7i5jOjjvJjX6bTeQn4ONYISfvalhmLe0j%2Ffa18QJgwh9ksWhttnox%2B%2FvuN5daiMOVg7UcT7XzkwvEUiPgjOB2L5GJUyKerbGNh3BAQdlJOApQxk%2BlWcNWOza%2BhQDEwfko3qobsrVSSky1zuK4hOFyNN0Ds6zUx7flsC4LkOVBjO4f90uMIuG2I1DDU%2F%2FTVK0&up_isPublicMode=false&up_isElevatedSecurityCheckShown=false&up_loginFailedByPermissions=false&up_externalUserManagement=false&up_loginSucceeded=false&up_allowCookies=true&up_externalPasswordManagement=&up_captchaFailure=false&up_isAdminFormOn=true&url=https%3A%2F%2Fjira.atlashost.eu%2Fwaysgo%2Frest%2Fgadgets%2F1.0%2Fg%2Fcom.atlassian.jira.gadgets%2Fgadgets%2Flogin.xml&libs=auth-refresh');
+ server1.once('request', function(req, res) {
+ req.hostMatch = 'foo'.match(/(foo)/);
+ req.pathMatch = 'bar'.match(/(bar)/);
+ req.parsedUrl = url.parse(req.url);
+ proxyMiddleware.requestHandler(req, res, function(err) {
+ assert(false, "next should not be called, error has occured");
+ }, parsedTarget);
+ });
+ server2.once('request', function(req, res) {
+ req.url.should.equal('/upload?dupa');
+ endTest();
+ });
+ http11Request('hello', function(err, data) {
+ }, '/upload?dupa');
+ });
+ it('should proxy web sockets', function(endTest) {
+ var WebSocketServer = require('ws').Server;
+ var WebSocket = require('ws');
+ var parsedTarget = proxyMiddleware.entryParser('127.0.0.1:60000');
- assertPath('test.net', '/test/path?query', 'http://127.0.0.1:1000/test/path?query');
+ var ws = new WebSocket('ws://localhost:' + port1);
- });
-
-});
+ ws.on('open', function() {
+ });
+ ws.on('message', function(msg) {
+ assert(msg === 'something');
+ ws.send('else');
+ });
+
+ server1.on('upgrade', function(req, socket, head) {
+ req.upgrade = {
+ socket: socket,
+ head: head
+ };
+ proxyMiddleware.requestHandler(req, {}, function(err) {
+ assert(false, "next should not be called, error has occured");
+ }, parsedTarget);
+ });
+
+ var wss = new WebSocketServer({port: 60000});
+ wss.on('connection', function(ws) {
+ ws.on('message', function(message) {
+ message.should.equal('else');
+ endTest();
+ });
+ ws.send('something');
+ });
+ });
+ });
+});
\ No newline at end of file
diff --git a/tests/redirect.js b/tests/redirect.js
index a213e88..11cbaf4 100644
--- a/tests/redirect.js
+++ b/tests/redirect.js
@@ -1,7 +1,7 @@
'use strict';
require('should');
-function makeReq(host, path) {
+function makeReq(host, path, match) {
return {
url: path,
headers: {
@@ -9,45 +9,53 @@ function makeReq(host, path) {
},
parsedUrl: require('url').parse(path),
connection: {},
+ match: match
};
}
-var onTarget;
-
-var redirect = require('../modules/redirect');
-
-describe('redirect module', function() {
- it('should handle [path] without leading /', function() {
-
- var middleware = redirect.middleware({
- redirect: {
- 'jira.atlashost.eu/*': 'https://jira.atlashost.eu/[path]'
- }
- });
-
-
- function makeTest(host, path, cb) {
- onTarget = cb;
- middleware.handleRequest(makeReq(host, path), {
- setHeader: function(str, target) {
- if(str == 'Location')
- cb(target);
- },
- end: function(){}
- }, function(err) {
- onTarget('');
- });
- }
-
- var assertPath = function(host, path, mustEqual) {
- makeTest(host, path, function(target) {
- target.should.equal(mustEqual);
- });
- };
-
- assertPath('jira.atlashost.eu', '/test', 'https://jira.atlashost.eu/test');
- assertPath('jira.atlashost.eu', '/', 'https://jira.atlashost.eu/');
- assertPath('jira.atlashost.eu', '', 'https://jira.atlashost.eu/');
- });
-});
\ No newline at end of file
+var onTarget;1
+
+describe('redirect middleware', function() {
+ var redirectMiddleware;
+ beforeEach(function() {
+ redirectMiddleware = require('../modules/middleware/redirect')({});
+ });
+ function makeTest(target, host, path, cb, match) {
+ onTarget = cb;
+ redirectMiddleware.requestHandler(makeReq(host, path, match), {
+ setHeader: function(str, target) {
+ if(str == 'Location')
+ cb(target);
+ },
+ end: function(){}
+ }, function(err) {
+ onTarget('');
+ }, target);
+ }
+
+ it('should handle basic redirects', function() {
+ var assertPath = function(host, path, mustEqual) {
+ makeTest('https://jira.atlashost.eu/[path]', host, path, function(target) {
+ target.should.equal(mustEqual);
+ });
+ };
+ assertPath('jira.atlashost.eu', '/test', 'https://jira.atlashost.eu/test');
+ assertPath('jira.atlashost.eu', '/', 'https://jira.atlashost.eu/');
+ assertPath('jira.atlashost.eu', '', 'https://jira.atlashost.eu/');
+ });
+
+ it('should handle matches', function() {
+ var assertPath = function(host, path, mustEqual) {
+ makeTest('https://jira.atlashost.eu/[1]/[path]', host, path, function(target) {
+ target.should.equal(mustEqual);
+ }, 'foo'.match(/(.*)/).slice(1));
+ };
+ assertPath('jira.atlashost.eu', '/test', 'https://jira.atlashost.eu/foo/test');
+ assertPath('jira.atlashost.eu', '/', 'https://jira.atlashost.eu/foo/');
+ assertPath('jira.atlashost.eu', '', 'https://jira.atlashost.eu/foo/');
+ });
+
+});
+
+
diff --git a/tests/reject.js b/tests/reject.js
new file mode 100644
index 0000000..5685187
--- /dev/null
+++ b/tests/reject.js
@@ -0,0 +1,111 @@
+'use strict';
+require('should');
+
+function makeReq(host, path, hostMatch, pathMatch) {
+ return {
+ url: path,
+ headers: {
+ host: host
+ },
+ parsedUrl: require('url').parse(path),
+ connection: {},
+ hostMatch: hostMatch,
+ pathMatch: pathMatch
+ };
+}
+
+var onTarget;1
+
+describe('reject middleware', function() {
+ var rejectMiddleware;
+ beforeEach(function() {
+ rejectMiddleware = require('../modules/middleware/reject')({}, {});
+ });
+ function makeTest(target, host, path, cb, hostMatch, pathMatch) {
+ onTarget = cb;
+ var written = '';
+ rejectMiddleware.requestHandler(makeReq(host, path, hostMatch, pathMatch), {
+ end: function(str) {
+ cb(written + (str?str:''), this);
+ },
+ writeHead: function() {},
+ write: function(str) {written += str;}
+ }, function(err) {
+ onTarget('');
+ }, rejectMiddleware.entryParser(target));
+ }
+
+ it('should handle basic rejects', function() {
+ var assertPath = function(entry, codeEqual, mustEqual) {
+ makeTest(entry, '', '', function(str, res) {
+ str.should.equal(mustEqual);
+ res.statusCode.should.equal(codeEqual);
+ });
+ };
+ assertPath(undefined, 403, '403 Forbidden');
+ assertPath(403, 403, '403 Forbidden');
+ assertPath('403', 403, '403 Forbidden');
+ assertPath(null, 403, '403 Forbidden');
+ assertPath(404, 404, '404 Not Found');
+ assertPath(500, 500, '500 Internal Server Error');
+ assertPath(99, 99, '99 Forbidden');
+ assertPath(0, 403, '403 Forbidden');
+ assertPath("dpoaias", 403, '403 Forbidden');
+ });
+
+
+ var errorHtmlFile;
+ before(function() {
+ var fs = require('fs');
+ var path = require('path');
+ errorHtmlFile = path.join(__dirname, '.work', 'error.html');
+ fs.writeFileSync(errorHtmlFile, 'Hello, world!');
+
+ var fakeImageFile = path.join(__dirname, '.work', 'test.png');
+ fs.writeFileSync(fakeImageFile, 'test');
+ });
+
+ it('should show htmlPage when specified', function(endTest) {
+
+ makeTest({
+ htmlFile: errorHtmlFile
+ }, '', '', function(str, res) {
+ str.should.equal('Hello, world!');
+ res.statusCode.should.equal(403);
+ endTest();
+ });
+ });
+
+
+ it('should show default errorHtmlPage when site is offline', function(endTest) {
+
+ rejectMiddleware = require('../modules/middleware/reject')({
+ errorHtmlFile: errorHtmlFile
+ }, {});
+
+ makeTest({
+ }, '', '', function(str, res) {
+ str.should.equal('Hello, world!');
+ res.statusCode.should.equal(403);
+ endTest();
+ });
+ });
+
+ it('should show default errorHtmlPage when site is offline (from portConfig)', function(endTest) {
+
+ rejectMiddleware = require('../modules/middleware/reject')({
+ }, {
+ errorHtmlFile: errorHtmlFile
+ });
+
+ makeTest({
+ }, '', '', function(str, res) {
+ str.should.equal('Hello, world!');
+ res.statusCode.should.equal(403);
+ endTest();
+ });
+ });
+
+});
+
+