diff --git a/lib/https/server-agent.js b/lib/https/server-agent.js index 5321e566b..0aa32bbbb 100644 --- a/lib/https/server-agent.js +++ b/lib/https/server-agent.js @@ -1,12 +1,16 @@ var tls = require('tls'); var Q = require('q'); var ca = require('./ca'); +var getServer = require('../util/get-server').create(createTLSServer); + var MAX_SERVERS = 320; -var MAX_PORT = 60000; -var curPort = 42000; var TIMEOUT = 6000; // var DELAY = 100; +function createTLSServer(options, listener) { + return tls.createServer(options, listener); +} + function ServerAgent() { this._cache = {}; this._serverCount = 0; @@ -14,7 +18,7 @@ function ServerAgent() { var proto = ServerAgent.prototype; -proto.createServer = function createServer(hostname, secureConnectionListener, callback) { +proto.createServer = function createServer(hostname, listener, callback) { var self = this; var cache = self._cache; @@ -33,19 +37,18 @@ proto.createServer = function createServer(hostname, secureConnectionListener, c } self.freeServer(); - getServer(ca.createCertificate(hostname), secureConnectionListener, -function(port, server) { - var removeServer = function() { - self.removeServer(hostname); - }; - server.on('error', removeServer); - promise.server = server; - var timeout = setTimeout(removeServer, TIMEOUT); - server.once('secureConnection', function() { - clearTimeout(timeout); + getServer(ca.createCertificate(hostname), listener, function(server, port) { + var removeServer = function() { + self.removeServer(hostname); + }; + server.on('error', removeServer); + promise.server = server; + var timeout = setTimeout(removeServer, TIMEOUT); + server.once('secureConnection', function() { + clearTimeout(timeout); + }); + defer.resolve(port); }); - defer.resolve(port); -}); self._serverCount++; return self; @@ -116,26 +119,6 @@ proto.freeServer = function() { // } //}; -function getServer(options, secureConnectionListener, callback) { - curPort++; - if (curPort > MAX_PORT) { - curPort = 30001; - } else if (curPort % 10 === 0) { - curPort++; - } - - var server = tls.createServer(options, secureConnectionListener); - var next = function() { - getServer(options, secureConnectionListener, callback); - }; - server.on('error', next); - var port = curPort; - server.listen(port, function() { - server.removeListener('error', next); - callback(port, server); - }); -} - module.exports = ServerAgent; diff --git a/lib/plugins/load-plugin.js b/lib/plugins/load-plugin.js index d701c0ab1..8b2490e10 100644 --- a/lib/plugins/load-plugin.js +++ b/lib/plugins/load-plugin.js @@ -1,30 +1,8 @@ -var http = require('http'); var util = require('util'); var path = require('path'); var ca = require('../https/ca'); var Storage = require('../rules/storage'); -var MAX_PORT = 60000; -var curPort = 45000; - -function getServer(callback) { - curPort++; - if (curPort > MAX_PORT) { - curPort = 35001; - } else if (curPort % 10 === 0) { - curPort++; - } - - var server = http.createServer(); - var port = curPort; - var next = function() { - getServer(callback); - }; - server.on('error', next); - server.listen(port, function() { - server.removeListener('error', next); - callback(server, port); - }); -} +var getServer = require('../util/get-server').create(null, 45000); module.exports = function(options, callback) { options.getRootCAFile = ca.getRootCAFile; diff --git a/lib/service/service.js b/lib/service/service.js index cfc3d6be5..a4a433076 100644 --- a/lib/service/service.js +++ b/lib/service/service.js @@ -50,13 +50,10 @@ function sessionsHandler() { } module.exports = function(options, callback) { - try { - var server = http.createServer(sessionsHandler()); - var port = 8888 || options.servicePort; - server.listen(port, function() { - callback(null, { port: port }); - }); - } catch (err) { - callback(err); - } + var server = http.createServer(sessionsHandler()); + var port = options.servicePort; + server.on('error', callback); + server.listen(port, function() { + callback(null, { port: port }); + }); }; diff --git a/lib/util/get-server.js b/lib/util/get-server.js new file mode 100644 index 000000000..b23449532 --- /dev/null +++ b/lib/util/get-server.js @@ -0,0 +1,55 @@ +var http = require('http'); + +var MIN_PORT = 40000; +var MAX_PORT = 65000; +var createHttpServer = function() { + return http.createServer(); +}; + +function create(createServer, minPort, maxPort) { + minPort = minPort || MIN_PORT; + maxPort = maxPort || MAX_PORT; + createServer = createServer || createHttpServer; + var curPort = minPort; + + return function getServer() { + var args = Array.prototype.slice.apply(arguments); + curPort++; + if (curPort > MAX_PORT) { + curPort = Math.min(minPort - 10000, 30000); + } + if (curPort % 10 === 0) { + curPort++; + } + + var server = createServer.apply(null, args); + var port = curPort; + var next = function() { + setImmediate(function() { + getServer.apply(null, args); + }); + }; + server.on('error', next); + server.listen(port, function() { + server.removeListener('error', next); + args[args.length - 1](server, port); + }); + }; +} + +module.exports = function(callback, defaultPort) { + var _getServer = create(); + var getServer = function() { + _getServer(callback); + }; + if (defaultPort > 0) { + var server = createHttpServer(); + server.on('error', getServer); + server.listen(defaultPort, function() { + callback(server, defaultPort); + }); + } else { + getServer(); + } +}; +module.exports.create = create; diff --git a/lib/util/index.js b/lib/util/index.js index 369d2fa69..14534ed2f 100644 --- a/lib/util/index.js +++ b/lib/util/index.js @@ -31,6 +31,7 @@ exports.SpeedTransform = require('./speed-transform'); exports.FileWriterTransform = require('./file-writer-transform'); exports.MultiPartParser = require('./multipart-parser'); exports.parseReq = require('./parse-req'); +exports.getServer = require('./get-server'); exports.formatHeaders = exports.parseReq.formatHeaders; exports.getRawHeaderNames = exports.parseReq.getRawHeaderNames;