Merge remote-tracking branch 'ry/v0.10'
[platform/upstream/nodejs.git] / lib / tls.js
index 334f411..f0cdaac 100644 (file)
@@ -335,7 +335,10 @@ CryptoStream.prototype._write = function write(data, encoding, cb) {
       written = this.pair.ssl.encIn(data, 0, data.length);
     }
 
-    var self = this;
+    // Handle and report errors
+    if (this.pair.ssl && this.pair.ssl.error) {
+      return cb(this.pair.error(true));
+    }
 
     // Force SSL_read call to cycle some states/data inside OpenSSL
     this.pair.cleartext.read(0);
@@ -345,11 +348,6 @@ CryptoStream.prototype._write = function write(data, encoding, cb) {
       this.pair.encrypted.read(0);
     }
 
-    // Handle and report errors
-    if (this.pair.ssl && this.pair.ssl.error) {
-      return cb(this.pair.error());
-    }
-
     // Get NPN and Server name when ready
     this.pair.maybeInitFinished();
 
@@ -919,24 +917,28 @@ SecurePair.prototype.destroy = function() {
 };
 
 
-SecurePair.prototype.error = function() {
+SecurePair.prototype.error = function(returnOnly) {
   var err = this.ssl.error;
   this.ssl.error = null;
 
   if (!this._secureEstablished) {
-    if (!err) {
-      err = new Error('socket hang up');
-      err.code = 'ECONNRESET';
+    // Emit ECONNRESET instead of zero return
+    if (!err || err.message === 'ZERO_RETURN') {
+      var connReset = new Error('socket hang up');
+      connReset.code = 'ECONNRESET';
+      connReset.sslError = err && err.message;
+
+      err = connReset;
     }
     this.destroy();
-    this.emit('error', err);
+    if (!returnOnly) this.emit('error', err);
   } else if (this._isServer &&
              this._rejectUnauthorized &&
              /peer did not return a certificate/.test(err.message)) {
     // Not really an error.
     this.destroy();
   } else {
-    this.cleartext.emit('error', err);
+    if (!returnOnly) this.cleartext.emit('error', err);
   }
   return err;
 };