Skip to content

Instantly share code, notes, and snippets.

@pghalliday
Created October 26, 2012 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pghalliday/3959305 to your computer and use it in GitHub Desktop.
Save pghalliday/3959305 to your computer and use it in GitHub Desktop.
HTTP upgrade to tls
var http = require('http'),
tls = require('tls'),
fs = require('fs'),
crypto = require('crypto');
var PORT = 8080,
SERVER_KEY = fs.readFileSync('./test/keys/server-key.pem'),
SERVER_CERT = fs.readFileSync('./test/keys/server-cert.pem'),
CLIENT_KEY = fs.readFileSync('./test/keys/client-key.pem'),
CLIENT_CERT = fs.readFileSync('./test/keys/client-cert.pem');
var server = http.createServer();
server.on('upgrade', function(req, socket, head) {
socket.on('end', function() {
console.log('server socket ended');
// *****************************************************************************************************
// Why do I have to destroy the socket here in order to force it to close amd allow the server to stop!!
// *****************************************************************************************************
socket.destroy();
});
socket.write('HTTP/1.1 200\r\n' +
'Upgrade: TLS\r\n' +
'Connection: Upgrade\r\n' +
'\r\n');
var securePair = tls.createSecurePair(
crypto.createCredentials({
key: SERVER_KEY,
cert: SERVER_CERT,
ca: [CLIENT_CERT]
}),
true,
true,
true
);
socket.pipe(securePair.encrypted).pipe(socket);
});
server.listen(PORT, function() {
var options = {
port: PORT,
headers: {
'Connection': 'Upgrade',
'Upgrade': 'TLS'
}
};
var request = http.request(options);
request.on('upgrade', function(res, socket, upgradeHead) {
var securePair = tls.createSecurePair(
crypto.createCredentials({
key: CLIENT_KEY,
cert: CLIENT_CERT,
ca: [SERVER_CERT]
}),
false,
true,
true
);
securePair.cleartext.on('end', function() {
console.log('client cleartext ended');
server.close(function() {
console.log('finished');
});
});
securePair.on('secure', function() {
securePair.cleartext.end();
})
socket.pipe(securePair.encrypted).pipe(socket);
});
request.end();
});
client cleartext ended
server socket ended
finished
--------------------------------------------------------------------------------------
But if i don't destroy the server side socket in it's end event this will never finish
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment