Validation doesn't work
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- À l'abandon
- Stack technique
- go
- Domaine
- backend, performance
Piste de recherche
Commencez par exécuter la reproduction Caddyfile et comparer la requête upstream effectuée par les deux commandes curl. Suivez le point d’entrée de validation/révalidation du cache dans le module Go et vérifiez que les métadonnées Last-Modified stockées sont envoyées comme une requête conditionnelle ; c’est terminé lorsque l’upstream reçoit la condition et que le comportement de la réponse correspond à la validation HTTP.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
According to clause No. 4.3 of RFC 7234:
4.3. Validation
When a cache has one or more stored responses for a requested URI, but cannot serve any of them (e.g., because they are not fresh, or one cannot be selected; see Section 4.1), it can use the conditional request mechanism
...
This process is known as "validating" or "revalidating" the stored response.
4.3.1. Sending a Validation Request
When sending a conditional request for cache validation, a cache sends one or more precondition header fields containing validator metadata from its stored response(s), which is then compared by recipients to determine whether a stored response is equivalent to a current representation of the resource.
One such validator is the timestamp given in a Last-Modified header field...
Another validator is the entity-tag given in an ETag header field...
Thus, I expect caddy to cache the first response and subsequently validate cached data via a conditional request. However, caddy simply forwards a request to an upstream without any conditions.
I've tested it only with Last-Modified and no-cache, because of the bug I noticed with ETag. Additionally, I couldn't trigger revalidation using other directives like must-revalidate and stale-while-revalidate.
Reproduction steps:
{
log
cache {
stale 60s
}
}
http://localhost:80 {
log
cache
reverse_proxy http://localhost:81
}
http://localhost:81 {
log
header Last-Modified "Mon, 15 Dec 2025 08:52:20 GMT"
header Cache-Control "no-cache"
respond "Hello world"
}
$ curl -ik localhost:80
HTTP/1.1 200 OK
Cache-Control: no-cache
Cache-Status: Souin; fwd=uri-miss; stored; key=GET-http-localhost-/
Last-Modified: Mon, 15 Dec 2025 08:52:20 GMT
...
$ curl -ik localhost:80
HTTP/1.1 200 OK
Cache-Control: no-cache
Cache-Status: Souin; fwd=request; fwd-status=200; key=GET-http-localhost-/; detail=REQUEST-REVALIDATION
Last-Modified: Mon, 15 Dec 2025 08:52:20 GMT
...
logs:
{"level":"info","ts":1766736377.4338582,"logger":"http.log.access","msg":"handled request","request":{"remote_ip":"127.0.0.1","remote_port":"48850","client_ip":"127.0.0.1","proto":"HTTP/1.1","method":"GET","host":"localhost","uri":"/","headers":{"X-Forwarded-Proto":["http"],"Accept-Encoding":["gzip"],"Accept":["*/*"],"Date":["Fri, 26 Dec 2025 08:06:17 UTC"],"Via":["1.1 Caddy"],"X-Forwarded-Host":["localhost"],"User-Agent":["curl/8.7.1"],"X-Forwarded-For":["172.16.249.1"]}},"bytes_read":0,"user_id":"","duration":0.000199667,"size":11,"status":200,"resp_headers":{"Content-Type":["text/plain; charset=utf-8"],"Server":["Caddy"],"Last-Modified":["Mon, 15 Dec 2025 08:52:20 GMT"],"Cache-Control":["no-cache"]}}
{"level":"info","ts":1766736377.4560177,"logger":"http.log.access","msg":"handled request","request":{"remote_ip":"172.16.249.1","remote_port":"57879","client_ip":"172.16.249.1","proto":"HTTP/1.1","method":"GET","host":"localhost","uri":"/","headers":{"User-Agent":["curl/8.7.1"],"Accept":["*/*"]}},"bytes_read":0,"user_id":"","duration":0.023146958,"size":11,"status":200,"resp_headers":{"Last-Modified":["Mon, 15 Dec 2025 08:52:20 GMT"],"Server":["Caddy"],"Content-Length":["11"],"Via":["1.1 Caddy"],"Date":["Fri, 26 Dec 2025 08:06:17 GMT"],"Cache-Control":["no-cache"],"Content-Type":["text/plain; charset=utf-8"],"Cache-Status":["Souin; fwd=uri-miss; stored; key=GET-http-localhost-/"]}}
{"level":"info","ts":1766736406.6892934,"logger":"http.log.access","msg":"handled request","request":{"remote_ip":"127.0.0.1","remote_port":"48850","client_ip":"127.0.0.1","proto":"HTTP/1.1","method":"GET","host":"localhost","uri":"/","headers":{"X-Forwarded-For":["172.16.249.1"],"X-Forwarded-Host":["localhost"],"X-Forwarded-Proto":["http"],"Accept":["*/*"],"Date":["Fri, 26 Dec 2025 08:06:46 UTC"],"Via":["1.1 Caddy"],"Accept-Encoding":["gzip"],"User-Agent":["curl/8.7.1"]}},"bytes_read":0,"user_id":"","duration":0.000023417,"size":11,"status":200,"resp_headers":{"Server":["Caddy"],"Last-Modified":["Mon, 15 Dec 2025 08:52:20 GMT"],"Cache-Control":["no-cache"],"Content-Type":["text/plain; charset=utf-8"]}}
{"level":"info","ts":1766736406.6932402,"logger":"http.log.access","msg":"handled request","request":{"remote_ip":"172.16.249.1","remote_port":"57892","client_ip":"172.16.249.1","proto":"HTTP/1.1","method":"GET","host":"localhost","uri":"/","headers":{"Accept":["*/*"],"User-Agent":["curl/8.7.1"]}},"bytes_read":0,"user_id":"","duration":0.019553791,"size":11,"status":200,"resp_headers":{"Content-Length":["11"],"Last-Modified":["Mon, 15 Dec 2025 08:52:20 GMT"],"Via":["1.1 Caddy"],"Cache-Control":["no-cache"],"Content-Type":["text/plain; charset=utf-8"],"Cache-Status":["Souin; fwd=request; fwd-status=200; key=GET-http-localhost-/; detail=REQUEST-REVALIDATION"],"Server":["Caddy"],"Date":["Fri, 26 Dec 2025 08:06:46 GMT"]}}
As we may see, the request made by caddy is not conditional.
- Langage dominant
- Go
- Étoiles
- 393
- Forks
- 30
- Merge moyen
- 32 min
- PR mergées (30 j)
- 1
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de caddyserver/cache-handler
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
caddyserver/cache-handler#138 · 1 commentaire · 3 réactions ·
-
Difficulté 3/5 Une demi-journée Accessibilité débutants 45/100
caddyserver/cache-handler#146 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
caddyserver/cache-handler#145 ·
-
Admin API purge/invalidation still panics with nil pointer on v0.16.0 (same root cause as #140)Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 76/100
caddyserver/cache-handler#143 · 2 commentaires ·
-
Can not flush cacheOuverte
Difficulté 3/5 1-2 jours Accessibilité débutants 55/100
caddyserver/cache-handler#140 · 4 commentaires · 1 réaction ·
Toutes les issues de caddyserver/cache-handler
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
scaleway/scaleway-cli#6492 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
taskcluster/taskcluster#9284 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Review backlog (docs-currency): operator-reference.md dependency-bot sweep paragraph does not mention the transient-triage wordingPeut-être pris @hivecommons-hive l’a pris aujourd’hui. Ouverteagent/reviewer approved-direction help wanted hive/claimed-by-scanner
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
hivecommons/hive#13025 · 7 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
fluxcd/go-git-providers#329 ·