Skip to content

Transfer Capabilities

Based on current code in src/handlers/docker.go and src/handlers/github.go.

HubProxy fetches manifests and blobs via go-containerregistry, then returns them over HTTP.

Capability Supported Notes
Manifest cache GET cached; digest 24h, latest etc. 10m
Token cache Upstream expires_in driven
Multi-registry paths e.g. example.com/ghcr.io/owner/image:tag
containerd ns param Matches [registries] entries
Auth realm rewrite Upstream token → HubProxy /token
HTTP Range / in-layer resume Blobs always fetched fully; client Range ignored
Layer-level retry Docker/containerd retries failed layers

The GitHub proxy (proxyGitHubWithRedirect) forwards all client request headers (including Range) upstream and passes through status codes and response headers (Content-Range, Accept-Ranges, etc.) before streaming the body.

Capability Supported Notes
Streaming Direct io.Copy for normal files
HTTP Range / resume wget -c, curl -C -; 206 responses passed through
Multi-connection Range aria2-style parallel chunks (if upstream supports Range)
Redirects Max 20; GitHub Location URLs rewritten
HTML block text/html etc. → 403
File size limit [server].fileSize, default 2GB
.sh / .ps1 rewrite ⚠️ Full download + rewrite + chunked output; no Range resume
Terminal window
wget -c "https://example.com/https://github.com/owner/repo/releases/download/v1.0.0/large.bin"

See src/handlers/github.go lines 113–118 (header forward) and 209–231 (response pass-through).

Capability Supported
Streaming tar
One-time token (2 min)
Range / resume
Cache-Control: no-store