Question: when exactly is `if-modified-since` sent?
birdspider opened this issue · comments
What happened?
Hi,
a bit of a head scratcher (I'm probably missing something)
canStale
returns false if the response includesmust-revalidate
in cache-control header- therefor the cache entry it is removed here once it gets stale
updateStaleRequest
(the only place whereif-modified-since
header would be set) is never reached
Further, the guide states:
Use
If-Modified-Since
header in this request. Use a date to force a custom static value or true to use the last cached timestamp.
If this is not a bug, what constellation of axios, axios-cache-interceptor settings and response header must one use, to
get an if-modified-since
HIT on the remote?
I'll attach a "demo" but I probably isn't as useful as the description.
Run with php -S localhost:3000 axios-test.php
.
https://gist.github.com/birdspider/2e1823acf46145b99d20a39d7861f2da
axios-cache-interceptor version
1.3.1
Node / Browser Version
Firefox, Chrome, Linux
Axios Version
1.4.1
What storage is being used
Memory Storage
Relevant debugging log output
I don't know how to enable debug mode when using simple cdn scripts.
I don't know how to enable debug mode when using simple cdn scripts.
https://axios-cache-interceptor.js.org/guide/getting-started#install-axios-cache-interceptor
Please attach debug logs.
my bad, I didn't see that /dev
is just a folder
[
"no cache, first",
{
"id": "-87358114",
"msg": "Sending request, waiting for response",
"data": {
"overrideCache": false,
"state": "empty"
}
},
{
"id": "-87358114",
"msg": "Cache header interpreted as 'dont cache'",
"data": {
"cache": {
"state": "loading",
"previous": "empty"
},
"response": {
"data": {
"data": [
"test"
]
},
"status": 200,
"statusText": "OK",
"headers": {
"age": "0",
"cache-control": "no-store",
"connection": "close",
"content-type": "application/json",
"date": "Thu, 05 Oct 2023 22:00:47 GMT",
"host": "localhost:3000",
"last-modified": "Thu, 05 Oct 2023 22:00:42 GMT",
"x-powered-by": "PHP/8.2.11",
"x-axios-cache-last-modified": "use-cache-timestamp"
},
"config": {
"transitional": {
"silentJSONParsing": true,
"forcedJSONParsing": true,
"clarifyTimeoutError": false
},
"adapter": [
"xhr",
"http"
],
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1,
"maxBodyLength": -1,
"env": {},
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": null
},
"baseURL": "http://localhost:3000",
"withCredentials": true,
"cache": {
"update": {},
"ttl": 300000,
"methods": [
"get",
"head"
],
"cachePredicate": {},
"etag": true,
"modifiedSince": true,
"interpretHeader": true,
"cacheTakeover": false,
"staleIfError": true,
"override": false
},
"method": "get",
"url": "/?id=3",
"id": "-87358114"
},
"request": {},
"id": "-87358114",
"cached": false
},
"expirationTime": "dont cache"
}
},
"no cache, again",
{
"id": "-87358114",
"msg": "Sending request, waiting for response",
"data": {
"overrideCache": false,
"state": "empty"
}
},
{
"id": "-87358114",
"msg": "Cache header interpreted as 'dont cache'",
"data": {
"cache": {
"state": "loading",
"previous": "empty"
},
"response": {
"data": {
"data": [
"test"
]
},
"status": 200,
"statusText": "OK",
"headers": {
"age": "0",
"cache-control": "no-store",
"connection": "close",
"content-type": "application/json",
"date": "Thu, 05 Oct 2023 22:00:47 GMT",
"host": "localhost:3000",
"last-modified": "Thu, 05 Oct 2023 22:00:42 GMT",
"x-powered-by": "PHP/8.2.11",
"x-axios-cache-last-modified": "use-cache-timestamp"
},
"config": {
"transitional": {
"silentJSONParsing": true,
"forcedJSONParsing": true,
"clarifyTimeoutError": false
},
"adapter": [
"xhr",
"http"
],
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1,
"maxBodyLength": -1,
"env": {},
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": null
},
"baseURL": "http://localhost:3000",
"withCredentials": true,
"cache": {
"update": {},
"ttl": 300000,
"methods": [
"get",
"head"
],
"cachePredicate": {},
"etag": true,
"modifiedSince": true,
"interpretHeader": true,
"cacheTakeover": false,
"staleIfError": true,
"override": false
},
"method": "get",
"url": "/?id=3",
"id": "-87358114"
},
"request": {},
"id": "-87358114",
"cached": false
},
"expirationTime": "dont cache"
}
},
"with cache, first",
{
"id": "-87350695",
"msg": "Sending request, waiting for response",
"data": {
"overrideCache": false,
"state": "empty"
}
},
{
"id": "-87350695",
"msg": "Useful response configuration found",
"data": {
"cacheConfig": {
"update": {},
"ttl": 300000,
"methods": [
"get",
"head"
],
"cachePredicate": {},
"etag": true,
"modifiedSince": true,
"interpretHeader": true,
"cacheTakeover": false,
"staleIfError": true,
"override": false
},
"cacheResponse": {
"data": {
"data": [
"test"
]
},
"status": 200,
"statusText": "OK",
"headers": {
"age": "0",
"cache-control": "max-age:5, must-revalidate, private",
"connection": "close",
"content-type": "application/json",
"date": "Thu, 05 Oct 2023 22:00:47 GMT",
"host": "localhost:3000",
"last-modified": "Thu, 05 Oct 2023 22:00:42 GMT",
"x-powered-by": "PHP/8.2.11",
"x-axios-cache-last-modified": "use-cache-timestamp",
"x-axios-cache-stale-if-error": "300000"
}
}
}
},
{
"id": "-87350695",
"msg": "Found waiting deferred(s) and resolved them"
},
{
"id": "-87350695",
"msg": "Response cached",
"data": {
"cache": {
"state": "cached",
"ttl": 300000,
"createdAt": 1696543247352,
"data": {
"data": {
"data": [
"test"
]
},
"status": 200,
"statusText": "OK",
"headers": {
"age": "0",
"cache-control": "max-age:5, must-revalidate, private",
"connection": "close",
"content-type": "application/json",
"date": "Thu, 05 Oct 2023 22:00:47 GMT",
"host": "localhost:3000",
"last-modified": "Thu, 05 Oct 2023 22:00:42 GMT",
"x-powered-by": "PHP/8.2.11",
"x-axios-cache-last-modified": "use-cache-timestamp",
"x-axios-cache-stale-if-error": "300000"
}
}
},
"response": {
"data": {
"data": [
"test"
]
},
"status": 200,
"statusText": "OK",
"headers": {
"age": "0",
"cache-control": "max-age:5, must-revalidate, private",
"connection": "close",
"content-type": "application/json",
"date": "Thu, 05 Oct 2023 22:00:47 GMT",
"host": "localhost:3000",
"last-modified": "Thu, 05 Oct 2023 22:00:42 GMT",
"x-powered-by": "PHP/8.2.11",
"x-axios-cache-last-modified": "use-cache-timestamp",
"x-axios-cache-stale-if-error": "300000"
},
"config": {
"transitional": {
"silentJSONParsing": true,
"forcedJSONParsing": true,
"clarifyTimeoutError": false
},
"adapter": [
"xhr",
"http"
],
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1,
"maxBodyLength": -1,
"env": {},
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": null
},
"baseURL": "http://localhost:3000",
"withCredentials": true,
"cache": {
"update": {},
"ttl": 300000,
"methods": [
"get",
"head"
],
"cachePredicate": {},
"etag": true,
"modifiedSince": true,
"interpretHeader": true,
"cacheTakeover": false,
"staleIfError": true,
"override": false
},
"method": "get",
"url": "/?id=4",
"id": "-87350695"
},
"request": {},
"id": "-87350695",
"cached": false
}
}
},
{
"data": [
"test"
]
},
"with cache, again",
{
"id": "-87350695",
"msg": "Returning cached response"
},
{
"id": "-87350695",
"msg": "Returned cached response"
},
"with cache, again after 10s",
{
"id": "-87350695",
"msg": "Returning cached response"
},
{
"id": "-87350695",
"msg": "Returned cached response"
}
]
update: this seems to be a firefox thing, chromium does set if-modified-since
headers (or allows the cache interceptor to set them)
update2: chrome https://bugs.chromium.org/p/chromium/issues/detail?id=1086809 does not show 304 in the status column but 200
As it stands, I do not think to have found a bug. Instead I found inconsistencies in FF cache handling and display issues in Chrome, I'll close this.