Skip to content

Commit

Permalink
Don't emit end before error on Node.js <= 12
Browse files Browse the repository at this point in the history
Fixes #1290
  • Loading branch information
szmarczak committed Jul 5, 2020
1 parent b51d836 commit f33e8bc
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
3 changes: 3 additions & 0 deletions source/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,9 @@ export default class Request extends Duplex implements RequestEvents<Request> {
// Force clean-up, because some packages (e.g. nock) don't do this.
request.destroy();

// Node.js <= 12.18.2 mistakenly emits the response `end` first.
(request as any).res.removeAllListeners('end');

if (error instanceof TimedOutTimeoutError) {
error = new TimeoutError(error, this.timings!, this);
} else {
Expand Down
27 changes: 27 additions & 0 deletions test/stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ const headersHandler: Handler = (request, response) => {
response.end(JSON.stringify(request.headers));
};

const infiniteHandler: Handler = (_request, response) => {
response.write('foobar');
};

test('`options.responseType` is ignored', withServer, async (t, server, got) => {
server.get('/', defaultHandler);

Expand Down Expand Up @@ -410,3 +414,26 @@ test('async iterator works', withServer, async (t, server, got) => {

t.is(Buffer.concat(chunks).toString(), payload);
});

if (process.versions.node.split('.')[0] <= '12') {
test('does not emit end event on error', withServer, async (t, server, got) => {
server.get('/', infiniteHandler);

await t.notThrowsAsync(new Promise((resolve, reject) => {
got.stream({
timeout: 100,
hooks: {
beforeError: [
async error => {
await new Promise(resolve => setTimeout(resolve, 50));

return error;
}
]
}
}).once('end', () => {
reject('Stream has ended before erroring');
}).once('error', resolve).resume();
}));
});
}

0 comments on commit f33e8bc

Please sign in to comment.