http: don't double-fire the req error event
req.socket._hadError should be set before emitting the error event. PR-URL: https://github.com/nodejs/node/pull/14659 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de>
This commit is contained in:
parent
e96b94970a
commit
620ba41694
@ -373,8 +373,8 @@ function socketCloseListener() {
|
|||||||
// This socket error fired before we started to
|
// This socket error fired before we started to
|
||||||
// receive a response. The error needs to
|
// receive a response. The error needs to
|
||||||
// fire on the request.
|
// fire on the request.
|
||||||
req.emit('error', createHangUpError());
|
|
||||||
req.socket._hadError = true;
|
req.socket._hadError = true;
|
||||||
|
req.emit('error', createHangUpError());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Too bad. That output wasn't getting written.
|
// Too bad. That output wasn't getting written.
|
||||||
@ -397,10 +397,10 @@ function socketErrorListener(err) {
|
|||||||
debug('SOCKET ERROR:', err.message, err.stack);
|
debug('SOCKET ERROR:', err.message, err.stack);
|
||||||
|
|
||||||
if (req) {
|
if (req) {
|
||||||
req.emit('error', err);
|
|
||||||
// For Safety. Some additional errors might fire later on
|
// For Safety. Some additional errors might fire later on
|
||||||
// and we need to make sure we don't double-fire the error event.
|
// and we need to make sure we don't double-fire the error event.
|
||||||
req.socket._hadError = true;
|
req.socket._hadError = true;
|
||||||
|
req.emit('error', err);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle any pending data
|
// Handle any pending data
|
||||||
@ -433,8 +433,8 @@ function socketOnEnd() {
|
|||||||
if (!req.res && !req.socket._hadError) {
|
if (!req.res && !req.socket._hadError) {
|
||||||
// If we don't have a response then we know that the socket
|
// 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.
|
// ended prematurely and we need to emit an error on the request.
|
||||||
req.emit('error', createHangUpError());
|
|
||||||
req.socket._hadError = true;
|
req.socket._hadError = true;
|
||||||
|
req.emit('error', createHangUpError());
|
||||||
}
|
}
|
||||||
if (parser) {
|
if (parser) {
|
||||||
parser.finish();
|
parser.finish();
|
||||||
@ -455,8 +455,8 @@ function socketOnData(d) {
|
|||||||
debug('parse error', ret);
|
debug('parse error', ret);
|
||||||
freeParser(parser, req, socket);
|
freeParser(parser, req, socket);
|
||||||
socket.destroy();
|
socket.destroy();
|
||||||
req.emit('error', ret);
|
|
||||||
req.socket._hadError = true;
|
req.socket._hadError = true;
|
||||||
|
req.emit('error', ret);
|
||||||
} else if (parser.incoming && parser.incoming.upgrade) {
|
} else if (parser.incoming && parser.incoming.upgrade) {
|
||||||
// Upgrade or CONNECT
|
// Upgrade or CONNECT
|
||||||
var bytesParsed = ret;
|
var bytesParsed = ret;
|
||||||
|
16
test/parallel/test-http-client-req-error-dont-double-fire.js
Normal file
16
test/parallel/test-http-client-req-error-dont-double-fire.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
'use strict';
|
||||||
|
const assert = require('assert');
|
||||||
|
const http = require('http');
|
||||||
|
const common = require('../common');
|
||||||
|
|
||||||
|
// not exists host
|
||||||
|
const host = '*'.repeat(256);
|
||||||
|
const req = http.get({ host });
|
||||||
|
const err = new Error('mock unexpected code error');
|
||||||
|
req.on('error', common.mustCall(() => {
|
||||||
|
throw err;
|
||||||
|
}));
|
||||||
|
|
||||||
|
process.on('uncaughtException', common.mustCall((e) => {
|
||||||
|
assert.strictEqual(e, err);
|
||||||
|
}));
|
Loading…
x
Reference in New Issue
Block a user