tls: fix setting NPN protocols

The NPN protocols was set on `require('tls')` or `global` object instead
of being a local property. This fact lead to strange persistence of NPN
protocols, and sometimes incorrect protocol selection (when no NPN
protocols were passed in client options).

fix #6168
This commit is contained in:
Fedor Indutny 2013-09-09 18:18:05 +04:00
Родитель 3546825b14
Коммит 1c3863abfd
2 изменённых файлов: 15 добавлений и 4 удалений

Просмотреть файл

@ -1321,12 +1321,13 @@ exports.connect = function(/* [port, host], options, cb */) {
var sslcontext = crypto.createCredentials(options); var sslcontext = crypto.createCredentials(options);
convertNPNProtocols(options.NPNProtocols, this); var NPN = {};
convertNPNProtocols(options.NPNProtocols, NPN);
var hostname = options.servername || options.host || 'localhost', var hostname = options.servername || options.host || 'localhost',
pair = new SecurePair(sslcontext, false, true, pair = new SecurePair(sslcontext, false, true,
options.rejectUnauthorized === true ? true : false, options.rejectUnauthorized === true ? true : false,
{ {
NPNProtocols: this.NPNProtocols, NPNProtocols: NPN.NPNProtocols,
servername: hostname, servername: hostname,
cleartext: options.cleartext, cleartext: options.cleartext,
encrypted: options.encrypted encrypted: options.encrypted

Просмотреть файл

@ -61,6 +61,12 @@ var clientsOptions = [{
crl: serverOptions.crl, crl: serverOptions.crl,
NPNProtocols: ['c', 'b', 'e'], NPNProtocols: ['c', 'b', 'e'],
rejectUnauthorized: false rejectUnauthorized: false
},{
port: serverPort,
key: serverOptions.key,
cert: serverOptions.cert,
crl: serverOptions.crl,
rejectUnauthorized: false
},{ },{
port: serverPort, port: serverPort,
key: serverOptions.key, key: serverOptions.key,
@ -91,7 +97,9 @@ function startTest() {
connectClient(clientsOptions[0], function() { connectClient(clientsOptions[0], function() {
connectClient(clientsOptions[1], function() { connectClient(clientsOptions[1], function() {
connectClient(clientsOptions[2], function() { connectClient(clientsOptions[2], function() {
server.close(); connectClient(clientsOptions[3], function() {
server.close();
});
}); });
}); });
}); });
@ -100,6 +108,8 @@ function startTest() {
process.on('exit', function() { process.on('exit', function() {
assert.equal(serverResults[0], clientsResults[0]); assert.equal(serverResults[0], clientsResults[0]);
assert.equal(serverResults[1], clientsResults[1]); assert.equal(serverResults[1], clientsResults[1]);
assert.equal(serverResults[2], 'first-priority-unsupported'); assert.equal(serverResults[2], 'http/1.1');
assert.equal(clientsResults[2], false); assert.equal(clientsResults[2], false);
assert.equal(serverResults[3], 'first-priority-unsupported');
assert.equal(clientsResults[3], false);
}); });