arthurfiorette / axios-cache-interceptor

📬 Small and efficient cache interceptor for axios. Etag, Cache-Control, TTL, HTTP headers and more!

Home Page:https://axios-cache-interceptor.js.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Question: when exactly is `if-modified-since` sent?

birdspider opened this issue · comments

commented

What happened?

Hi,

a bit of a head scratcher (I'm probably missing something)

  1. canStale returns false if the response includes must-revalidate in cache-control header
  2. therefor the cache entry it is removed here once it gets stale
  3. updateStaleRequest (the only place where if-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.

commented

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"
  }
]
commented

update: this seems to be a firefox thing, chromium does set if-modified-since headers (or allows the cache interceptor to set them)

commented

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.