diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate.go index 718d61e676b..9dbad1ea65c 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate.go @@ -234,13 +234,6 @@ func acceptMediaTypeOptions(params map[string]string, accepts *runtime.Serialize return options, true } -type candidateMediaType struct { - accepted *runtime.SerializerInfo - clauses goautoneg.Accept -} - -type candidateMediaTypeSlice []candidateMediaType - // NegotiateMediaTypeOptions returns the most appropriate content type given the accept header and // a list of alternatives along with the accepted media type parameters. func NegotiateMediaTypeOptions(header string, accepted []runtime.SerializerInfo, endpoint EndpointRestrictions) (MediaTypeOptions, bool) { @@ -250,25 +243,21 @@ func NegotiateMediaTypeOptions(header string, accepted []runtime.SerializerInfo, }, true } - var candidates candidateMediaTypeSlice clauses := goautoneg.ParseAccept(header) - for _, clause := range clauses { + for i := range clauses { + clause := &clauses[i] for i := range accepted { accepts := &accepted[i] switch { case clause.Type == accepts.MediaTypeType && clause.SubType == accepts.MediaTypeSubType, clause.Type == accepts.MediaTypeType && clause.SubType == "*", clause.Type == "*" && clause.SubType == "*": - candidates = append(candidates, candidateMediaType{accepted: accepts, clauses: clause}) + if retVal, ret := acceptMediaTypeOptions(clause.Params, accepts, endpoint); ret { + return retVal, true + } } } } - for _, v := range candidates { - if retVal, ret := acceptMediaTypeOptions(v.clauses.Params, v.accepted, endpoint); ret { - return retVal, true - } - } - return MediaTypeOptions{}, false } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate_test.go index 72b75f34b69..e2c164b1525 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate_test.go @@ -280,3 +280,30 @@ func TestNegotiate(t *testing.T) { } } } + +func fakeSerializerInfoSlice() []runtime.SerializerInfo { + result := make([]runtime.SerializerInfo, 2) + result[0] = runtime.SerializerInfo{ + MediaType: "application/json", + MediaTypeType: "application", + MediaTypeSubType: "json", + } + result[1] = runtime.SerializerInfo{ + MediaType: "application/vnd.kubernetes.protobuf", + MediaTypeType: "application", + MediaTypeSubType: "vnd.kubernetes.protobuf", + } + return result +} + +func BenchmarkNegotiateMediaTypeOptions(b *testing.B) { + accepted := fakeSerializerInfoSlice() + header := "application/vnd.kubernetes.protobuf,*/*" + + for i := 0; i < b.N; i++ { + options, _ := NegotiateMediaTypeOptions(header, accepted, DefaultEndpointRestrictions) + if options.Accepted != accepted[1] { + b.Errorf("Unexpected result") + } + } +}