K8s: Add accept header to ctx (#83802)

This commit is contained in:
Todd Treece
2024-03-01 20:32:59 -05:00
committed by GitHub
parent d7bcd119c3
commit 869b89dce4
5 changed files with 116 additions and 1 deletions
+7 -1
View File
@@ -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()
+15
View File
@@ -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()
}
+22
View File
@@ -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)
})
}