[whatwg/fetch] Conditional headers presense add `Cache-Control: no-cache` by default (Issue #1604)

### Context

I was testing conditional requests with the Node.js's implementation of fetch, and came across that behaviour:
When adding a conditional header to the request (`If-None-Match`), the following headers are automatically added:
- `Cache-Control: no-cache`
- `Pragma: no-cache`

This makes the reference Node.js server, Express, systematically return a `200` instead of a `304`.

The team rightly [redirected](https://github.com/nodejs/undici/issues/1930#issuecomment-1429598650) me to the spec, where I can indeed find this following behaviour described [here](https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):

> 16. If httpRequest’s [cache mode](https://fetch.spec.whatwg.org/#concept-request-cache-mode) is "default" and httpRequest’s [header list](https://fetch.spec.whatwg.org/#concept-request-header-list) [contains](https://fetch.spec.whatwg.org/#header-list-contains) `If-Modified-Since`, `If-None-Match`, `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set httpRequest’s [cache mode](https://fetch.spec.whatwg.org/#concept-request-cache-mode) to "no-store".
> 17. ...
> 18. If httpRequest’s [cache mode](https://fetch.spec.whatwg.org/#concept-request-cache-mode) is "no-store" or "reload", then:
    - If httpRequest’s [header list](https://fetch.spec.whatwg.org/#concept-request-header-list) [does not contain](https://fetch.spec.whatwg.org/#header-list-contains) `Pragma`, then [append](https://fetch.spec.whatwg.org/#concept-header-list-append) (`Pragma`, `no-cache`) to httpRequest’s [header list](https://fetch.spec.whatwg.org/#concept-request-header-list).
    - If httpRequest’s [header list](https://fetch.spec.whatwg.org/#concept-request-header-list) [does not contain](https://fetch.spec.whatwg.org/#header-list-contains) `Cache-Control`, then [append](https://fetch.spec.whatwg.org/#concept-header-list-append) (`Cache-Control`, `no-cache`) to httpRequest’s [header list](https://fetch.spec.whatwg.org/#concept-request-header-list).

### Question

As a developer perspective, it's counter intuitive to have some `no-cache` headers automatically added when the intention was to do a conditional request.

- Is it expected that developers systematically have to pass both Conditional and Cache-Control headers?
  - If so, what `Cache-Control` value should we use?
  - If not, what is the correct way to do conditional requests?

Thank you for any clarification you can bring.

-- 
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/fetch/issues/1604

You are receiving this because you are subscribed to this thread.

Message ID: <whatwg/fetch/issues/1604@github.com>

Received on Tuesday, 14 February 2023 13:48:57 UTC