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);
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();
};
-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;
};