From ced33cb53deac2ef9edd5aada0f1fcbfb85ec509 Mon Sep 17 00:00:00 2001 From: Charles Lowell <10964656+chlowell@users.noreply.github.com> Date: Fri, 27 Feb 2026 18:59:27 -0800 Subject: [PATCH 1/2] Go: RPC client loop expects stdout close --- go/internal/jsonrpc2/jsonrpc2.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/go/internal/jsonrpc2/jsonrpc2.go b/go/internal/jsonrpc2/jsonrpc2.go index 09505c06d..8ff86e481 100644 --- a/go/internal/jsonrpc2/jsonrpc2.go +++ b/go/internal/jsonrpc2/jsonrpc2.go @@ -4,8 +4,10 @@ import ( "bufio" "crypto/rand" "encoding/json" + "errors" "fmt" "io" + "os" "reflect" "sync" "sync/atomic" @@ -306,7 +308,7 @@ func (c *Client) readLoop() { line, err := reader.ReadString('\n') if err != nil { // Only log unexpected errors (not EOF or closed pipe during shutdown) - if err != io.EOF && c.running.Load() { + if err != io.EOF && !errors.Is(err, os.ErrClosed) && c.running.Load() { fmt.Printf("Error reading header: %v\n", err) } return From ba89a4e42e2476ecb1dee3496c9228b606e8f496 Mon Sep 17 00:00:00 2001 From: Charles Lowell <10964656+chlowell@users.noreply.github.com> Date: Mon, 2 Mar 2026 07:47:39 -0800 Subject: [PATCH 2/2] handle body read errors similarly --- go/internal/jsonrpc2/jsonrpc2.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/go/internal/jsonrpc2/jsonrpc2.go b/go/internal/jsonrpc2/jsonrpc2.go index 8ff86e481..be02bbbbd 100644 --- a/go/internal/jsonrpc2/jsonrpc2.go +++ b/go/internal/jsonrpc2/jsonrpc2.go @@ -333,7 +333,10 @@ func (c *Client) readLoop() { // Read message body body := make([]byte, contentLength) if _, err := io.ReadFull(reader, body); err != nil { - fmt.Printf("Error reading body: %v\n", err) + // Only log unexpected errors (not EOF or closed pipe during shutdown) + if err != io.EOF && !errors.Is(err, os.ErrClosed) && c.running.Load() { + fmt.Printf("Error reading body: %v\n", err) + } return }