tls: do not hang without newSession
handler
When listening for client hello parser events (like OCSP requests), do not hang if `newSession` event handler is not present. fix joyent/node#8660 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> PR-URL: https://github.com/node-forward/node/pull/47
This commit is contained in:
parent
f8076c4067
commit
963f5e8a88
@ -655,14 +655,17 @@ function onnewsession(key, session) {
|
|||||||
var self = this;
|
var self = this;
|
||||||
var once = false;
|
var once = false;
|
||||||
|
|
||||||
self.server.emit('newSession', key, session, function() {
|
if (!self.server.emit('newSession', key, session, done))
|
||||||
|
done();
|
||||||
|
|
||||||
|
function done() {
|
||||||
if (once)
|
if (once)
|
||||||
return;
|
return;
|
||||||
once = true;
|
once = true;
|
||||||
|
|
||||||
if (self.ssl)
|
if (self.ssl)
|
||||||
self.ssl.newSessionDone();
|
self.ssl.newSessionDone();
|
||||||
});
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -200,7 +200,10 @@ function onnewsession(key, session) {
|
|||||||
var once = false;
|
var once = false;
|
||||||
|
|
||||||
this._newSessionPending = true;
|
this._newSessionPending = true;
|
||||||
this.server.emit('newSession', key, session, function() {
|
if (!this.server.emit('newSession', key, session, done))
|
||||||
|
done();
|
||||||
|
|
||||||
|
function done() {
|
||||||
if (once)
|
if (once)
|
||||||
return;
|
return;
|
||||||
once = true;
|
once = true;
|
||||||
@ -211,7 +214,7 @@ function onnewsession(key, session) {
|
|||||||
if (self._securePending)
|
if (self._securePending)
|
||||||
self._finishInit();
|
self._finishInit();
|
||||||
self._securePending = false;
|
self._securePending = false;
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,16 +31,19 @@ if (!common.opensslCli) {
|
|||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var assert = require('assert');
|
||||||
|
var tls = require('tls');
|
||||||
|
var constants = require('constants');
|
||||||
|
var fs = require('fs');
|
||||||
|
var join = require('path').join;
|
||||||
|
|
||||||
test({ response: false }, function() {
|
test({ response: false }, function() {
|
||||||
test({ response: 'hello world' });
|
test({ response: 'hello world' }, function() {
|
||||||
|
test({ ocsp: false });
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function test(testOptions, cb) {
|
function test(testOptions, cb) {
|
||||||
var assert = require('assert');
|
|
||||||
var tls = require('tls');
|
|
||||||
var fs = require('fs');
|
|
||||||
var join = require('path').join;
|
|
||||||
var spawn = require('child_process').spawn;
|
|
||||||
|
|
||||||
var keyFile = join(common.fixturesDir, 'keys', 'agent1-key.pem');
|
var keyFile = join(common.fixturesDir, 'keys', 'agent1-key.pem');
|
||||||
var certFile = join(common.fixturesDir, 'keys', 'agent1-cert.pem');
|
var certFile = join(common.fixturesDir, 'keys', 'agent1-cert.pem');
|
||||||
@ -54,6 +57,7 @@ function test(testOptions, cb) {
|
|||||||
ca: [ca]
|
ca: [ca]
|
||||||
};
|
};
|
||||||
var requestCount = 0;
|
var requestCount = 0;
|
||||||
|
var clientSecure = 0;
|
||||||
var ocspCount = 0;
|
var ocspCount = 0;
|
||||||
var ocspResponse;
|
var ocspResponse;
|
||||||
var session;
|
var session;
|
||||||
@ -83,9 +87,12 @@ function test(testOptions, cb) {
|
|||||||
server.listen(common.PORT, function() {
|
server.listen(common.PORT, function() {
|
||||||
var client = tls.connect({
|
var client = tls.connect({
|
||||||
port: common.PORT,
|
port: common.PORT,
|
||||||
requestOCSP: true,
|
requestOCSP: testOptions.ocsp !== false,
|
||||||
|
secureOptions: testOptions.ocsp === false ?
|
||||||
|
constants.SSL_OP_NO_TICKET : 0,
|
||||||
rejectUnauthorized: false
|
rejectUnauthorized: false
|
||||||
}, function() {
|
}, function() {
|
||||||
|
clientSecure++;
|
||||||
});
|
});
|
||||||
client.on('OCSPResponse', function(resp) {
|
client.on('OCSPResponse', function(resp) {
|
||||||
ocspResponse = resp;
|
ocspResponse = resp;
|
||||||
@ -98,12 +105,19 @@ function test(testOptions, cb) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
process.on('exit', function() {
|
process.on('exit', function() {
|
||||||
|
if (testOptions.ocsp === false) {
|
||||||
|
assert.equal(requestCount, clientSecure);
|
||||||
|
assert.equal(requestCount, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (testOptions.response) {
|
if (testOptions.response) {
|
||||||
assert.equal(ocspResponse.toString(), testOptions.response);
|
assert.equal(ocspResponse.toString(), testOptions.response);
|
||||||
} else {
|
} else {
|
||||||
assert.ok(ocspResponse === null);
|
assert.ok(ocspResponse === null);
|
||||||
}
|
}
|
||||||
assert.equal(requestCount, testOptions.response ? 0 : 1);
|
assert.equal(requestCount, testOptions.response ? 0 : 1);
|
||||||
|
assert.equal(clientSecure, requestCount);
|
||||||
assert.equal(ocspCount, 1);
|
assert.equal(ocspCount, 1);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user