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 <aaron.lehmann@docker.com>
This commit is contained in:
Aaron Lehmann 2016-02-03 13:19:44 -08:00
parent c4b79bda8a
commit bbf983c061

View file

@ -36,8 +36,21 @@ func checkHTTPRedirect(req *http.Request, via []*http.Request) error {
if len(via) > 0 { if len(via) > 0 {
for headerName, headerVals := range via[0].Header { for headerName, headerVals := range via[0].Header {
if headerName == "Accept" || headerName == "Range" { if headerName != "Accept" && headerName != "Range" {
continue
}
for _, val := range headerVals { 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) req.Header.Add(headerName, val)
} }
} }