diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index 924165eafa8..f30c13dfc06 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -171,13 +171,27 @@ func InstallLogsSupport(mux Mux) { mux.Handle("/logs/", http.StripPrefix("/logs/", http.FileServer(http.Dir("/var/log/")))) } -func InstallServiceErrorHandler(container *restful.Container) { - container.ServiceErrorHandler(serviceErrorHandler) +func InstallServiceErrorHandler(container *restful.Container, requestResolver *APIRequestInfoResolver, apiVersions []string) { + container.ServiceErrorHandler(func(serviceErr restful.ServiceError, request *restful.Request, response *restful.Response) { + serviceErrorHandler(requestResolver, apiVersions, serviceErr, request, response) + }) } -func serviceErrorHandler(serviceErr restful.ServiceError, response *restful.Response) { - // TODO: Update go-restful to return the request as well, so that we can use the appropriate codec rather than using the latest one. - errorJSON(apierrors.NewGenericServerResponse(serviceErr.Code, "", "", "", "", 0, false), latest.Codec, response.ResponseWriter) +func serviceErrorHandler(requestResolver *APIRequestInfoResolver, apiVersions []string, serviceErr restful.ServiceError, request *restful.Request, response *restful.Response) { + requestInfo, err := requestResolver.GetAPIRequestInfo(request.Request) + codec := latest.Codec + if err == nil && requestInfo.APIVersion != "" { + // check if the api version is valid. + for _, version := range apiVersions { + if requestInfo.APIVersion == version { + // valid api version. + codec = runtime.CodecFor(api.Scheme, requestInfo.APIVersion) + break + } + } + } + + errorJSON(apierrors.NewGenericServerResponse(serviceErr.Code, "", "", "", "", 0, false), codec, response.ResponseWriter) } // Adds a service to return the supported api versions. diff --git a/pkg/master/master.go b/pkg/master/master.go index b8440e52d03..78db90963ad 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -449,7 +449,9 @@ func (m *Master) init(c *Config) { apiserver.InstallSupport(m.muxHelper, m.rootWebService) apiserver.AddApiWebService(m.handlerContainer, c.APIPrefix, apiVersions) - apiserver.InstallServiceErrorHandler(m.handlerContainer) + defaultVersion := m.defaultAPIGroupVersion() + requestInfoResolver := &apiserver.APIRequestInfoResolver{util.NewStringSet(strings.TrimPrefix(defaultVersion.Root, "/")), defaultVersion.Mapper} + apiserver.InstallServiceErrorHandler(m.handlerContainer, requestInfoResolver, apiVersions) // Register root handler. // We do not register this using restful Webservice since we do not want to surface this in api docs.