- From: Chris Zuber <notifications@github.com>
- Date: Sun, 02 Jul 2023 20:08:25 -0700
- To: whatwg/fetch <fetch@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/fetch/issues/1683@github.com>
As an extension and counter to #1679 I propose adding fetch assertions.
## Example
```js
try {
const resp = await fetch(url, {
headers: { Accept: 'application/json' },
assert: {
ok: true,
acceptable: true,
/* ... */
}
});
// Handle response, knowing already it's `ok` and JSON (per Accept and Content-Type headers)
} catch(err) {
// Handle error
}
```
## Reasoning
- Many languages/libraries regard 4xx & 5xx statuses as errors (error statuses)
- Many devs (esp inexperienced) assume `fetch()` throws under conditions in which it does not
- There is precedent for throwing under certain conditions (eg ` signal` or `integrity`)
- We can already assume errors based on the mismatch of the Accept & Content-Type headers (here the matching is `acceptable`)
- This potentially allows for arbitrary error conditions
- This is backwards compatible, though checking status and headers where not supported kinda defeats the purpose (where not supported, `assert` it's ignored and checks still have to be made, but it's a single thing to polyfill)
- It can be extended to include other assertions in a backwards-compatible way
- It allows for more meaningful errors
- It can close a connection early in the event that an assertion fails (a potential `maxContentLength` comes to mind, probably as an additional option)
- taking `integrity` as example (which is probably duplicated in functionality here), this provides additional error conditions where the response isn't what the dev expected
- It provides for a new type of error (maybe HTTPError or FetchAssertionError) without conflicting with current usage
- In the case of `maxContentLength`, this could be used to avoid excessive data usage on slow/mobile connections
- In general, there are many ways in which we should know early that `fetch()` results in an error based solely on the response + headers but can't currently throw and close
- It does not preclude a new error type which has access to response status + headers + body, which may be important to certain errors (e.g. a 500 "Internal Server Error" that often responds with HTML instead of JSON and is the actually relevant error)
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/fetch/issues/1683
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/fetch/issues/1683@github.com>
Received on Monday, 3 July 2023 03:08:31 UTC