diff options
author | Ashley Cui <acui@redhat.com> | 2020-09-16 13:53:15 -0400 |
---|---|---|
committer | Ashley Cui <acui@redhat.com> | 2020-09-16 13:53:15 -0400 |
commit | e1ac8d9aa22e11c223691f66331e6832c145996d (patch) | |
tree | 687e000af580508d1e189391e3d0f092659c7400 /pkg | |
parent | 0d14d7b7152ac7a0856fcbb2bbc0f7238ab182d6 (diff) | |
download | podman-e1ac8d9aa22e11c223691f66331e6832c145996d.tar.gz podman-e1ac8d9aa22e11c223691f66331e6832c145996d.tar.bz2 podman-e1ac8d9aa22e11c223691f66331e6832c145996d.zip |
WIP: Fix remote logs
Docker compatibility - logs endpoint does not write stream headers if container has a tty
Signed-off-by: Ashley Cui <acui@redhat.com>
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/api/handlers/compat/containers_logs.go | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/pkg/api/handlers/compat/containers_logs.go b/pkg/api/handlers/compat/containers_logs.go index f6d4a518e..d24b7d959 100644 --- a/pkg/api/handlers/compat/containers_logs.go +++ b/pkg/api/handlers/compat/containers_logs.go @@ -105,6 +105,18 @@ func LogsFromContainer(w http.ResponseWriter, r *http.Request) { var frame strings.Builder header := make([]byte, 8) + + writeHeader := true + // Docker does not write stream headers iff the container has a tty. + if !utils.IsLibpodRequest(r) { + inspectData, err := ctnr.Inspect(false) + if err != nil { + utils.InternalServerError(w, errors.Wrapf(err, "Failed to obtain logs for Container '%s'", name)) + return + } + writeHeader = !inspectData.Config.Tty + } + for line := range logChannel { if _, found := r.URL.Query()["until"]; found { if line.Time.After(until) { @@ -138,10 +150,13 @@ func LogsFromContainer(w http.ResponseWriter, r *http.Request) { } frame.WriteString(line.Msg) - binary.BigEndian.PutUint32(header[4:], uint32(frame.Len())) - if _, err := w.Write(header[0:8]); err != nil { - log.Errorf("unable to write log output header: %q", err) + if writeHeader { + binary.BigEndian.PutUint32(header[4:], uint32(frame.Len())) + if _, err := w.Write(header[0:8]); err != nil { + log.Errorf("unable to write log output header: %q", err) + } } + if _, err := io.WriteString(w, frame.String()); err != nil { log.Errorf("unable to write frame string: %q", err) } |