Skip to content

Commit c81a611

Browse files
Fix error handling when UTF8 decoding fails (#2336)
Co-authored-by: Sindre Sorhus <[email protected]>
1 parent 897f385 commit c81a611

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

source/as-promise/index.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
type RequestError,
88
} from '../core/errors.js';
99
import Request from '../core/index.js';
10-
import {parseBody, isResponseOk, type Response} from '../core/response.js';
10+
import {parseBody, isResponseOk, type Response, ParseError} from '../core/response.js';
1111
import proxyEvents from '../core/utils/proxy-events.js';
1212
import type Options from '../core/options.js';
1313
import {CancelError, type CancelableRequest} from './types.js';
@@ -62,7 +62,12 @@ export default function asPromise<T>(firstRequest?: Request): CancelableRequest<
6262
response.body = parseBody(response, options.responseType, options.parseJson, options.encoding);
6363
} catch (error: any) {
6464
// Fall back to `utf8`
65-
response.body = response.rawBody.toString();
65+
try {
66+
response.body = response.rawBody.toString();
67+
} catch (error) {
68+
request._beforeError(new ParseError(error as Error, response));
69+
return;
70+
}
6671

6772
if (isResponseOk(response)) {
6873
request._beforeError(error);

test/error.ts

+17
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,23 @@ test('no uncaught parse errors #2', async t => {
343343
await close();
344344
});
345345

346+
test('no uncaught parse errors on fallback to utf8', withServer, async (t, server, got) => {
347+
server.get('/', (_request, response) => {
348+
const buffer = Buffer.alloc(536_870_912, 'A');
349+
response.statusCode = 200;
350+
response.end(buffer);
351+
});
352+
353+
await t.throwsAsync(got({
354+
timeout: {
355+
request: 60_000,
356+
},
357+
}), {
358+
instanceOf: RequestError,
359+
code: 'ERR_BODY_PARSE_FAILURE',
360+
});
361+
});
362+
346363
// Fails randomly on Node 10:
347364
// Blocked by https://github.com/istanbuljs/nyc/issues/619
348365
// eslint-disable-next-line ava/no-skip-test

0 commit comments

Comments
 (0)