Skip to content

feat(git): forward snapshot ETag and support HEAD requests#337

Merged
alecthomas merged 1 commit into
mainfrom
fix/git-snapshot-etag-header
Jun 22, 2026
Merged

feat(git): forward snapshot ETag and support HEAD requests#337
alecthomas merged 1 commit into
mainfrom
fix/git-snapshot-etag-header

Conversation

@alecthomas

Copy link
Copy Markdown
Collaborator

The common bundle-serving path (serveSnapshotWithBundle) dropped the cached ETag and Content-Length, so clients could not revalidate snapshots. Forward both validators via a shared applySnapshotCacheHeaders helper.

Add HEAD support backed by the cache's Stat() so probes never read or generate the body, or warm up a mirror. HEAD reports the ETag, Content-Length and snapshot commit, returns 404 when uncached, and honours If-None-Match/If-Match via the now-exported CheckConditionals helper.

Closes #334

The common bundle-serving path (serveSnapshotWithBundle) dropped the cached ETag and Content-Length, so clients could not revalidate snapshots. Forward both validators via a shared applySnapshotCacheHeaders helper.

Add HEAD support backed by the cache's Stat() so probes never read or generate the body, or warm up a mirror. HEAD reports the ETag, Content-Length and snapshot commit, returns 404 when uncached, and honours If-None-Match/If-Match via the now-exported CheckConditionals helper.

Closes #334
@alecthomas alecthomas requested a review from a team as a code owner June 22, 2026 03:28
@alecthomas alecthomas requested review from stuartwdouglas and removed request for a team June 22, 2026 03:28
@alecthomas alecthomas enabled auto-merge (squash) June 22, 2026 03:28
@alecthomas alecthomas merged commit 7fa4c99 into main Jun 22, 2026
8 checks passed
@alecthomas alecthomas deleted the fix/git-snapshot-etag-header branch June 22, 2026 03:31

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b6bb63b581

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread internal/strategy/git/snapshot.go
alecthomas added a commit that referenced this pull request Jun 22, 2026
serveSnapshotWithBundle advertises the snapshot ETag but, for cache
backends that return non-*os.File readers (S3, memory, remote tier),
fell through to io.Copy and never evaluated If-None-Match/If-Match. A
revalidating client therefore received a full 200 body instead of 304.

Evaluate strategy.CheckConditionals after applying the cached headers
and before streaming, short-circuiting to 304/412 for all reader types.
File-backed readers already got this via http.ServeContent.

Addresses Codex review feedback on #337.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Emit ETag on the main git snapshot serving path

1 participant