mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
Fix proxied request-uri to be valid HTTP requests
This commit is contained in:
parent
ea017719e5
commit
9648f1cb7a
@ -70,7 +70,7 @@ func (r *ProxyREST) Connect(ctx genericapirequest.Context, id string, opts runti
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
location.Path = path.Join(location.Path, proxyOpts.Path)
|
location.Path = path.Join("/", location.Path, proxyOpts.Path)
|
||||||
// Return a proxy handler that uses the desired transport, wrapped with additional proxy handling (to get URL rewriting, X-Forwarded-* headers, etc)
|
// Return a proxy handler that uses the desired transport, wrapped with additional proxy handling (to get URL rewriting, X-Forwarded-* headers, etc)
|
||||||
return newThrottledUpgradeAwareProxyHandler(location, transport, true, false, responder), nil
|
return newThrottledUpgradeAwareProxyHandler(location, transport, true, false, responder), nil
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ func (r *ProxyREST) Connect(ctx genericapirequest.Context, id string, opts runti
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
location.Path = path.Join(location.Path, proxyOpts.Path)
|
location.Path = path.Join("/", location.Path, proxyOpts.Path)
|
||||||
// Return a proxy handler that uses the desired transport, wrapped with additional proxy handling (to get URL rewriting, X-Forwarded-* headers, etc)
|
// Return a proxy handler that uses the desired transport, wrapped with additional proxy handling (to get URL rewriting, X-Forwarded-* headers, etc)
|
||||||
return newThrottledUpgradeAwareProxyHandler(location, transport, true, false, false, responder), nil
|
return newThrottledUpgradeAwareProxyHandler(location, transport, true, false, false, responder), nil
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ func (r *ProxyREST) Connect(ctx genericapirequest.Context, id string, opts runti
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
location.Path = path.Join(location.Path, proxyOpts.Path)
|
location.Path = path.Join("/", location.Path, proxyOpts.Path)
|
||||||
// Return a proxy handler that uses the desired transport, wrapped with additional proxy handling (to get URL rewriting, X-Forwarded-* headers, etc)
|
// Return a proxy handler that uses the desired transport, wrapped with additional proxy handling (to get URL rewriting, X-Forwarded-* headers, etc)
|
||||||
return newThrottledUpgradeAwareProxyHandler(location, transport, true, false, responder), nil
|
return newThrottledUpgradeAwareProxyHandler(location, transport, true, false, responder), nil
|
||||||
}
|
}
|
||||||
|
@ -159,11 +159,20 @@ func NewUpgradeRequestRoundTripper(connection, request http.RoundTripper) Upgrad
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// normalizeLocation returns the result of parsing the full URL, with scheme set to http if missing
|
||||||
|
func normalizeLocation(location *url.URL) *url.URL {
|
||||||
|
normalized, _ := url.Parse(location.String())
|
||||||
|
if len(normalized.Scheme) == 0 {
|
||||||
|
normalized.Scheme = "http"
|
||||||
|
}
|
||||||
|
return normalized
|
||||||
|
}
|
||||||
|
|
||||||
// NewUpgradeAwareHandler creates a new proxy handler with a default flush interval. Responder is required for returning
|
// NewUpgradeAwareHandler creates a new proxy handler with a default flush interval. Responder is required for returning
|
||||||
// errors to the caller.
|
// errors to the caller.
|
||||||
func NewUpgradeAwareHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired bool, responder ErrorResponder) *UpgradeAwareHandler {
|
func NewUpgradeAwareHandler(location *url.URL, transport http.RoundTripper, wrapTransport, upgradeRequired bool, responder ErrorResponder) *UpgradeAwareHandler {
|
||||||
return &UpgradeAwareHandler{
|
return &UpgradeAwareHandler{
|
||||||
Location: location,
|
Location: normalizeLocation(location),
|
||||||
Transport: transport,
|
Transport: transport,
|
||||||
WrapTransport: wrapTransport,
|
WrapTransport: wrapTransport,
|
||||||
UpgradeRequired: upgradeRequired,
|
UpgradeRequired: upgradeRequired,
|
||||||
@ -174,9 +183,6 @@ func NewUpgradeAwareHandler(location *url.URL, transport http.RoundTripper, wrap
|
|||||||
|
|
||||||
// ServeHTTP handles the proxy request
|
// ServeHTTP handles the proxy request
|
||||||
func (h *UpgradeAwareHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
func (h *UpgradeAwareHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
if len(h.Location.Scheme) == 0 {
|
|
||||||
h.Location.Scheme = "http"
|
|
||||||
}
|
|
||||||
if h.tryUpgrade(w, req) {
|
if h.tryUpgrade(w, req) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -241,11 +241,7 @@ func TestServeHTTP(t *testing.T) {
|
|||||||
responder := &fakeResponder{t: t}
|
responder := &fakeResponder{t: t}
|
||||||
backendURL, _ := url.Parse(backendServer.URL)
|
backendURL, _ := url.Parse(backendServer.URL)
|
||||||
backendURL.Path = test.requestPath
|
backendURL.Path = test.requestPath
|
||||||
proxyHandler := &UpgradeAwareHandler{
|
proxyHandler := NewUpgradeAwareHandler(backendURL, nil, false, test.upgradeRequired, responder)
|
||||||
Location: backendURL,
|
|
||||||
Responder: responder,
|
|
||||||
UpgradeRequired: test.upgradeRequired,
|
|
||||||
}
|
|
||||||
proxyServer := httptest.NewServer(proxyHandler)
|
proxyServer := httptest.NewServer(proxyHandler)
|
||||||
defer proxyServer.Close()
|
defer proxyServer.Close()
|
||||||
proxyURL, _ := url.Parse(proxyServer.URL)
|
proxyURL, _ := url.Parse(proxyServer.URL)
|
||||||
@ -457,13 +453,9 @@ func TestProxyUpgrade(t *testing.T) {
|
|||||||
|
|
||||||
serverURL, _ := url.Parse(backendServer.URL)
|
serverURL, _ := url.Parse(backendServer.URL)
|
||||||
serverURL.Path = backendPath
|
serverURL.Path = backendPath
|
||||||
proxyHandler := &UpgradeAwareHandler{
|
proxyHandler := NewUpgradeAwareHandler(serverURL, tc.ProxyTransport, false, false, &noErrorsAllowed{t: t})
|
||||||
Location: serverURL,
|
proxyHandler.UpgradeTransport = tc.UpgradeTransport
|
||||||
Transport: tc.ProxyTransport,
|
proxyHandler.InterceptRedirects = redirect
|
||||||
UpgradeTransport: tc.UpgradeTransport,
|
|
||||||
InterceptRedirects: redirect,
|
|
||||||
Responder: &noErrorsAllowed{t: t},
|
|
||||||
}
|
|
||||||
proxy := httptest.NewServer(proxyHandler)
|
proxy := httptest.NewServer(proxyHandler)
|
||||||
defer proxy.Close()
|
defer proxy.Close()
|
||||||
|
|
||||||
@ -509,14 +501,15 @@ func TestProxyUpgradeErrorResponse(t *testing.T) {
|
|||||||
return &fakeConn{err: expectedErr}, nil
|
return &fakeConn{err: expectedErr}, nil
|
||||||
}
|
}
|
||||||
responder = &fakeResponder{t: t, w: w}
|
responder = &fakeResponder{t: t, w: w}
|
||||||
proxyHandler := &UpgradeAwareHandler{
|
proxyHandler := NewUpgradeAwareHandler(
|
||||||
Location: &url.URL{
|
&url.URL{
|
||||||
Host: "fake-backend",
|
Host: "fake-backend",
|
||||||
},
|
},
|
||||||
UpgradeRequired: true,
|
transport,
|
||||||
Responder: responder,
|
false,
|
||||||
Transport: transport,
|
true,
|
||||||
}
|
responder,
|
||||||
|
)
|
||||||
proxyHandler.ServeHTTP(w, r)
|
proxyHandler.ServeHTTP(w, r)
|
||||||
}))
|
}))
|
||||||
defer proxy.Close()
|
defer proxy.Close()
|
||||||
@ -575,9 +568,7 @@ func TestDefaultProxyTransport(t *testing.T) {
|
|||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
locURL, _ := url.Parse(test.location)
|
locURL, _ := url.Parse(test.location)
|
||||||
URL, _ := url.Parse(test.url)
|
URL, _ := url.Parse(test.url)
|
||||||
h := UpgradeAwareHandler{
|
h := NewUpgradeAwareHandler(locURL, nil, false, false, nil)
|
||||||
Location: locURL,
|
|
||||||
}
|
|
||||||
result := h.defaultProxyTransport(URL, nil)
|
result := h.defaultProxyTransport(URL, nil)
|
||||||
transport := result.(*corsRemovingTransport).RoundTripper.(*Transport)
|
transport := result.(*corsRemovingTransport).RoundTripper.(*Transport)
|
||||||
if transport.Scheme != test.expectedScheme {
|
if transport.Scheme != test.expectedScheme {
|
||||||
@ -751,11 +742,7 @@ func TestProxyRequestContentLengthAndTransferEncoding(t *testing.T) {
|
|||||||
|
|
||||||
responder := &fakeResponder{t: t}
|
responder := &fakeResponder{t: t}
|
||||||
backendURL, _ := url.Parse(downstreamServer.URL)
|
backendURL, _ := url.Parse(downstreamServer.URL)
|
||||||
proxyHandler := &UpgradeAwareHandler{
|
proxyHandler := NewUpgradeAwareHandler(backendURL, nil, false, false, responder)
|
||||||
Location: backendURL,
|
|
||||||
Responder: responder,
|
|
||||||
UpgradeRequired: false,
|
|
||||||
}
|
|
||||||
proxyServer := httptest.NewServer(proxyHandler)
|
proxyServer := httptest.NewServer(proxyHandler)
|
||||||
defer proxyServer.Close()
|
defer proxyServer.Close()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user