Skip to content

Add Homebrew JSON API and bottle proxy support - #254

Open
andrew wants to merge 2 commits into
mainfrom
homebrew-proxy-247
Open

Add Homebrew JSON API and bottle proxy support#254
andrew wants to merge 2 commits into
mainfrom
homebrew-proxy-247

Conversation

@andrew

@andrew andrew commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Adds first-class Homebrew JSON API and bottle proxy support for #247.

Signed API responses are cached without rewriting. homebrew/core manifests and blobs are served offline from cache and checked against their content digests before cache records are written.

The API and artifact upstreams default to https://formulae.brew.sh/api and https://ghcr.io. Both can be configured through YAML or environment variables, so one proxy can use another proxy as its upstream.

Client setup and upstream configuration are documented in the README.

Closes #247

Copilot AI 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.

Pull request overview

Adds first-class proxying for Homebrew’s JSON API and homebrew/core OCI bottles, building on the existing metadata cache + OCI artifact store to support offline use while preserving signed API payload bytes and validating digest-addressed OCI content before caching.

Changes:

  • Adds /homebrew/* handler to proxy Homebrew JSON API responses (including signed JWS) with optional metadata caching.
  • Extends OCI /v2/* routing to support per-repository upstream registries (used to send homebrew/core to GHCR by default).
  • Adds digest verification for cached OCI blobs/manifests and expands validator handling (ETag/Last-Modified, HEAD behavior) across metadata + OCI manifest responses.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
README.md Documents Homebrew client configuration and upstream chaining.
internal/server/server.go Wires /homebrew routing and registers homebrew/core registry override for /v2.
internal/handler/homebrew.go New Homebrew JSON API handler and homebrew/core OCI registry registration helper.
internal/handler/homebrew_test.go Tests byte-for-byte signed response preservation, validators, offline stale serving, and path/method rejection.
internal/handler/handler.go Improves validator usage, HEAD behavior, and adds artifact digest verification before caching.
internal/handler/handler_test.go Updates mock storage hashing to SHA-256 to support new digest verification behavior.
internal/handler/container.go Adds per-repository registry routing and digest verification for blob fetches; improves HEAD response header handling.
internal/handler/container_test.go Adds tests for longest-prefix registry routing, credential non-forwarding, and digest mismatch non-caching.
internal/handler/container_manifest.go Adds registry-scoped manifest cache keys, Last-Modified handling, conditional 304 support, and manifest digest verification.
internal/config/config.go Adds configurable Homebrew API + artifact upstreams with defaults and env var support.
internal/config/config_test.go Verifies defaults + YAML/env loading for new Homebrew upstream config.
docs/configuration.md Documents new upstream config keys.
config.example.yaml Adds example Homebrew upstream configuration entries.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines 118 to 120
h.proxy.Logger.Info("container blob request", "name", name, "digest", digest)
registryURL := h.registryURLFor(name)

Comment on lines 190 to +191
h.proxy.Logger.Info("container manifest request", "name", name, "reference", reference)
h.serveManifest(w, r, name, reference)
h.serveManifest(w, r, h.registryURLFor(name), name, reference)
Comment on lines +55 to +56
accept := r.Header.Get("Accept")
h.proxy.ProxyCached(w, r, upstreamURL, homebrewMetadataEcosystem, homebrewMetadataCacheKey(requestPath, r.URL.RawQuery), accept)
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.

Add Homebrew JSON API and bottle proxy support

2 participants