diff options
author | Fedor Indutny <fedor@indutny.com> | 2015-07-22 21:18:38 -0700 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2015-07-27 11:48:36 -0700 |
commit | 2ca5a3db47b930912161074c7b514c769113433b (patch) | |
tree | 67787831376a235fa1c50594317bc475da36f773 /lib/https.js | |
parent | 4e78cd71c00d0f109f414bcc01160be3704a4bb4 (diff) | |
download | android-node-v8-2ca5a3db47b930912161074c7b514c769113433b.tar.gz android-node-v8-2ca5a3db47b930912161074c7b514c769113433b.tar.bz2 android-node-v8-2ca5a3db47b930912161074c7b514c769113433b.zip |
https: reuse TLS sessions in Agent
Fix: #1499
PR-URL: https://github.com/nodejs/io.js/pull/2228
Reviewed-By: Shigeki Ohtsu <ohtsu@iij.ad.jp>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Diffstat (limited to 'lib/https.js')
-rw-r--r-- | lib/https.js | 50 |
1 files changed, 49 insertions, 1 deletions
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; |