mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
refactor proxy upgrade path
This commit is contained in:
parent
463dcd3ef1
commit
2d56547524
@ -182,15 +182,33 @@ func (r *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
// TODO convert this entire proxy to an UpgradeAwareProxy similar to
|
// TODO convert this entire proxy to an UpgradeAwareProxy similar to
|
||||||
// https://github.com/openshift/origin/blob/master/pkg/util/httpproxy/upgradeawareproxy.go.
|
// https://github.com/openshift/origin/blob/master/pkg/util/httpproxy/upgradeawareproxy.go.
|
||||||
// That proxy needs to be modified to support multiple backends, not just 1.
|
// That proxy needs to be modified to support multiple backends, not just 1.
|
||||||
|
if r.tryUpgrade(w, req, newReq, destURL) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy := httputil.NewSingleHostReverseProxy(&url.URL{Scheme: "http", Host: destURL.Host})
|
||||||
|
proxy.Transport = &proxyTransport{
|
||||||
|
proxyScheme: req.URL.Scheme,
|
||||||
|
proxyHost: req.URL.Host,
|
||||||
|
proxyPathPrepend: path.Join(r.prefix, "ns", namespace, resource, id),
|
||||||
|
}
|
||||||
|
proxy.FlushInterval = 200 * time.Millisecond
|
||||||
|
proxy.ServeHTTP(w, newReq)
|
||||||
|
}
|
||||||
|
|
||||||
|
// tryUpgrade returns true if the request was handled.
|
||||||
|
func (r *ProxyHandler) tryUpgrade(w http.ResponseWriter, req, newReq *http.Request, destURL *url.URL) bool {
|
||||||
connectionHeader := strings.ToLower(req.Header.Get(httpstream.HeaderConnection))
|
connectionHeader := strings.ToLower(req.Header.Get(httpstream.HeaderConnection))
|
||||||
if strings.Contains(connectionHeader, strings.ToLower(httpstream.HeaderUpgrade)) && len(req.Header.Get(httpstream.HeaderUpgrade)) > 0 {
|
if !strings.Contains(connectionHeader, strings.ToLower(httpstream.HeaderUpgrade)) || len(req.Header.Get(httpstream.HeaderUpgrade)) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
//TODO support TLS? Doesn't look like proxyTransport does anything special ...
|
//TODO support TLS? Doesn't look like proxyTransport does anything special ...
|
||||||
dialAddr := netutil.CanonicalAddr(destURL)
|
dialAddr := netutil.CanonicalAddr(destURL)
|
||||||
backendConn, err := net.Dial("tcp", dialAddr)
|
backendConn, err := net.Dial("tcp", dialAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
status := errToAPIStatus(err)
|
status := errToAPIStatus(err)
|
||||||
writeJSON(status.Code, r.codec, status, w)
|
writeJSON(status.Code, r.codec, status, w)
|
||||||
return
|
return true
|
||||||
}
|
}
|
||||||
defer backendConn.Close()
|
defer backendConn.Close()
|
||||||
|
|
||||||
@ -201,14 +219,14 @@ func (r *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
status := errToAPIStatus(err)
|
status := errToAPIStatus(err)
|
||||||
writeJSON(status.Code, r.codec, status, w)
|
writeJSON(status.Code, r.codec, status, w)
|
||||||
return
|
return true
|
||||||
}
|
}
|
||||||
defer requestHijackedConn.Close()
|
defer requestHijackedConn.Close()
|
||||||
|
|
||||||
if err = newReq.Write(backendConn); err != nil {
|
if err = newReq.Write(backendConn); err != nil {
|
||||||
status := errToAPIStatus(err)
|
status := errToAPIStatus(err)
|
||||||
writeJSON(status.Code, r.codec, status, w)
|
writeJSON(status.Code, r.codec, status, w)
|
||||||
return
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
done := make(chan struct{}, 2)
|
done := make(chan struct{}, 2)
|
||||||
@ -230,16 +248,7 @@ func (r *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
<-done
|
<-done
|
||||||
} else {
|
return true
|
||||||
proxy := httputil.NewSingleHostReverseProxy(&url.URL{Scheme: "http", Host: destURL.Host})
|
|
||||||
proxy.Transport = &proxyTransport{
|
|
||||||
proxyScheme: req.URL.Scheme,
|
|
||||||
proxyHost: req.URL.Host,
|
|
||||||
proxyPathPrepend: path.Join(r.prefix, "ns", namespace, resource, id),
|
|
||||||
}
|
|
||||||
proxy.FlushInterval = 200 * time.Millisecond
|
|
||||||
proxy.ServeHTTP(w, newReq)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type proxyTransport struct {
|
type proxyTransport struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user