diff --git a/pkg/api/server/handler_logging.go b/pkg/api/server/handler_logging.go index 38ee8321c1..2f62a28fd3 100644 --- a/pkg/api/server/handler_logging.go +++ b/pkg/api/server/handler_logging.go @@ -1,7 +1,10 @@ package server import ( + "bufio" + "errors" "io" + "net" "net/http" "time" @@ -33,6 +36,28 @@ func (l responseWriter) Write(b []byte) (int, error) { return l.ResponseWriter.Write(b) } +func (l responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if wrapped, ok := l.ResponseWriter.(http.Hijacker); ok { + return wrapped.Hijack() + } + + return nil, nil, errors.New("ResponseWriter does not support hijacking") +} + +func (l responseWriter) Header() http.Header { + return l.ResponseWriter.Header() +} + +func (l responseWriter) WriteHeader(statusCode int) { + l.ResponseWriter.WriteHeader(statusCode) +} + +func (l responseWriter) Flush() { + if wrapped, ok := l.ResponseWriter.(http.Flusher); ok { + wrapped.Flush() + } +} + func loggingHandler() mux.MiddlewareFunc { return func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/test/system/251-system-service.bats b/test/system/251-system-service.bats index b4bc6ceaad..7a772e2ef4 100644 --- a/test/system/251-system-service.bats +++ b/test/system/251-system-service.bats @@ -69,3 +69,22 @@ function teardown() { systemctl stop $SERVICE_NAME } + +# Regression test for https://github.com/containers/podman/issues/17749 +@test "podman-system-service --log-level=trace should be able to hijack" { + skip_if_remote "podman system service unavailable over remote" + + port=$(random_free_port) + URL=tcp://127.0.0.1:$port + + systemd-run --unit=$SERVICE_NAME $PODMAN --log-level=trace system service $URL --time=0 + wait_for_port 127.0.0.1 $port + + out=o-$(random_string) + cname=c-$(random_string) + run_podman --url $URL run --name $cname $IMAGE echo $out + assert "$output" == "$out" "service is able to hijack and stream output back" + + run_podman --url $URL rm $cname + systemctl stop $SERVICE_NAME +}