Skip to content

Commit 226cc39

Browse files
committedJul 12, 2021
Fix Cannot call end error when request returns a Writable
1 parent c0b5346 commit 226cc39

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed
 

‎source/core/index.ts

+6
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,12 @@ export default class Request extends Duplex implements RequestEvents<Request> {
467467
}
468468

469469
this._request.end((error?: Error | null) => {
470+
// The request has been destroyed before `_final` finished.
471+
// See https://github.com/nodejs/node/issues/39356
472+
if ((this._request as any)._writableState?.errored) {
473+
return;
474+
}
475+
470476
if (!error) {
471477
this._bodySize = this._uploadedSize;
472478

‎test/stream.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {promisify} from 'util';
22
import fs from 'fs';
33
import {Agent as HttpAgent} from 'http';
4-
import stream, {PassThrough as PassThroughStream, Readable as ReadableStream} from 'stream';
4+
import stream, {PassThrough as PassThroughStream, Readable as ReadableStream, Writable} from 'stream';
55
import {Readable as Readable2} from 'readable-stream';
66
import test from 'ava';
77
import {Handler} from 'express';
@@ -497,6 +497,20 @@ test('accepts readable-stream as body', withServer, async (t, server, got) => {
497497
t.is(response.body, 'ok');
498498
});
499499

500+
test('prevents `Cannot call end` error', async t => {
501+
const stream = got.stream('https://example.com', {
502+
request: () => new Writable({
503+
final() {}
504+
}) as any,
505+
timeout: {
506+
request: 1
507+
}
508+
});
509+
510+
const error: RequestError = await pEvent(stream, 'error');
511+
t.is(error.code, 'ETIMEDOUT');
512+
});
513+
500514
if (Number.parseInt(process.versions.node.split('.')[0]!, 10) <= 12) {
501515
test('does not emit end event on error', withServer, async (t, server, got) => {
502516
server.get('/', infiniteHandler);

0 commit comments

Comments
 (0)
Please sign in to comment.