diff --git a/lib/_http_client.js b/lib/_http_client.js index e02cb4f40c..6825fd292e 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -182,12 +182,12 @@ function socketCloseListener() { res.emit('close'); }); res.push(null); - } else if (!req.res && !req._hadError) { + } else if (!req.res && !req.socket._hadError) { // This socket error fired before we started to // receive a response. The error needs to // fire on the request. req.emit('error', createHangUpError()); - req._hadError = true; + req.socket._hadError = true; } // Too bad. That output wasn't getting written. @@ -214,7 +214,7 @@ function socketErrorListener(err) { req.emit('error', err); // For Safety. Some additional errors might fire later on // and we need to make sure we don't double-fire the error event. - req._hadError = true; + req.socket._hadError = true; } if (parser) { @@ -229,11 +229,11 @@ function socketOnEnd() { var req = this._httpMessage; var parser = this.parser; - if (!req.res) { + if (!req.res && !req.socket._hadError) { // If we don't have a response then we know that the socket // ended prematurely and we need to emit an error on the request. req.emit('error', createHangUpError()); - req._hadError = true; + req.socket._hadError = true; } if (parser) { parser.finish(); @@ -253,7 +253,7 @@ function socketOnData(d, start, end) { freeParser(parser, req); socket.destroy(); req.emit('error', ret); - req._hadError = true; + req.socket._hadError = true; } else if (parser.incoming && parser.incoming.upgrade) { // Upgrade or CONNECT var bytesParsed = ret; diff --git a/lib/_tls_wrap.js b/lib/_tls_wrap.js index e5b2e3bc40..92946345bc 100644 --- a/lib/_tls_wrap.js +++ b/lib/_tls_wrap.js @@ -543,10 +543,14 @@ exports.connect = function(/* [port, host], options, cb */) { }); function onHangUp() { - var error = new Error('socket hang up'); - error.code = 'ECONNRESET'; - socket.destroy(); - socket.emit('error', error); + // NOTE: This logic is shared with _http_client.js + if (!socket._hadError) { + socket._hadError = true; + var error = new Error('socket hang up'); + error.code = 'ECONNRESET'; + socket.destroy(); + socket.emit('error', error); + } } socket.once('end', onHangUp); } diff --git a/lib/net.js b/lib/net.js index 2caf123b6c..53e8bc11ed 100644 --- a/lib/net.js +++ b/lib/net.js @@ -128,6 +128,7 @@ function Socket(options) { if (!(this instanceof Socket)) return new Socket(options); this._connecting = false; + this._hadError = false; this._handle = null; switch (typeof options) {