diff --git a/pkg/api/handlers/compat/containers_top.go b/pkg/api/handlers/compat/containers_top.go index 9653906277..8befc6b944 100644 --- a/pkg/api/handlers/compat/containers_top.go +++ b/pkg/api/handlers/compat/containers_top.go @@ -88,11 +88,22 @@ loop: // break out of for/select infinite` loop } for _, line := range output[1:] { - process := strings.Split(line, "\t") - for i := range process { - process[i] = strings.TrimSpace(process[i]) + process := strings.FieldsFunc(line, func(r rune) bool { + return r == ' ' || r == '\t' + }) + if len(process) > len(body.Titles) { + // Docker assumes the last entry is *always* command + // Which can include spaces. + // All other descriptors are assumed to NOT include extra spaces. + // So combine any extras. + cmd := strings.Join(process[len(body.Titles)-1:], " ") + var finalProc []string + finalProc = append(finalProc, process[:len(body.Titles)-1]...) + finalProc = append(finalProc, cmd) + body.Processes = append(body.Processes, finalProc) + } else { + body.Processes = append(body.Processes, process) } - body.Processes = append(body.Processes, process) } if err := encoder.Encode(body); err != nil { diff --git a/test/apiv2/20-containers.at b/test/apiv2/20-containers.at index 7aca66797f..011c8f289b 100644 --- a/test/apiv2/20-containers.at +++ b/test/apiv2/20-containers.at @@ -144,6 +144,14 @@ if root; then podman rm -f $CTRNAME fi +# Verify that compat top endpoint combines multi-entry COMMAND lines +CTRNAME=testtopproc +podman run --name $CTRNAME -d $IMAGE sleep 25 +t GET containers/$CTRNAME/top?stream=false 200 \ + .Processes.[0].[6]="00:00:00" \ + .Processes.[0].[7]="sleep 25" +podman rm -f -t0 $CTRNAME + CTRNAME=test123 podman run --name $CTRNAME -d $IMAGE top t GET libpod/containers/$CTRNAME/top?ps_args=--invalid 500 \