diff --git a/api/server/httputils/errors.go b/api/server/httputils/errors.go index acfae85f98..d8d4972623 100644 --- a/api/server/httputils/errors.go +++ b/api/server/httputils/errors.go @@ -75,13 +75,18 @@ func GetHTTPErrorStatusCode(err error) int { return statusCode } +func apiVersionSupportsJSONErrors(version string) bool { + const firstAPIVersionWithJSONErrors = "1.23" + return version == "" || versions.GreaterThan(version, firstAPIVersionWithJSONErrors) +} + // MakeErrorHandler makes an HTTP handler that decodes a Docker error and // returns it in the response. func MakeErrorHandler(err error) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { statusCode := GetHTTPErrorStatusCode(err) vars := mux.Vars(r) - if vars["version"] == "" || versions.GreaterThan(vars["version"], "1.23") { + if apiVersionSupportsJSONErrors(vars["version"]) { response := &types.ErrorResponse{ Message: err.Error(), } diff --git a/api/server/middleware/version.go b/api/server/middleware/version.go index e0a4fc5f46..b6f62b212b 100644 --- a/api/server/middleware/version.go +++ b/api/server/middleware/version.go @@ -5,18 +5,11 @@ import ( "net/http" "runtime" + "github.com/docker/docker/api/errors" "github.com/docker/docker/api/types/versions" "golang.org/x/net/context" ) -type badRequestError struct { - error -} - -func (badRequestError) HTTPErrorStatusCode() int { - return http.StatusBadRequest -} - // VersionMiddleware is a middleware that // validates the client and server versions. type VersionMiddleware struct { @@ -44,10 +37,10 @@ func (v VersionMiddleware) WrapHandler(handler func(ctx context.Context, w http. } if versions.GreaterThan(apiVersion, v.defaultVersion) { - return badRequestError{fmt.Errorf("client is newer than server (client API version: %s, server API version: %s)", apiVersion, v.defaultVersion)} + return errors.NewBadRequestError(fmt.Errorf("client is newer than server (client API version: %s, server API version: %s)", apiVersion, v.defaultVersion)) } if versions.LessThan(apiVersion, v.minVersion) { - return badRequestError{fmt.Errorf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", apiVersion, v.minVersion)} + return errors.NewBadRequestError(fmt.Errorf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", apiVersion, v.minVersion)) } header := fmt.Sprintf("Docker/%s (%s)", v.serverVersion, runtime.GOOS)