agent: fix container logs decoding for raw streams (#1535)

This commit is contained in:
henrygd
2026-01-08 13:57:56 -05:00
parent 78d742c712
commit 5da7a21119
2 changed files with 21 additions and 5 deletions

View File

@@ -694,7 +694,8 @@ func (dm *dockerManager) getLogs(ctx context.Context, containerID string) (strin
} }
var builder strings.Builder var builder strings.Builder
if err := decodeDockerLogStream(resp.Body, &builder); err != nil { multiplexed := resp.Header.Get("Content-Type") == "application/vnd.docker.multiplexed-stream"
if err := decodeDockerLogStream(resp.Body, &builder, multiplexed); err != nil {
return "", err return "", err
} }
@@ -706,7 +707,11 @@ func (dm *dockerManager) getLogs(ctx context.Context, containerID string) (strin
return logs, nil return logs, nil
} }
func decodeDockerLogStream(reader io.Reader, builder *strings.Builder) error { func decodeDockerLogStream(reader io.Reader, builder *strings.Builder, multiplexed bool) error {
if !multiplexed {
_, err := io.Copy(builder, io.LimitReader(reader, maxTotalLogSize))
return err
}
const headerSize = 8 const headerSize = 8
var header [headerSize]byte var header [headerSize]byte
totalBytesRead := 0 totalBytesRead := 0

View File

@@ -950,6 +950,7 @@ func TestDecodeDockerLogStream(t *testing.T) {
input []byte input []byte
expected string expected string
expectError bool expectError bool
multiplexed bool
}{ }{
{ {
name: "simple log entry", name: "simple log entry",
@@ -960,6 +961,7 @@ func TestDecodeDockerLogStream(t *testing.T) {
}, },
expected: "Hello World", expected: "Hello World",
expectError: false, expectError: false,
multiplexed: true,
}, },
{ {
name: "multiple frames", name: "multiple frames",
@@ -973,6 +975,7 @@ func TestDecodeDockerLogStream(t *testing.T) {
}, },
expected: "HelloWorld", expected: "HelloWorld",
expectError: false, expectError: false,
multiplexed: true,
}, },
{ {
name: "zero length frame", name: "zero length frame",
@@ -985,12 +988,20 @@ func TestDecodeDockerLogStream(t *testing.T) {
}, },
expected: "Hello", expected: "Hello",
expectError: false, expectError: false,
multiplexed: true,
}, },
{ {
name: "empty input", name: "empty input",
input: []byte{}, input: []byte{},
expected: "", expected: "",
expectError: false, expectError: false,
multiplexed: true,
},
{
name: "raw stream (not multiplexed)",
input: []byte("raw log content"),
expected: "raw log content",
multiplexed: false,
}, },
} }
@@ -998,7 +1009,7 @@ func TestDecodeDockerLogStream(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
reader := bytes.NewReader(tt.input) reader := bytes.NewReader(tt.input)
var builder strings.Builder var builder strings.Builder
err := decodeDockerLogStream(reader, &builder) err := decodeDockerLogStream(reader, &builder, tt.multiplexed)
if tt.expectError { if tt.expectError {
assert.Error(t, err) assert.Error(t, err)
@@ -1022,7 +1033,7 @@ func TestDecodeDockerLogStreamMemoryProtection(t *testing.T) {
reader := bytes.NewReader(input) reader := bytes.NewReader(input)
var builder strings.Builder var builder strings.Builder
err := decodeDockerLogStream(reader, &builder) err := decodeDockerLogStream(reader, &builder, true)
assert.Error(t, err) assert.Error(t, err)
assert.Contains(t, err.Error(), "log frame size") assert.Contains(t, err.Error(), "log frame size")
@@ -1056,7 +1067,7 @@ func TestDecodeDockerLogStreamMemoryProtection(t *testing.T) {
reader := bytes.NewReader(input) reader := bytes.NewReader(input)
var builder strings.Builder var builder strings.Builder
err := decodeDockerLogStream(reader, &builder) err := decodeDockerLogStream(reader, &builder, true)
// Should complete without error (graceful truncation) // Should complete without error (graceful truncation)
assert.NoError(t, err) assert.NoError(t, err)