diff --git a/pkg/apiserver/auditing/client.go b/pkg/apiserver/auditing/client.go index b3ae5a93e..a49cb6c69 100644 --- a/pkg/apiserver/auditing/client.go +++ b/pkg/apiserver/auditing/client.go @@ -25,6 +25,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/apiserver/pkg/apis/audit" + "k8s.io/apiserver/pkg/endpoints/responsewriter" "k8s.io/klog/v2" clusterv1alpha1 "kubesphere.io/api/cluster/v1alpha1" "kubesphere.io/api/iam/v1beta1" @@ -398,6 +399,9 @@ func (a *auditing) eventToBytes(events []*Event) [][]byte { return res } +var _ http.ResponseWriter = &ResponseCapture{} +var _ responsewriter.UserProvidedDecorator = &ResponseCapture{} + type ResponseCapture struct { http.ResponseWriter wroteHeader bool @@ -413,6 +417,10 @@ func NewResponseCapture(w http.ResponseWriter) *ResponseCapture { } } +func (c *ResponseCapture) Unwrap() http.ResponseWriter { + return c.ResponseWriter +} + func (c *ResponseCapture) Header() http.Header { return c.ResponseWriter.Header() } @@ -425,9 +433,6 @@ func (c *ResponseCapture) Write(data []byte) (int, error) { if err != nil { return n, err } - if flusher, ok := c.ResponseWriter.(http.Flusher); ok { - flusher.Flush() - } return n, nil } diff --git a/pkg/apiserver/filters/auditing.go b/pkg/apiserver/filters/auditing.go index 967b15c59..f76b90903 100644 --- a/pkg/apiserver/filters/auditing.go +++ b/pkg/apiserver/filters/auditing.go @@ -8,6 +8,7 @@ package filters import ( "net/http" + "k8s.io/apiserver/pkg/endpoints/responsewriter" "k8s.io/klog/v2" "kubesphere.io/kubesphere/pkg/apiserver/auditing" @@ -44,7 +45,7 @@ func (a *auditingFilter) ServeHTTP(w http.ResponseWriter, req *http.Request) { if event := a.LogRequestObject(req, info); event != nil { resp := auditing.NewResponseCapture(w) - a.next.ServeHTTP(resp, req) + a.next.ServeHTTP(responsewriter.WrapForHTTP1Or2(resp), req) go a.LogResponseObject(event, resp) } else { a.next.ServeHTTP(w, req) diff --git a/pkg/apiserver/filters/filters.go b/pkg/apiserver/filters/filters.go index a0499820a..f50414b99 100644 --- a/pkg/apiserver/filters/filters.go +++ b/pkg/apiserver/filters/filters.go @@ -13,6 +13,7 @@ import ( "strconv" "time" + "k8s.io/apiserver/pkg/endpoints/responsewriter" "k8s.io/klog/v2" "kubesphere.io/kubesphere/pkg/apiserver/metrics" @@ -20,12 +21,19 @@ import ( "kubesphere.io/kubesphere/pkg/utils/iputil" ) +var _ http.ResponseWriter = &metaResponseWriter{} +var _ responsewriter.UserProvidedDecorator = &metaResponseWriter{} + type metaResponseWriter struct { http.ResponseWriter statusCode int size int } +func (r *metaResponseWriter) Unwrap() http.ResponseWriter { + return r.ResponseWriter +} + func newMetaResponseWriter(w http.ResponseWriter) *metaResponseWriter { return &metaResponseWriter{ ResponseWriter: w, @@ -48,9 +56,6 @@ func (r *metaResponseWriter) Write(b []byte) (int, error) { if err != nil { return size, err } - if flusher, ok := r.ResponseWriter.(http.Flusher); ok { - flusher.Flush() - } return size, nil } @@ -66,7 +71,8 @@ func WithGlobalFilter(handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { wrapper := newMetaResponseWriter(w) start := time.Now() - handler.ServeHTTP(wrapper, req) + + handler.ServeHTTP(responsewriter.WrapForHTTP1Or2(wrapper), req) elapsedTime := time.Since(start) // Record metrics for each request @@ -94,7 +100,7 @@ func WithGlobalFilter(handler http.Handler) http.Handler { req.Proto, wrapper.statusCode, wrapper.size, - elapsedTime.Microseconds(), + elapsedTime.Milliseconds(), ) }) }