Created
October 26, 2012 15:06
-
-
Save pghalliday/3959305 to your computer and use it in GitHub Desktop.
HTTP upgrade to tls
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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