Skip to content

Commit 5d99a9b

Browse files
ronagmcollina
authored andcommitted
http: emit close as the last event in the client
Emit close event after all other events in the client, e.g. error will be emitted before close. PR-URL: #15588 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Luigi Pinca <[email protected]>
1 parent df5dc2d commit 5d99a9b

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

lib/_http_client.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ function socketCloseListener() {
346346
// NOTE: It's important to get parser here, because it could be freed by
347347
// the `socketOnData`.
348348
var parser = socket.parser;
349-
req.emit('close');
350349
if (req.res && req.res.readable) {
351350
// Socket closed before we emitted 'end' below.
352351
req.res.emit('aborted');
@@ -362,6 +361,7 @@ function socketCloseListener() {
362361
req.socket._hadError = true;
363362
req.emit('error', createHangUpError());
364363
}
364+
req.emit('close');
365365

366366
// Too bad. That output wasn't getting written.
367367
// This is pretty terrible that it doesn't raise an error.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use strict';
2+
const common = require('../common');
3+
4+
// This test ensures that the `'close'` event is emitted after the `'error'`
5+
// event when a request is made and the socket is closed before we started to
6+
// receive a response.
7+
8+
const assert = require('assert');
9+
const http = require('http');
10+
11+
const server = http.createServer(common.mustNotCall());
12+
13+
server.listen(0, common.mustCall(() => {
14+
const req = http.get({ port: server.address().port }, common.mustNotCall());
15+
let errorEmitted = false;
16+
17+
req.on('error', (err) => {
18+
errorEmitted = true;
19+
assert.strictEqual(err.constructor, Error);
20+
assert.strictEqual(err.message, 'socket hang up');
21+
assert.strictEqual(err.code, 'ECONNRESET');
22+
});
23+
24+
req.on('close', common.mustCall(() => {
25+
assert.strictEqual(errorEmitted, true);
26+
server.close();
27+
}));
28+
29+
req.destroy();
30+
}));

0 commit comments

Comments
 (0)