mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
api: return plain-text errors for deprecated API versions
Docker 25.0 (08e4e88482) deprecated API versions older than v1.24, and support was removed in Docker 26.0. As part of this deprecation, support for plain-text errors was also removed in commitffd877f948. So while we no longer support API versions older 1.24 [api.MinSupportedAPIVersion], a client may try to connect using an older version and expect a plain-text error instead of a JSON error. This would result in an "API version too old" error formatted in JSON being printed as-is. DOCKER_API_VERSION=v1.10 docker info --format '{{.ID}}' Error response from daemon: {"message":"client version 1.10 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version"} curl --unix-socket /var/run/docker.sock http://localhost/v1.10/info {"message":"client version 1.10 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version"} Note that this was only a problem for old API versions; unsupported API versions that were higher than the maximum version were already handled as JSON; DOCKER_API_VERSION=v1.99 docker info --format '{{.ID}}' Error response from daemon: client version 1.99 is too new. Maximum supported API version is 1.48 curl --unix-socket /var/run/docker.sock http://localhost/v1.99/info {"message":"client version 1.99 is too new. Maximum supported API version is 1.48"} Let's be nice, and return errors in plain-text to provide a more readable error to help the user understand the API version they're using is no longer supported. With this patch applied: DOCKER_API_VERSION=v1.10 docker info --format '{{.ID}}' Error response from daemon: client version 1.10 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version curl --unix-socket /var/run/docker.sock http://localhost/v1.10/info client version 1.10 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
"github.com/docker/docker/api/server/middleware"
|
||||
"github.com/docker/docker/api/server/router"
|
||||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/docker/api/types/versions"
|
||||
"github.com/docker/docker/dockerversion"
|
||||
"github.com/gorilla/mux"
|
||||
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
||||
@@ -57,9 +58,20 @@ func (s *Server) makeHTTPHandler(handler httputils.APIFunc, operation string) ht
|
||||
if statusCode >= 500 {
|
||||
log.G(ctx).Errorf("Handler for %s %s returned error: %v", r.Method, r.URL.Path, err)
|
||||
}
|
||||
_ = httputils.WriteJSON(w, statusCode, &types.ErrorResponse{
|
||||
Message: err.Error(),
|
||||
})
|
||||
// While we no longer support API versions older 1.24 [api.MinSupportedAPIVersion],
|
||||
// a client may try to connect using an older version and expect a plain-text error
|
||||
// instead of a JSON error. This would result in an "API version too old" error
|
||||
// formatted in JSON being printed as-is.
|
||||
//
|
||||
// Let's be nice, and return errors in plain-text to provide a more readable error
|
||||
// to help the user understand the API version they're using is no longer supported.
|
||||
if v := vars["version"]; v != "" && versions.LessThan(v, "1.24") {
|
||||
http.Error(w, err.Error(), statusCode)
|
||||
} else {
|
||||
_ = httputils.WriteJSON(w, statusCode, &types.ErrorResponse{
|
||||
Message: err.Error(),
|
||||
})
|
||||
}
|
||||
}
|
||||
}), operation).ServeHTTP
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
@@ -9,6 +10,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker/api/types/versions"
|
||||
"github.com/docker/docker/runconfig"
|
||||
"github.com/docker/docker/testutil"
|
||||
"github.com/docker/docker/testutil/request"
|
||||
@@ -64,7 +66,11 @@ func (s *DockerAPISuite) TestAPIClientVersionOldNotSupported(c *testing.T) {
|
||||
expected := fmt.Sprintf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", version, testEnv.DaemonVersion.MinAPIVersion)
|
||||
b, err := request.ReadBody(body)
|
||||
assert.NilError(c, err)
|
||||
assert.Equal(c, getErrorMessage(c, b), expected)
|
||||
errMessage := string(bytes.TrimSpace(b))
|
||||
if versions.GreaterThanOrEqualTo(version, "1.24") {
|
||||
errMessage = getErrorMessage(c, b)
|
||||
}
|
||||
assert.Equal(c, errMessage, expected)
|
||||
}
|
||||
|
||||
func (s *DockerAPISuite) TestAPIErrorJSON(c *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user