Browse code

client: remove version-gate for JSON response errors

JSON errors were introduced in API 1.24, and daemons running older versions of
the API would return errors as plain-text. However, such API versions would
also send the corresponding content-type header (text/plain), so we don't
really need to make the code version-dependent; there's already fallbacks
in place to handle JSON-responses that don't use the expected format, in
which case we produce a generic status-code error.

Before this patch, the client would print JSON-responses as-is when the
daemon returned an "API version too old" error;

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"}

With this patch, the client detects that the response is JSON, and prints
a friendlier error-message to help the user discover their client is too
old;

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

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2025/03/20 20:42:20
Showing 2 changed files
... ...
@@ -237,7 +237,7 @@ func (cli *Client) checkResponseErr(serverResp *http.Response) (retErr error) {
237 237
 	}
238 238
 
239 239
 	var daemonErr error
240
-	if serverResp.Header.Get("Content-Type") == "application/json" && (cli.version == "" || versions.GreaterThan(cli.version, "1.23")) {
240
+	if serverResp.Header.Get("Content-Type") == "application/json" {
241 241
 		var errorResponse types.ErrorResponse
242 242
 		if err := json.Unmarshal(body, &errorResponse); err != nil {
243 243
 			return errors.Wrap(err, "Error reading JSON")
... ...
@@ -132,12 +132,15 @@ func TestResponseErrors(t *testing.T) {
132 132
 			expected:    `Error response from daemon: Some error occurred`,
133 133
 		},
134 134
 		{
135
-			// API versions before 1.24 did not support JSON errors, and return response as-is.
135
+			// API versions before 1.24 did not support JSON errors. Technically,
136
+			// we no longer downgrade to older API versions, but we make an
137
+			// exception for errors so that older clients would print a more
138
+			// readable error.
136 139
 			doc:         "JSON error on old API",
137 140
 			apiVersion:  "1.23",
138
-			contentType: "application/json",
139
-			response:    `{"message":"Some error occurred"}`,
140
-			expected:    `Error response from daemon: {"message":"Some error occurred"}`,
141
+			contentType: "text/plain; charset=utf-8",
142
+			response:    `client version 1.10 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version`,
143
+			expected:    `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`,
141 144
 		},
142 145
 		{
143 146
 			doc:         "plain-text error",