K8s: Add accept header to ctx (#83802)
This commit is contained in:
@@ -20,6 +20,8 @@ import (
|
||||
"k8s.io/apiserver/pkg/util/openapi"
|
||||
k8sscheme "k8s.io/client-go/kubernetes/scheme"
|
||||
"k8s.io/kube-openapi/pkg/common"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apiserver/endpoints/filters"
|
||||
)
|
||||
|
||||
func SetupConfig(
|
||||
@@ -70,7 +72,11 @@ func SetupConfig(
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("could not build handler chain func: %s", err.Error()))
|
||||
}
|
||||
return genericapiserver.DefaultBuildHandlerChain(requestHandler, c)
|
||||
|
||||
handler := genericapiserver.DefaultBuildHandlerChain(requestHandler, c)
|
||||
handler = filters.WithAcceptHeader(handler)
|
||||
|
||||
return handler
|
||||
}
|
||||
|
||||
k8sVersion, err := getK8sApiserverVersion()
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package filters
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apiserver/endpoints/request"
|
||||
)
|
||||
|
||||
// WithAcceptHeader adds the Accept header to the request context.
|
||||
func WithAcceptHeader(handler http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||
ctx := request.WithAcceptHeader(req.Context(), req.Header.Get("Accept"))
|
||||
handler.ServeHTTP(w, req.WithContext(ctx))
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package filters
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apiserver/endpoints/request"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestWithAcceptHeader(t *testing.T) {
|
||||
t.Run("should not set accept header in context for empty header", func(t *testing.T) {
|
||||
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||||
|
||||
rr := httptest.NewRecorder()
|
||||
handler := &fakeHandler{}
|
||||
WithAcceptHeader(handler).ServeHTTP(rr, req)
|
||||
|
||||
acceptHeader, ok := request.AcceptHeaderFrom(handler.ctx)
|
||||
require.False(t, ok)
|
||||
require.Empty(t, acceptHeader)
|
||||
})
|
||||
|
||||
t.Run("should set accept header in context", func(t *testing.T) {
|
||||
req := httptest.NewRequest(http.MethodGet, "/", nil)
|
||||
req.Header.Set("Accept", "application/json")
|
||||
|
||||
rr := httptest.NewRecorder()
|
||||
handler := &fakeHandler{}
|
||||
WithAcceptHeader(handler).ServeHTTP(rr, req)
|
||||
|
||||
acceptHeader, ok := request.AcceptHeaderFrom(handler.ctx)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, "application/json", acceptHeader)
|
||||
})
|
||||
}
|
||||
|
||||
type fakeHandler struct {
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
func (h *fakeHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||
h.ctx = req.Context()
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package request
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
type acceptHeaderKey struct{}
|
||||
|
||||
// WithAcceptHeader adds the accept header to the supplied context.
|
||||
func WithAcceptHeader(ctx context.Context, acceptHeader string) context.Context {
|
||||
// only add the accept header to ctx if it is not empty
|
||||
if acceptHeader == "" {
|
||||
return ctx
|
||||
}
|
||||
return context.WithValue(ctx, acceptHeaderKey{}, acceptHeader)
|
||||
}
|
||||
|
||||
// AcceptHeaderFrom returns the accept header from the supplied context and a boolean indicating if the value was present.
|
||||
func AcceptHeaderFrom(ctx context.Context) (string, bool) {
|
||||
acceptHeader, ok := ctx.Value(acceptHeaderKey{}).(string)
|
||||
return acceptHeader, ok
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package request
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestAcceptHeader(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
t.Run("should not set ctx for empty header", func(t *testing.T) {
|
||||
out := WithAcceptHeader(ctx, "")
|
||||
acceptHeader, ok := AcceptHeaderFrom(out)
|
||||
require.False(t, ok)
|
||||
require.Empty(t, acceptHeader)
|
||||
})
|
||||
|
||||
t.Run("should add header to ctx", func(t *testing.T) {
|
||||
out := WithAcceptHeader(ctx, "application/json")
|
||||
acceptHeader, ok := AcceptHeaderFrom(out)
|
||||
require.True(t, ok)
|
||||
require.Equal(t, "application/json", acceptHeader)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user