From 03834673891ca46e3977212b2a72e318d7470483 Mon Sep 17 00:00:00 2001 From: Joshua Noble Date: Fri, 26 Jul 2024 16:51:21 -0400 Subject: [PATCH] fix(gateway): Cache-Control header for UnixFS directories --- CHANGELOG.md | 1 + gateway/handler_unixfs_dir.go | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cf7a40ae..7591e53a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ The following emojis are used to highlight certain changes: - `bitswap/server` minor memory use and performance improvements - `bitswap` unify logger names to use uniform format bitswap/path/pkgname +- `gateway` now always returns meaningful cache-control headers for generated HTML listings of UnixFS directories ### Removed diff --git a/gateway/handler_unixfs_dir.go b/gateway/handler_unixfs_dir.go index 7a49dcafc..1878e682d 100644 --- a/gateway/handler_unixfs_dir.go +++ b/gateway/handler_unixfs_dir.go @@ -136,9 +136,14 @@ func (i *handler) serveDirectory(ctx context.Context, w http.ResponseWriter, r * dirEtag := getDirListingEtag(resolvedPath.RootCid()) w.Header().Set("Etag", dirEtag) - // Add TTL if known. + // Set Cache-Control if rq.ttl > 0 { - w.Header().Set("Cache-Control", fmt.Sprintf("public, max-age=%d", int(rq.ttl.Seconds()))) + // Use known TTL from IPNS Record or DNSLink TXT Record + w.Header().Set("Cache-Control", fmt.Sprintf("public, max-age=%d, stale-while-revalidate=2678400", int(rq.ttl.Seconds()))) + } else { + // Cache for 1 week, serve stale cache for up to a month + // (style of generated HTML may change, should not be cached forever) + w.Header().Set("Cache-Control", "public, max-age=604800, stale-while-revalidate=2678400") } if r.Method == http.MethodHead {