- From: Andrew Liu <notifications@github.com>
- Date: Thu, 12 Sep 2024 08:44:00 -0700
- To: whatwg/fetch <fetch@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/fetch/issues/1770/2346644945@github.com>
Alright, so I've documented some patterns from the three browsers. This is from making subsequent requests to the same URL that always returns an ETag but returns a random response status code. Below is the behavior of each browser if you make multiple requests to the same URL. I can't believe I'm saying this, but it's easier to describe the existing behavior using (semi-)normative language... # Chrome 1. Let _etag_ be the browser's stored ETag value. By default, _etag_ is null. 2. Let _sendIfNoneMatchHeaders_ be a boolean flag. By default, it is false. 3. Let _req_ be the HTTP request the browser is going to send. 4. If _sendIfNoneMatchHeaders_ is true and _etag_ is not null, then: 1. Set the `If-None-Match` headers of _req_ to be _etag_. 5. Send _req_ to the URL. 6. Let _res_ be the HTTP response from _req_. 7. Let _status_ be the HTTP status code from _res_. 8. Let _responseEtag_ be the contents of the `ETag` header from _res_. 9. If _status_ is 200, then: 1. If _etag_ null, then: 1. Set _etag_ to be _responseEtag_. 2. Set _sendIfNoneMatchHeaders_ to true. 10. If _status_ is not 200 or 206, then: 1. Set _sendIfNoneMatchHeaders_ to true. 11. Rinse and repeat. So the way Chrome works is that it'll start storing ETags once it gets a 200. And it'll keep sending the ETag as long as it keeps getting 200's or 206's from the same URL. If the "chain gets broken" by a non-200/206, getting another 200 response will allow the browser to continue sending the original ETag. # Firefox 1. Let _etag_ be the browser's stored ETag value. By default, _etag_ is null. 2. Let _neverSendIfNoneMatchHeadersEverAgain_ be a boolean flag. By default, it is false. 3. Let _req_ be the HTTP request the browser is going to send. 4. If _neverSendIfNoneMatchHeadersEverAgain_ is false and _etag_ is not null, then: 1. Set the `If-None-Match` headers of _req_ to be _etag_. 5. Send _req_ to the URL. 6. Let _res_ be the HTTP response from _req_. 7. Let _status_ be the HTTP status code from _res_. 8. Let _responseEtag_ be the contents of the `ETag` header from _res_. 9. If _status_ is 2xx and _etag_ is null, then: 1. Set _etag_ to be _responseEtag_. 10. If _status_ is not 2xx, then: 1. Set _neverSendIfNoneMatchHeadersEverAgain_ to true. 11. Rinse and repeat. Firefox seems to stop sending ETags indefinitely as soon as it receives a non-2xx from the server. But otherwise, it will save the ETag from a 2xx response and keep sending the ETag back as long as it has a 2xx response. # Safari 1. Let _etag_ be the browser's stored ETag value. By default, _etag_ is null. 2. Let _req_ be the HTTP request the browser is going to send. 3. If _etag_ is not null, then: 1. Set the `If-None-Match` headers of _req_ to be _etag_. 4. Send _req_ to the URL. 5. Let _res_ be the HTTP response from _req_. 6. Let _responseEtag_ be the contents of the `ETag` header from _res_. 7. Let _shouldClearEtag_ to be whether (_etag_ is not null). 8. Set _etag_ to be _responseEtag_. 9. If _shouldClearEtag_, then: 1. Set _etag_ to null. 10. Rinse and repeat. Safari is weird. It doesn't care about the response code. Rather, it seems that for every other request, it clears the ETag. -- Reply to this email directly or view it on GitHub: https://github.com/whatwg/fetch/issues/1770#issuecomment-2346644945 You are receiving this because you are subscribed to this thread. Message ID: <whatwg/fetch/issues/1770/2346644945@github.com>
Received on Thursday, 12 September 2024 15:44:04 UTC