Skip to content

Commit 6e1aeae

Browse files
committed
Got promise shouldn't retry when the body is a stream
Fixes #1382
1 parent 7e8898e commit 6e1aeae

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

source/as-promise/index.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {EventEmitter} from 'events';
2+
import is from '@sindresorhus/is';
23
import PCancelable = require('p-cancelable');
34
import {
45
NormalizedOptions,
@@ -128,7 +129,7 @@ export default function asPromise<T>(normalizedOptions: NormalizedOptions): Canc
128129
resolve(request.options.resolveBodyOnly ? response.body as T : response as unknown as T);
129130
});
130131

131-
request.once('error', async (error: RequestError) => {
132+
const onError = (error: RequestError) => {
132133
if (promise.isCanceled) {
133134
return;
134135
}
@@ -142,9 +143,16 @@ export default function asPromise<T>(normalizedOptions: NormalizedOptions): Canc
142143
}
143144

144145
reject(error);
145-
});
146+
};
147+
148+
request.once('error', onError);
149+
150+
request.once('retry', (newRetryCount: number, error: RequestError) => {
151+
if (is.nodeStream(error.request?.options.body)) {
152+
onError(error);
153+
return;
154+
}
146155

147-
request.once('retry', (newRetryCount: number) => {
148156
makeRequest(newRetryCount);
149157
});
150158

source/core/index.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,10 +1394,6 @@ export default class Request extends Duplex implements RequestEvents<Request> {
13941394
body.once('error', (error: NodeJS.ErrnoException) => {
13951395
this._beforeError(new UploadError(error, this));
13961396
});
1397-
1398-
body.once('end', () => {
1399-
delete options.body;
1400-
});
14011397
} else {
14021398
this._unlockWrite();
14031399

test/retry.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,3 +509,23 @@ test('throws when cannot retry a Got stream', withServer, async (t, server, got)
509509
t.is(error.response.body, 'not ok');
510510
t.is(globalRetryCount, 2);
511511
});
512+
513+
test('promise does not retry when body is a stream', withServer, async (t, server, got) => {
514+
server.post('/', (_request, response) => {
515+
response.statusCode = 500;
516+
response.end('not ok');
517+
});
518+
519+
const body = new PassThroughStream();
520+
body.end('hello');
521+
522+
const response = await got.post({
523+
retry: {
524+
methods: ['POST']
525+
},
526+
body,
527+
throwHttpErrors: false
528+
});
529+
530+
t.is(response.retryCount, 0);
531+
});

0 commit comments

Comments
 (0)