net_uv: defer handle creation to connect() or bind() time
authorBen Noordhuis <info@bnoordhuis.nl>
Thu, 21 Jul 2011 21:00:47 +0000 (23:00 +0200)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 21 Jul 2011 22:54:50 +0000 (00:54 +0200)
Fixes #1379.

lib/net_uv.js

index cfcf117..e979b44 100644 (file)
@@ -46,14 +46,17 @@ exports.connect = exports.createConnection = function(port /* [host], [cb] */) {
 
 /* called when creating new Socket, or when re-using a closed Socket */
 function initSocketHandle(self) {
-  self._handle.socket = self;
-  self._handle.onread = onread;
-
   self._writeRequests = [];
 
   self._flags = 0;
   self._connectQueueSize = 0;
   self.destroyed = false;
+
+  // Handle creation may be deferred to bind() or connect() time.
+  if (self._handle) {
+    self._handle.socket = self;
+    self._handle.onread = onread;
+  }
 }
 
 function Socket(options) {
@@ -62,14 +65,10 @@ function Socket(options) {
   stream.Stream.call(this);
 
   // private
-  if (options && options.handle) {
-    this._handle = options.handle;
-  } else {
-    this._handle = new TCP;
-  }
-  this.allowHalfOpen = options ? (options.allowHalfOpen || false) : false;
-
+  this._handle = options && options.handle;
   initSocketHandle(this);
+
+  this.allowHalfOpen = options && options.allowHalfOpen;
 }
 util.inherits(Socket, stream.Stream);
 
@@ -218,7 +217,9 @@ Socket.prototype.destroy = function(exception) {
   }
 
   debug('close ' + this.fd);
-  this._handle.close();
+  if (this._handle) {
+    this._handle.close();
+  }
 
   process.nextTick(function() {
     if (exception) self.emit('error', exception);
@@ -394,7 +395,7 @@ Socket.prototype.connect = function(port /* [host], [cb] */) {
 
   var pipe = isPipeName(port);
 
-  if (this.destroyed) {
+  if (this.destroyed || !this._handle) {
     this._handle = pipe ? new Pipe() : new TCP();
     initSocketHandle(this);
   }