Share SSL context between server connections
authorFedor Indutny <fedor.indutny@gmail.com>
Thu, 19 May 2011 19:42:13 +0000 (02:42 +0700)
committerRyan Dahl <ry@tinyclouds.org>
Thu, 19 May 2011 21:45:42 +0000 (14:45 -0700)
Fixes #1073.

lib/crypto.js
lib/tls.js

index c95103f..2a9225a 100644 (file)
@@ -36,7 +36,7 @@ try {
 }
 
 
-function Credentials(secureProtocol) {
+function Credentials(secureProtocol, context) {
   if (!(this instanceof Credentials)) {
     return new Credentials(secureProtocol);
   }
@@ -45,22 +45,28 @@ function Credentials(secureProtocol) {
     throw new Error('node.js not compiled with openssl crypto support.');
   }
 
-  this.context = new SecureContext();
-
-  if (secureProtocol) {
-    this.context.init(secureProtocol);
+  if (context) {
+    this.context = context;
+    this.reuseContext = true;
   } else {
-    this.context.init();
-  }
+    this.context = new SecureContext();
 
+    if (secureProtocol) {
+      this.context.init(secureProtocol);
+    } else {
+      this.context.init();
+    }
+  }
 }
 
 exports.Credentials = Credentials;
 
 
-exports.createCredentials = function(options) {
+exports.createCredentials = function(options, context) {
   if (!options) options = {};
-  var c = new Credentials(options.secureProtocol);
+  var c = new Credentials(options.secureProtocol, context);
+
+  if (context) return c;
 
   if (options.key) c.context.setKey(options.key);
 
index 295c95a..781f4c5 100644 (file)
@@ -713,16 +713,23 @@ function Server(/* [options], listener */) {
 
   var self = this;
 
+  // Handle option defaults:
+  this.setOptions(options);
+
+  var sharedCreds = crypto.createCredentials({
+    key: self.key,
+    cert: self.cert,
+    ca: self.ca,
+    ciphers: self.ciphers,
+    secureProtocol: self.secureProtocol,
+    crl: self.crl
+  });
+
+  sharedCreds.context.setCiphers('RC4-SHA:AES128-SHA:AES256-SHA');
+
   // constructor call
   net.Server.call(this, function(socket) {
-    var creds = crypto.createCredentials({
-      key: self.key,
-      cert: self.cert,
-      ca: self.ca,
-      secureProtocol: self.secureProtocol,
-      crl: self.crl
-    });
-    creds.context.setCiphers('RC4-SHA:AES128-SHA:AES256-SHA');
+    var creds = crypto.createCredentials(null, sharedCreds.context);
 
     var pair = new SecurePair(creds,
                               true,