From dc3ca14f8adacc4619586109c2b3c54d4a466a5d Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Tue, 23 Jul 2024 01:08:51 +0200 Subject: [PATCH] rpc: add specific messages for network errors --- rpc/server.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/rpc/server.go b/rpc/server.go index 8d2522abab..42b59f8f6f 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -18,8 +18,9 @@ package rpc import ( "context" - "fmt" + "errors" "io" + "net" "sync" "sync/atomic" @@ -152,8 +153,8 @@ func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec) { reqs, batch, err := codec.readBatch() if err != nil { - if err != io.EOF { - resp := errorMessage(&invalidMessageError{fmt.Sprintf("parse error: %s", err.Error())}) + if msg := messageForReadError(err); msg != "" { + resp := errorMessage(&invalidMessageError{msg}) codec.writeJSON(ctx, resp, true) } return @@ -165,6 +166,20 @@ func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec) { } } +func messageForReadError(err error) string { + var netErr net.Error + if errors.As(err, &netErr) { + if netErr.Timeout() { + return "read timeout" + } else { + return "read error" + } + } else if err != io.EOF { + return "parse error" + } + return "" +} + // Stop stops reading new requests, waits for stopPendingRequestTimeout to allow pending // requests to finish, then closes all codecs which will cancel pending requests and // subscriptions.