karmada/pkg/util/round_trippers.go

52 lines
1.3 KiB
Go

package util
import (
"net/http"
"net/textproto"
"strings"
"k8s.io/client-go/transport"
)
type proxyHeaderRoundTripper struct {
proxyHeaders http.Header
roundTripper http.RoundTripper
}
var _ http.RoundTripper = &proxyHeaderRoundTripper{}
// NewProxyHeaderRoundTripperWrapperConstructor returns a RoundTripper wrapper that's usable within restConfig.WrapTransport.
func NewProxyHeaderRoundTripperWrapperConstructor(wt transport.WrapperFunc, headers map[string]string) transport.WrapperFunc {
return func(rt http.RoundTripper) http.RoundTripper {
if wt != nil {
rt = wt(rt)
}
return &proxyHeaderRoundTripper{
proxyHeaders: parseProxyHeaders(headers),
roundTripper: rt,
}
}
}
// RoundTrip implements the http.RoundTripper interface.
func (r *proxyHeaderRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
if tr, ok := r.roundTripper.(*http.Transport); ok {
tr = tr.Clone()
tr.ProxyConnectHeader = r.proxyHeaders
return tr.RoundTrip(req)
}
return r.roundTripper.RoundTrip(req)
}
func parseProxyHeaders(headers map[string]string) http.Header {
if len(headers) == 0 {
return nil
}
proxyHeaders := make(http.Header)
for key, values := range headers {
proxyHeaders[textproto.CanonicalMIMEHeaderKey(key)] = strings.Split(values, ",")
}
return proxyHeaders
}