| 'use strict'; |
| const common = require('../common'); |
| const assert = require('assert'); |
| |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const https = require('https'); |
| const crypto = require('crypto'); |
| const fixtures = require('../common/fixtures'); |
| |
| const options = { |
| key: fixtures.readKey('agent1-key.pem'), |
| cert: fixtures.readKey('agent1-cert.pem') |
| }; |
| |
| const ca = fixtures.readKey('ca1-cert.pem'); |
| |
| const clientSessions = {}; |
| let serverRequests = 0; |
| |
| const agent = new https.Agent({ |
| maxCachedSessions: 1 |
| }); |
| |
| const server = https.createServer(options, function(req, res) { |
| if (req.url === '/drop-key') |
| server.setTicketKeys(crypto.randomBytes(48)); |
| |
| serverRequests++; |
| res.end('ok'); |
| }).listen(0, function() { |
| const queue = [ |
| { |
| name: 'first', |
| |
| method: 'GET', |
| path: '/', |
| servername: 'agent1', |
| ca: ca, |
| port: this.address().port |
| }, |
| { |
| name: 'first-reuse', |
| |
| method: 'GET', |
| path: '/', |
| servername: 'agent1', |
| ca: ca, |
| port: this.address().port |
| }, |
| { |
| name: 'cipher-change', |
| |
| method: 'GET', |
| path: '/', |
| servername: 'agent1', |
| |
| // Choose different cipher to use different cache entry |
| ciphers: 'AES256-SHA', |
| ca: ca, |
| port: this.address().port |
| }, |
| // Change the ticket key to ensure session is updated in cache |
| { |
| name: 'before-drop', |
| |
| method: 'GET', |
| path: '/drop-key', |
| servername: 'agent1', |
| ca: ca, |
| port: this.address().port |
| }, |
| |
| // Ticket will be updated starting from this |
| { |
| name: 'after-drop', |
| |
| method: 'GET', |
| path: '/', |
| servername: 'agent1', |
| ca: ca, |
| port: this.address().port |
| }, |
| { |
| name: 'after-drop-reuse', |
| |
| method: 'GET', |
| path: '/', |
| servername: 'agent1', |
| ca: ca, |
| port: this.address().port |
| }, |
| ]; |
| |
| function request() { |
| const options = queue.shift(); |
| options.agent = agent; |
| https.request(options, function(res) { |
| clientSessions[options.name] = res.socket.getSession(); |
| |
| res.resume(); |
| res.on('end', function() { |
| if (queue.length !== 0) |
| return request(); |
| server.close(); |
| }); |
| }).end(); |
| } |
| request(); |
| }); |
| |
| process.on('exit', function() { |
| assert.strictEqual(serverRequests, 6); |
| assert.strictEqual(clientSessions.first.toString('hex'), |
| clientSessions['first-reuse'].toString('hex')); |
| assert.notStrictEqual(clientSessions.first.toString('hex'), |
| clientSessions['cipher-change'].toString('hex')); |
| assert.notStrictEqual(clientSessions.first.toString('hex'), |
| clientSessions['before-drop'].toString('hex')); |
| assert.notStrictEqual(clientSessions['cipher-change'].toString('hex'), |
| clientSessions['before-drop'].toString('hex')); |
| assert.notStrictEqual(clientSessions['before-drop'].toString('hex'), |
| clientSessions['after-drop'].toString('hex')); |
| assert.strictEqual(clientSessions['after-drop'].toString('hex'), |
| clientSessions['after-drop-reuse'].toString('hex')); |
| }); |