Skip to content

Commit

Permalink
implement proxy headers
Browse files Browse the repository at this point in the history
Signed-off-by: Poor12 <shentiecheng@huawei.com>
  • Loading branch information
Poor12 committed Jul 17, 2023
1 parent 1251ec9 commit 8911cff
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
4 changes: 4 additions & 0 deletions pkg/util/membercluster_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,10 @@ func BuildClusterConfig(clusterName string,
return nil, err
}
clusterConfig.Proxy = http.ProxyURL(proxy)

if len(cluster.Spec.ProxyHeader) != 0 {
clusterConfig.Wrap(NewProxyHeaderRoundTripperWrapperConstructor(clusterConfig.WrapTransport, cluster.Spec.ProxyHeader))
}
}

return clusterConfig, nil
Expand Down
51 changes: 51 additions & 0 deletions pkg/util/round_trippers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
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
}

0 comments on commit 8911cff

Please sign in to comment.