Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 1 addition & 9 deletions internal/handler/composer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"path"
"strings"
Expand Down Expand Up @@ -491,12 +490,5 @@ func (h *ComposerHandler) proxyUpstream(w http.ResponseWriter, r *http.Request)
}
defer func() { _ = resp.Body.Close() }()

for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}

w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, nil)
}
11 changes: 1 addition & 10 deletions internal/handler/conan.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package handler

import (
"fmt"
"io"
"net/http"
"strings"
)
Expand Down Expand Up @@ -194,13 +193,5 @@ func (h *ConanHandler) proxyUpstream(w http.ResponseWriter, r *http.Request) {
}
defer func() { _ = resp.Body.Close() }()

// Copy response headers
for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}

w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, nil)
}
8 changes: 1 addition & 7 deletions internal/handler/conda.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,7 @@ func (h *CondaHandler) handleRepodata(w http.ResponseWriter, r *http.Request) {
defer func() { _ = resp.Body.Close() }()

if resp.StatusCode != http.StatusOK {
for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}
w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, nil)
return
}

Expand Down
18 changes: 9 additions & 9 deletions internal/handler/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -274,16 +274,16 @@ func (h *ContainerHandler) proxyBlobHead(w http.ResponseWriter, r *http.Request,
}
defer func() { _ = resp.Body.Close() }()

for _, header := range []string{headerContentType, headerContentLength, "Docker-Content-Digest", headerETag, headerLastModified} {
if v := resp.Header.Get(header); v != "" {
w.Header().Set(header, v)
h.proxy.relayResponse(w, r, resp, func(dst, src http.Header) {
for _, header := range []string{headerContentType, headerContentLength, "Docker-Content-Digest", headerETag, headerLastModified} {
if v := src.Get(header); v != "" {
dst.Set(header, v)
}
}
}
if resp.StatusCode >= http.StatusOK && resp.StatusCode < http.StatusMultipleChoices && w.Header().Get("Docker-Content-Digest") == "" {
w.Header().Set("Docker-Content-Digest", digest)
}

w.WriteHeader(resp.StatusCode)
if resp.StatusCode >= http.StatusOK && resp.StatusCode < http.StatusMultipleChoices && dst.Get("Docker-Content-Digest") == "" {
dst.Set("Docker-Content-Digest", digest)
}
})
}

// registryForName resolves a client-visible OCI repository name to an upstream
Expand Down
8 changes: 2 additions & 6 deletions internal/handler/container_manifest.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"mime"
"net/http"
"regexp"
Expand Down Expand Up @@ -77,15 +76,12 @@ func (h *ContainerHandler) serveManifest(w http.ResponseWriter, r *http.Request,
writeContainerManifest(w, r, cached, true)
return
}
copyContainerManifestHeaders(w.Header(), resp.Header)
w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, copyContainerManifestHeaders)
return
}

if r.Method == http.MethodHead {
copyContainerManifestHeaders(w.Header(), resp.Header)
w.WriteHeader(http.StatusOK)
h.proxy.relayResponse(w, r, resp, copyContainerManifestHeaders)
return
}

Expand Down
5 changes: 1 addition & 4 deletions internal/handler/container_tags.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"net/http"
"net/url"
"regexp"
Expand Down Expand Up @@ -73,9 +72,7 @@ func (h *ContainerHandler) serveTagsList(w http.ResponseWriter, r *http.Request,
writeContainerTags(w, cached, true)
return
}
copyContainerTagsHeaders(w.Header(), resp.Header)
w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, copyContainerTagsHeaders)
return
}

Expand Down
28 changes: 3 additions & 25 deletions internal/handler/gem.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"bufio"
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"time"
Expand Down Expand Up @@ -117,17 +116,13 @@ func (h *GemHandler) handleCompactIndex(w http.ResponseWriter, r *http.Request)
defer func() { _ = indexResp.Body.Close() }()

if indexResp.StatusCode != http.StatusOK {
copyResponseHeaders(w, indexResp.Header)
w.WriteHeader(indexResp.StatusCode)
_, _ = io.Copy(w, indexResp.Body)
h.proxy.relayResponse(w, r, indexResp, nil)
return
}

if filteredVersions == nil {
h.proxy.Logger.Warn("failed to fetch version timestamps, proxying unfiltered", "name", name)
copyResponseHeaders(w, indexResp.Header)
w.WriteHeader(http.StatusOK)
_, _ = io.Copy(w, indexResp.Body)
h.proxy.relayResponse(w, r, indexResp, nil)
return
}

Expand Down Expand Up @@ -215,15 +210,6 @@ func (h *GemHandler) writeFilteredIndex(w http.ResponseWriter, resp *http.Respon
}
}

// copyResponseHeaders copies HTTP headers from a response to a writer.
func copyResponseHeaders(w http.ResponseWriter, headers http.Header) {
for k, vv := range headers {
for _, v := range vv {
w.Header().Add(k, v)
}
}
}

// gemVersion represents a version entry from the RubyGems versions API.
type gemVersion struct {
Number string `json:"number"`
Expand Down Expand Up @@ -314,15 +300,7 @@ func (h *GemHandler) proxyUpstream(w http.ResponseWriter, r *http.Request) {
}
defer func() { _ = resp.Body.Close() }()

// Copy response headers
for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}

w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, nil)
}

func init() {
Expand Down
38 changes: 11 additions & 27 deletions internal/handler/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -768,7 +768,8 @@ func serveArtifact(w http.ResponseWriter, method string, result *CacheResult) {

// ProxyUpstream forwards a request to an upstream URL without caching.
// It copies the request, forwards specified headers, and streams the response back.
// If forwardHeaders is nil, all response headers are copied.
// forwardHeaders controls the request headers sent upstream. End-to-end response
// headers and trailers are relayed independently of that list.
func (p *Proxy) ProxyUpstream(w http.ResponseWriter, r *http.Request, upstreamURL string, forwardHeaders []string) {
p.Logger.Debug("proxying to upstream", "url", upstreamURL)

Expand All @@ -794,17 +795,10 @@ func (p *Proxy) ProxyUpstream(w http.ResponseWriter, r *http.Request, upstreamUR
}
defer func() { _ = resp.Body.Close() }()

for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}

w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
p.relayResponse(w, r, resp, nil)
}

// ProxyFile forwards a file request to upstream, copying all response headers.
// ProxyFile forwards a file request, relaying end-to-end headers and trailers.
func (p *Proxy) ProxyFile(w http.ResponseWriter, r *http.Request, upstreamURL string) {
req, err := http.NewRequestWithContext(r.Context(), r.Method, upstreamURL, nil)
if err != nil {
Expand All @@ -820,14 +814,7 @@ func (p *Proxy) ProxyFile(w http.ResponseWriter, r *http.Request, upstreamURL st
}
defer func() { _ = resp.Body.Close() }()

for key, values := range resp.Header {
for _, v := range values {
w.Header().Add(key, v)
}
}

w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
p.relayResponse(w, r, resp, nil)
}

// JSONError writes a JSON error response.
Expand Down Expand Up @@ -1273,16 +1260,13 @@ func (p *Proxy) proxyMetadataStream(w http.ResponseWriter, r *http.Request, upst
}
defer func() { _ = resp.Body.Close() }()

for _, header := range []string{headerContentType, headerContentLength, headerContentEncoding, headerLastModified, headerETag} {
if v := resp.Header.Get(header); v != "" {
w.Header().Set(header, v)
p.relayResponse(w, r, resp, func(dst, src http.Header) {
for _, header := range []string{headerContentType, headerContentLength, headerContentEncoding, headerLastModified, headerETag} {
if v := src.Get(header); v != "" {
dst.Set(header, v)
}
}
}

w.WriteHeader(resp.StatusCode)
if r.Method != http.MethodHead {
_, _ = io.Copy(w, resp.Body)
}
})
}

func (p *Proxy) applyUpstreamAuth(req *http.Request) {
Expand Down
8 changes: 1 addition & 7 deletions internal/handler/hex.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,7 @@ func (h *HexHandler) handlePackages(w http.ResponseWriter, r *http.Request) {
defer func() { _ = protoResp.Body.Close() }()

if protoResp.StatusCode != http.StatusOK {
for k, vv := range protoResp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}
w.WriteHeader(protoResp.StatusCode)
_, _ = io.Copy(w, protoResp.Body)
h.proxy.relayResponse(w, r, protoResp, nil)
return
}

Expand Down
10 changes: 1 addition & 9 deletions internal/handler/nuget.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"strings"
)
Expand Down Expand Up @@ -222,14 +221,7 @@ func (h *NuGetHandler) proxyUpstream(w http.ResponseWriter, r *http.Request) {
}
defer func() { _ = resp.Body.Close() }()

for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}

w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, nil)
}

// buildUpstreamURL constructs the upstream URL for a request.
Expand Down
14 changes: 4 additions & 10 deletions internal/handler/pypi.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"encoding/json"
"errors"
"fmt"
"io"
"mime"
"net/http"
"regexp"
Expand Down Expand Up @@ -817,13 +816,8 @@ func (h *PyPIHandler) proxySimple(w http.ResponseWriter, r *http.Request, path s
}
defer func() { _ = resp.Body.Close() }()

for k, vv := range resp.Header {
for _, v := range vv {
w.Header().Add(k, v)
}
}
ensureVaryAccept(w.Header())

w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
h.proxy.relayResponse(w, r, resp, func(dst, src http.Header) {
copyRelayHeaders(dst, src)
ensureVaryAccept(dst)
})
}
Loading
Loading