From acef181fde5f725f54e8e951618ac3bb38eaaca5 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Fri, 11 Dec 2015 20:11:17 -0500 Subject: [PATCH] https: support disabling session caching Zero value of `maxCachedSessions` should disable TLS session caching in `https.Agent` PR-URL: https://github.com/nodejs/node/pull/4252 Reviewed-By: James M Snell Reviewed-By: Ben Noordhuis --- lib/https.js | 4 ++ .../test-https-agent-disable-session-reuse.js | 60 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 test/parallel/test-https-agent-disable-session-reuse.js diff --git a/lib/https.js b/lib/https.js index 90b6346bd95f20..6f97991f98c8e3 100644 --- a/lib/https.js +++ b/lib/https.js @@ -138,6 +138,10 @@ Agent.prototype._getSession = function _getSession(key) { }; Agent.prototype._cacheSession = function _cacheSession(key, session) { + // Cache is disabled + if (this.maxCachedSessions === 0) + return; + // Fast case - update existing entry if (this._sessionCache.map[key]) { this._sessionCache.map[key] = session; diff --git a/test/parallel/test-https-agent-disable-session-reuse.js b/test/parallel/test-https-agent-disable-session-reuse.js new file mode 100644 index 00000000000000..551f0150bfb3de --- /dev/null +++ b/test/parallel/test-https-agent-disable-session-reuse.js @@ -0,0 +1,60 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +if (!common.hasCrypto) { + console.log('1..0 # Skipped: missing crypto'); + return; +} + +const TOTAL_REQS = 2; + +const https = require('https'); +const crypto = require('crypto'); + +const fs = require('fs'); + +const options = { + key: fs.readFileSync(common.fixturesDir + '/keys/agent1-key.pem'), + cert: fs.readFileSync(common.fixturesDir + '/keys/agent1-cert.pem') +}; + +const clientSessions = []; +var serverRequests = 0; + +const agent = new https.Agent({ + maxCachedSessions: 0 +}); + +const server = https.createServer(options, function(req, res) { + serverRequests++; + res.end('ok'); +}).listen(common.PORT, function() { + var waiting = TOTAL_REQS; + function request() { + const options = { + agent: agent, + port: common.PORT, + rejectUnauthorized: false + }; + + https.request(options, function(res) { + clientSessions.push(res.socket.getSession()); + + res.resume(); + res.on('end', function() { + if (--waiting !== 0) + return request(); + server.close(); + }); + }).end(); + } + request(); +}); + +process.on('exit', function() { + assert.equal(serverRequests, TOTAL_REQS); + assert.equal(clientSessions.length, TOTAL_REQS); + assert.notEqual(clientSessions[0].toString('hex'), + clientSessions[1].toString('hex')); +});