diff --git a/plugin/config_test.go b/plugin/config_test.go index 6af76a93..0b1c6cdb 100644 --- a/plugin/config_test.go +++ b/plugin/config_test.go @@ -114,7 +114,7 @@ func Test_newCfgForManualLaunch(t *testing.T) { // as in the context of where this function is used we don't care. func runUncheckedDummyAcceptor(logger logging.Logger, listener net.Listener) { httpMux := http.NewServeMux() - httpMux.Handle(ipc.NewHijackAcceptor(logger, func(context.Context, io.ReadWriter) {})) + httpMux.Handle(ipc.NewHijackAcceptor(logger, func(context.Context, io.ReadWriteCloser) {})) server := &http.Server{Handler: httpMux} go func() { _ = server.Serve(listener) diff --git a/x/ipc/hijack.go b/x/ipc/hijack.go index df71bd70..bccf0bad 100644 --- a/x/ipc/hijack.go +++ b/x/ipc/hijack.go @@ -95,7 +95,7 @@ type CloseWriter interface { } type hijackHandler struct { - cb func(ctx context.Context, rw io.ReadWriter) + cb func(ctx context.Context, conn io.ReadWriteCloser) ackTimeout time.Duration logger logging.Logger } @@ -131,7 +131,7 @@ func (h *hijackHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - defer conn.Close() + defer func() { _ = conn.Close() }() // Might have already been called inside the callback -> ignore double close error done := make(chan struct{}) go func() { @@ -153,7 +153,8 @@ func (h *hijackHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - // Important: The server still owns net.Conn! When this handler returns, conn gets closed. + // The server still owns net.Conn. When this handler returns, conn gets closed. + // However, the callback might have to call Close() to abort/unblock any pending/blocking Read(). h.cb(r.Context(), conn) }() @@ -163,6 +164,6 @@ func (h *hijackHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } -func NewHijackAcceptor(logger logging.Logger, cb func(context.Context, io.ReadWriter)) (string, http.Handler) { +func NewHijackAcceptor(logger logging.Logger, cb func(context.Context, io.ReadWriteCloser)) (string, http.Handler) { return hijackPath, &hijackHandler{logger: logger, cb: cb, ackTimeout: hijackTimeout} } diff --git a/x/ipc/hijack_test.go b/x/ipc/hijack_test.go index 5ad044b8..6c6e63ba 100644 --- a/x/ipc/hijack_test.go +++ b/x/ipc/hijack_test.go @@ -43,7 +43,7 @@ func Test_hijacking(t *testing.T) { wait := make(chan struct{}) once := sync.OnceFunc(func() { close(wait) }) defer once() - httpMux.Handle(NewHijackAcceptor(testhelper.TestLogger(t), func(_ context.Context, closer io.ReadWriter) { + httpMux.Handle(NewHijackAcceptor(testhelper.TestLogger(t), func(_ context.Context, closer io.ReadWriteCloser) { ch <- closer <-wait }))