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 ✅