1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Use apiError in server version middleware.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
Daniel Nephin 2016-09-15 13:30:07 -04:00
parent c452e1bfe6
commit bcb0405239
2 changed files with 9 additions and 11 deletions

View file

@ -75,13 +75,18 @@ func GetHTTPErrorStatusCode(err error) int {
return statusCode 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 // MakeErrorHandler makes an HTTP handler that decodes a Docker error and
// returns it in the response. // returns it in the response.
func MakeErrorHandler(err error) http.HandlerFunc { func MakeErrorHandler(err error) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
statusCode := GetHTTPErrorStatusCode(err) statusCode := GetHTTPErrorStatusCode(err)
vars := mux.Vars(r) vars := mux.Vars(r)
if vars["version"] == "" || versions.GreaterThan(vars["version"], "1.23") { if apiVersionSupportsJSONErrors(vars["version"]) {
response := &types.ErrorResponse{ response := &types.ErrorResponse{
Message: err.Error(), Message: err.Error(),
} }

View file

@ -5,18 +5,11 @@ import (
"net/http" "net/http"
"runtime" "runtime"
"github.com/docker/docker/api/errors"
"github.com/docker/docker/api/types/versions" "github.com/docker/docker/api/types/versions"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
type badRequestError struct {
error
}
func (badRequestError) HTTPErrorStatusCode() int {
return http.StatusBadRequest
}
// VersionMiddleware is a middleware that // VersionMiddleware is a middleware that
// validates the client and server versions. // validates the client and server versions.
type VersionMiddleware struct { type VersionMiddleware struct {
@ -44,10 +37,10 @@ func (v VersionMiddleware) WrapHandler(handler func(ctx context.Context, w http.
} }
if versions.GreaterThan(apiVersion, v.defaultVersion) { 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) { 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) header := fmt.Sprintf("Docker/%s (%s)", v.serverVersion, runtime.GOOS)