未验证 提交 dcd341e7 编写于 作者: Z zryfish 提交者: GitHub

fix websocket bug (#2058)

上级 f34a4e1c
package filters
import (
"k8s.io/apimachinery/pkg/util/net"
"k8s.io/apimachinery/pkg/util/proxy"
"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
"k8s.io/client-go/rest"
......@@ -20,6 +21,16 @@ func WithKubeAPIServer(handler http.Handler, config *rest.Config, failed proxy.E
return handler
}
tlsConfig, err := net.TLSClientConfig(defaultTransport)
if err != nil {
klog.V(5).Infof("Unable to unwrap transport %T to get at TLS config: %v", defaultTransport, err)
}
// since http2 doesn't support websocket, we need to disable http2 when using websocket
if supportsHTTP11(tlsConfig.NextProtos) {
tlsConfig.NextProtos = []string{"http/1.1"}
}
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
info, ok := request.RequestInfoFrom(req.Context())
if !ok {
......@@ -33,10 +44,9 @@ func WithKubeAPIServer(handler http.Handler, config *rest.Config, failed proxy.E
s.Host = kubernetes.Host
s.Scheme = kubernetes.Scheme
// Do not cover k8s client authorization header
// make sure we don't override kubernetes's authorization
req.Header.Del("Authorization")
httpProxy := proxy.NewUpgradeAwareHandler(&s, defaultTransport, true, false, failed)
httpProxy.UpgradeTransport = proxy.NewUpgradeRequestRoundTripper(defaultTransport, defaultTransport)
httpProxy.ServeHTTP(w, req)
return
}
......@@ -44,3 +54,18 @@ func WithKubeAPIServer(handler http.Handler, config *rest.Config, failed proxy.E
handler.ServeHTTP(w, req)
})
}
// copy from https://github.com/kubernetes/apimachinery/blob/master/pkg/util/proxy/dial.go
func supportsHTTP11(nextProtos []string) bool {
if len(nextProtos) == 0 {
return true
}
for _, proto := range nextProtos {
if proto == "http/1.1" {
return true
}
}
return false
}
......@@ -290,7 +290,7 @@ func prepare() Interface {
k8sClient := fakek8s.NewSimpleClientset()
istioClient := fakeistio.NewSimpleClientset()
appClient := fakeapp.NewSimpleClientset()
fakeInformerFactory := informers.NewInformerFactories(k8sClient, ksClient, istioClient, appClient)
fakeInformerFactory := informers.NewInformerFactories(k8sClient, ksClient, istioClient, appClient, nil, nil)
for _, workspace := range workspaces {
fakeInformerFactory.KubeSphereSharedInformerFactory().Tenant().V1alpha1().
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册