Browse code

daemon/server/router: fix "no stream selected" error and status

Tweak the wording, and make sure we return a 400 status, not a 500

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

Sebastiaan van Stijn authored on 2026/02/26 01:00:35
Showing 3 changed files
... ...
@@ -192,7 +192,7 @@ func (c *containerRouter) getContainersLogs(ctx context.Context, w http.Response
192 192
 	// with the appropriate status code.
193 193
 	stdout, stderr := httputils.BoolValue(r, "stdout"), httputils.BoolValue(r, "stderr")
194 194
 	if !stdout && !stderr {
195
-		return errdefs.InvalidParameter(errors.New("Bad parameters: you must choose at least one stream"))
195
+		return errdefs.InvalidParameter(errors.New("must specify at least one of 'stdout' or 'stderr'"))
196 196
 	}
197 197
 
198 198
 	containerName := vars["name"]
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	"github.com/moby/moby/v2/daemon/server/backend"
12 12
 	"github.com/moby/moby/v2/daemon/server/httputils"
13 13
 	"github.com/moby/moby/v2/daemon/server/httputils/logstream"
14
+	"github.com/moby/moby/v2/errdefs"
14 15
 )
15 16
 
16 17
 // swarmLogs takes an http response, request, and selector, and writes the logs
... ...
@@ -23,7 +24,7 @@ func (sr *swarmRouter) swarmLogs(ctx context.Context, w http.ResponseWriter, r *
23 23
 	// with the appropriate status code.
24 24
 	stdout, stderr := httputils.BoolValue(r, "stdout"), httputils.BoolValue(r, "stderr")
25 25
 	if !stdout && !stderr {
26
-		return errors.New("Bad parameters: you must choose at least one stream")
26
+		return errdefs.InvalidParameter(errors.New("must specify at least one of 'stdout' or 'stderr'"))
27 27
 	}
28 28
 
29 29
 	// there is probably a neater way to manufacture the LogsOptions
... ...
@@ -11,6 +11,7 @@ import (
11 11
 	"testing"
12 12
 	"time"
13 13
 
14
+	cerrdefs "github.com/containerd/errdefs"
14 15
 	"github.com/moby/moby/api/pkg/stdcopy"
15 16
 	"github.com/moby/moby/client"
16 17
 	"github.com/moby/moby/v2/integration-cli/cli"
... ...
@@ -63,7 +64,8 @@ func (s *DockerAPISuite) TestLogsAPINoStdoutNorStderr(c *testing.T) {
63 63
 	defer apiClient.Close()
64 64
 
65 65
 	_, err = apiClient.ContainerLogs(testutil.GetContext(c), name, client.ContainerLogsOptions{})
66
-	assert.ErrorContains(c, err, "Bad parameters: you must choose at least one stream")
66
+	assert.ErrorType(c, err, cerrdefs.IsInvalidArgument)
67
+	assert.ErrorContains(c, err, "must specify at least one of 'stdout' or 'stderr'")
67 68
 }
68 69
 
69 70
 // Regression test for #12704