feat: forward Accept header and fix Content-Type for Docker proxying #62

Merged
benvin merged 1 commits from benvin/docker-accept-header into master 2026-06-27 00:45:24 +10:00
Owner

Problems

  1. Docker daemon sends specific Accept headers to negotiate manifest format, but the proxy dropped them — registries defaulted to OCI format, causing "mediaType should be manifest.v2+json not oci.image.index" errors
  2. Upstream Content-Type was only used when the provider returned "application/octet-stream" — Docker manifests got the wrong Content-Type

Fixes

  • Forward client Accept header to upstream (both initial request and Bearer token retry)
  • Always prefer upstream Content-Type when present
  • Fetch signature now accepts variadic clientHeaders for backwards compat

E2E tested

  • DockerHub: redis:7-alpine, alpine:3 — skopeo inspect OK
  • GHCR: OCI-only images work with docker pull (GHCR 404s Docker v2 Accept, which is expected)
  • Quay: prometheus/node-exporter — skopeo inspect OK
## Problems 1. Docker daemon sends specific Accept headers to negotiate manifest format, but the proxy dropped them — registries defaulted to OCI format, causing "mediaType should be manifest.v2+json not oci.image.index" errors 2. Upstream Content-Type was only used when the provider returned "application/octet-stream" — Docker manifests got the wrong Content-Type ## Fixes - Forward client Accept header to upstream (both initial request and Bearer token retry) - Always prefer upstream Content-Type when present - Fetch signature now accepts variadic clientHeaders for backwards compat ## E2E tested - DockerHub: redis:7-alpine, alpine:3 — skopeo inspect OK - GHCR: OCI-only images work with docker pull (GHCR 404s Docker v2 Accept, which is expected) - Quay: prometheus/node-exporter — skopeo inspect OK
unkinben added 1 commit 2026-06-27 00:43:17 +10:00
feat: forward Accept header and fix Content-Type for Docker proxying
ci/woodpecker/pr/build Pipeline failed
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
dc34d6669d
Two fixes for Docker registry compatibility:

1. Forward the client's Accept header to upstream registries. Docker
   clients send specific Accept headers to negotiate manifest format
   (Docker v2 vs OCI). Without forwarding, registries default to OCI
   format which older Docker daemons reject.

2. Always prefer upstream's Content-Type over the provider's default.
   The provider hardcodes manifest types but upstream may return a
   different format (e.g. OCI index vs Docker manifest list).

Tested with skopeo against DockerHub, GHCR, and Quay registries.
benvin merged commit 9eba49500c into master 2026-06-27 00:45:24 +10:00
benvin deleted branch benvin/docker-accept-header 2026-06-27 00:45:24 +10:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: unkin/artifactapi#62