From 4354f0a107b0a5c38a91fa26f10f571f7018e237 Mon Sep 17 00:00:00 2001 From: Aaron Lehmann Date: Wed, 3 Feb 2016 13:19:44 -0800 Subject: [PATCH] On redirect, only copy headers when they don't already exist in the redirected request A changeset under consideration for Go 1.7 would automatically copy headers on redirect. This change future-proofs our code so we won't make duplicate copies of the headers if net/http does it automatically in the future. Signed-off-by: Aaron Lehmann --- registry/client/repository.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/registry/client/repository.go b/registry/client/repository.go index 87067b99d..b3cae8478 100644 --- a/registry/client/repository.go +++ b/registry/client/repository.go @@ -36,8 +36,21 @@ func checkHTTPRedirect(req *http.Request, via []*http.Request) error { if len(via) > 0 { for headerName, headerVals := range via[0].Header { - if headerName == "Accept" || headerName == "Range" { - for _, val := range headerVals { + if headerName != "Accept" && headerName != "Range" { + continue + } + for _, val := range headerVals { + // Don't add to redirected request if redirected + // request already has a header with the same + // name and value. + hasValue := false + for _, existingVal := range req.Header[headerName] { + if existingVal == val { + hasValue = true + break + } + } + if !hasValue { req.Header.Add(headerName, val) } }