From 2ca5a3db47b930912161074c7b514c769113433b Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Wed, 22 Jul 2015 21:18:38 -0700 Subject: https: reuse TLS sessions in Agent Fix: #1499 PR-URL: https://github.com/nodejs/io.js/pull/2228 Reviewed-By: Shigeki Ohtsu Reviewed-By: Trevor Norris --- lib/https.js | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'lib/https.js') diff --git a/lib/https.js b/lib/https.js index 21103b71af..abe4a20907 100644 --- a/lib/https.js +++ b/lib/https.js @@ -58,7 +58,25 @@ function createConnection(port, host, options) { } debug('createConnection', options); - return tls.connect(options); + + if (options._agentKey) { + const session = this._getSession(options._agentKey); + if (session) { + debug('reuse session for %j', options._agentKey); + options = util._extend({ + session: session + }, options); + } + } + + const self = this; + const socket = tls.connect(options, function() { + if (!options._agentKey) + return; + + self._cacheSession(options._agentKey, socket.getSession()); + }); + return socket; } @@ -66,6 +84,14 @@ function Agent(options) { http.Agent.call(this, options); this.defaultPort = 443; this.protocol = 'https:'; + this.maxCachedSessions = this.options.maxCachedSessions; + if (this.maxCachedSessions === undefined) + this.maxCachedSessions = 100; + + this._sessionCache = { + map: {}, + list: [] + }; } inherits(Agent, http.Agent); Agent.prototype.createConnection = createConnection; @@ -100,6 +126,28 @@ Agent.prototype.getName = function(options) { return name; }; +Agent.prototype._getSession = function _getSession(key) { + return this._sessionCache.map[key]; +}; + +Agent.prototype._cacheSession = function _cacheSession(key, session) { + // Fast case - update existing entry + if (this._sessionCache.map[key]) { + this._sessionCache.map[key] = session; + return; + } + + // Put new entry + if (this._sessionCache.list.length >= this.maxCachedSessions) { + const oldKey = this._sessionCache.list.shift(); + debug('evicting %j', oldKey); + delete this._sessionCache.map[oldKey]; + } + + this._sessionCache.list.push(key); + this._sessionCache.map[key] = session; +}; + const globalAgent = new Agent(); exports.globalAgent = globalAgent; -- cgit v1.2.3