Releases: sindresorhus/got
v15.0.2
v15.0.1
v15.0.0
Breaking changes
- Require Node.js 22 b933476
- Remove promise cancel API a06ac6c
promise.cancel()is gone. Use thesignaloption withAbortControllerinstead.
- Remove
isStreamoption c241c6c- Use
got.stream()directly.
- Use
- Use native
FormDataglobal 670b228- Use the Web API
FormDataglobal directly (available in Node.js 18+).
- Use the Web API
responseType: 'buffer'returnsUint8Arrayinstead ofBuffer309e36dresponse.rawBodyandpromise.buffer()now return aUint8Array.Bufferis a subclass ofUint8Array, so most code will continue to work, but strict type checks will need updating.
strictContentLengthdefaults totrue08e9dff- Got now throws a
ContentLengthMismatchErrorby default ifContent-Lengthdoesn't match the actual body size. Set{strictContentLength: false}to restore the old behavior.
- Got now throws a
retry.enforceRetryRulesdefaults totrue9bc8dfb- Custom
calculateDelayfunctions are now only called when a retry is actually allowed bylimit,methods,statusCodes, anderrorCodes. If yourcalculateDelaywas previously used to override retry eligibility unconditionally, set{retry: {enforceRetryRules: false}}.
- Custom
- Piped header copying is now opt-in 8e392f3
- Got no longer automatically copies headers from a piped stream. Set
{copyPipedHeaders: true}to re-enable. Hop-by-hop headers are never copied even when enabled (RFC 9110 §7.6.1).
- Got no longer automatically copies headers from a piped stream. Set
urlremoved from public options objects 87de8d6- The
urlproperty is no longer present on the options object passed to hooks. Useresponse.urlorrequest.requestUrlinstead.
- The
- 300 and 304 responses are no longer auto-followed 5fccaab
- Per RFC 9110, 304 is a conditional-GET hint, not a redirect, and 300 is only a SHOULD for user agents. Got now returns these responses as-is. Handle them manually if needed.
- Removed the undocumented named export for Got.
- Got has always been a default export. The named export was there only for buggy build tools during the ESM migration times.
Improvements
- Stream decode large
text/jsonbodies incrementally for lower peak memory usage c9a95b1 uploadProgressnow emits granular per-chunk events forjsonandformrequest bodies 13c889d
Migration guide
Replace promise.cancel() with AbortController
Before:
const promise = got(url);
promise.cancel();After:
const controller = new AbortController();
const promise = got(url, {signal: controller.signal});
controller.abort();Replace isStream: true with got.stream()
Before:
got(url, {isStream: true});After:
got.stream(url);Replace form-data / form-data-encoder with native FormData
Before:
import {FormData} from 'formdata-node';
// or: import {FormData} from 'formdata-polyfill/esm.min.js';
const form = new FormData();
form.set('name', 'value');
await got.post(url, {body: form});After:
const form = new FormData();
form.set('name', 'value');
await got.post(url, {body: form});Update Buffer usage to Uint8Array
response.rawBody and promise.buffer() now return Uint8Array instead of Buffer.
Before:
const data = await got(url).buffer();
const copy = Buffer.from(data);After:
const data = await got(url).buffer();
const copy = new Uint8Array(data);If you need Buffer-specific APIs, wrap with Buffer.from(data.buffer, data.byteOffset, data.byteLength).
strictContentLength is now on by default
If you send requests where the Content-Length header might not match the actual body size, opt out:
got.extend({strictContentLength: false});retry.enforceRetryRules is now on by default
If your calculateDelay function was overriding retry eligibility (e.g. retrying on methods or status codes outside the defaults), opt out:
got.extend({
retry: {
enforceRetryRules: false,
calculateDelay: ({computedValue}) => {
// computedValue is 0 when retry is not allowed
if (computedValue === 0) {
return 0;
}
return computedValue;
},
},
});Piped header copying is now opt-in
If you pipe streams into Got and rely on automatic header forwarding (e.g. Content-Type), re-enable it:
got.extend({copyPipedHeaders: true});300 and 304 responses are no longer followed
If your code depended on Got auto-following 300 Multi-Choice or handling 304 Not Modified as a redirect, you now need to handle them yourself in an afterResponse hook or check response.statusCode manually.
v14.6.6
- Fix stream auto-end for empty PATCH/DELETE/OPTIONS 4d5168c
- The bug was introduced in b65b0e1, where it incorrectly auto-closed streams for empty PATCH/DELETE/OPTIONS when using streams. This broke the documented use case of piping data to a got stream for these methods.
- Docs:
got.streamdoes not auto-end forOPTIONS,DELETE, orPATCHso you can pipe or write a body without gettingwrite after end. Callstream.end()when you are not piping a body.
v14.6.5
v14.6.4
v14.6.3
v14.6.2
v14.6.1
v14.6.0
Improvements
- Add
beforeCachehook 1c3a041 - Add
retryCounttobeforeRequesthook context 91cdc48 - Improve
HTTPErrormessage to include method and URL 6dd7574 - Add support for typed arrays as request body ecf5633
- Add Node.js diagnostic channel support 3e2a781
- Allow custom Error classes in
beforeErrorhook 1c71194 - Add zstd (Zstandard) compression support 449833a
- Improve validation error messages by including option names f5c54a3
- Add
strictContentLengthoption 4206f0e - Add support for
https.secureOptionsoption 7ec1714 - Add
copyPipedHeadersoption to control automatic header copying from piped streams d83dadd - Add
stream.isReadonlyproperty to detect read-only streams 030dfbb
Fixes
- Fix HTTP/2 timings NaN issue 398c11a
- Fix shortcut methods ignoring handler errors f004564
- Fix body reassignment in
beforeRetryhooks bf84d36 - Fix
beforeErrorhook not being called forERR_UNSUPPORTED_PROTOCOLerror fb86418 - FIx preserving
prefixUrlin hooks 9725fbd - Fix race condition causing retry after promise settles 1e49781
- Fix stream validation errors causing unhandled rejections 2527bf6
- Fix incorrect
content-lengthwhen piping decompressed responses 30b3b79 - Fix EPIPE errors bypassing retry logic in Promise API 6ae3e7f
- Fix silent hang when returning cached response with FormData body from beforeRequest hook e09a9bd
- Fix hook type definitions to reflect normalized runtime state 6a544a3
- Fix
afterResponsehook validation to allownullbody values 60a4419 - Fix DNS timing being non-zero when connecting to IP addresses 3d66aec
- Fix
timings.endbeing undefined when stream is destroyed before completion 4e75679 - Fix properly treating different UNIX socket paths as different origins e5659d4
Meta
I managed to get it almost down to zero issues! 🎉