I’m having a Worker serving requests to https://example.com/foo.json
by doing a fetch under the hood, to proxy the request to my origin server and respond back to the client, while also caching the response.
The code is this:
export default {
async fetch(request) {
const url = new URL(request.url);
const cacheKey = `https://${url.hostname}${url.pathname}`;
// prepare request to proxy to origin
const headers = new Headers(request.headers);
headers.set("foo", url.host);
url.host = "originserver.com"
let response = await fetch(url.toString(), {
cf: {
cacheKey: cacheKey,
cacheTtl: 3600,
cacheEverything: true,
cacheTtlByStatus: {
'100-199': 0,
'200-299': 3600,
'300-599': 0,
}
},
headers: headers,
});
response = new Response(response.body, response);
return response;
},
};
Now, this works properly AFAICT: I see CF-Cache-Status: HIT
and Last-Modified: <a date in the past>
in my requests to https://example.com/foo
.
However, I now want to purge that fetch cache by URL/single-file, via the API. So in my understanding, I should execute the following:
$ curl -s -X POST "https://api.cloudflare.com/client/v4/zones/xxx/purge_cache" -H "Authorization: Bearer xxx" -H "Content-Type: application/json" -d '{"files":["https://originserver.com/foo.json"]}'
# or maybe
$ curl -s -X POST "https://api.cloudflare.com/client/v4/zones/xxx/purge_cache" -H "Authorization: Bearer xxx" -H "Content-Type: application/json" -d '{"files":[{"url":"https://originserver.com/foo.json", "headers": {"foo": "example.com"}}]}'
Both of these requests seem successful:
{
"success": true,
"errors": [],
"messages": [],
"result": {
"id": "xxxxxx"
}
}
However, when I re-request the original URL from my terminal, I still see a CF-Cache-Status: HIT
and Last-Modified
being unchanged from the initial requests.
I think I’m misunderstanding something on how cache purging should work in my case (i.e. Workers fetch cache, using a custom cache key). Is what I’m doing supposed to work?
Thanks in advance