summaryrefslogtreecommitdiff
path: root/lib/https.js
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2015-07-22 21:18:38 -0700
committerFedor Indutny <fedor@indutny.com>2015-07-27 11:48:36 -0700
commit2ca5a3db47b930912161074c7b514c769113433b (patch)
tree67787831376a235fa1c50594317bc475da36f773 /lib/https.js
parent4e78cd71c00d0f109f414bcc01160be3704a4bb4 (diff)
downloadandroid-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.js50
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;