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
|
||||
// receive a response. The error needs to
|
||||
// fire on the request.
|
||||
req.emit('error', createHangUpError());
|
||||
req.socket._hadError = true;
|
||||
req.emit('error', createHangUpError());
|
||||
}
|
||||
|
||||
// Too bad. That output wasn't getting written.
|
||||
@ -397,10 +397,10 @@ function socketErrorListener(err) {
|
||||
debug('SOCKET ERROR:', err.message, err.stack);
|
||||
|
||||
if (req) {
|
||||
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.socket._hadError = true;
|
||||
req.emit('error', err);
|
||||
}
|
||||
|
||||
// Handle any pending data
|
||||
@ -433,8 +433,8 @@ function socketOnEnd() {
|
||||
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.socket._hadError = true;
|
||||
req.emit('error', createHangUpError());
|
||||
}
|
||||
if (parser) {
|
||||
parser.finish();
|
||||
@ -455,8 +455,8 @@ function socketOnData(d) {
|
||||
debug('parse error', ret);
|
||||
freeParser(parser, req, socket);
|
||||
socket.destroy();
|
||||
req.emit('error', ret);
|
||||
req.socket._hadError = true;
|
||||
req.emit('error', ret);
|
||||
} else if (parser.incoming && parser.incoming.upgrade) {
|
||||
// Upgrade or CONNECT
|
||||
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