From d8f51fb0ac7903072b0c367db7427db01a7d25e0 Mon Sep 17 00:00:00 2001 From: samuel Date: Wed, 26 Nov 2025 15:55:32 +0100 Subject: [PATCH] rpc: add request and response interceptors for middleware support --- ethereum_rpc_architecture.md | 493 ++++++++++++++++++ graphql/Screenshot 2025-11-26 at 13.52.56.png | Bin 0 -> 96193 bytes middleware_injection_strategies.md | 464 +++++++++++++++++ rpc/client.go | 78 ++- rpc/client_example_test.go | 51 ++ rpc/client_opt.go | 102 ++++ rpc/client_opt_test.go | 416 ++++++++++++++- 7 files changed, 1576 insertions(+), 28 deletions(-) create mode 100644 ethereum_rpc_architecture.md create mode 100644 graphql/Screenshot 2025-11-26 at 13.52.56.png create mode 100644 middleware_injection_strategies.md diff --git a/ethereum_rpc_architecture.md b/ethereum_rpc_architecture.md new file mode 100644 index 0000000000..fa77d20ee5 --- /dev/null +++ b/ethereum_rpc_architecture.md @@ -0,0 +1,493 @@ +# Go-Ethereum RPC Client Architecture Overview + +## 1. Client Structure & Initialization + +### Core Client struct (rpc/client.go) +The `Client` struct is the main entry point for RPC communication: + +```go +type Client struct { + idgen func() ID // subscription ID generator + isHTTP bool // connection type: http, ws, or ipc + services *serviceRegistry // service registry for method resolution + + idCounter atomic.Uint32 // counter for request IDs + + // Connection management + reconnectFunc reconnectFunc // function to establish new connections + writeConn jsonWriter // current connection (wrapped in httpConn, websocketCodec, or jsonCodec) + + // Dispatch system (for non-HTTP) + close chan struct{} // signal to close client + closing chan struct{} // closed when client is quitting + didClose chan struct{} // closed when client quits + reconnected chan ServerCodec // where write/reconnect sends new connections + readOp chan readOp // read messages from connection + readErr chan error // errors from read loop + reqInit chan *requestOp // register response IDs, takes write lock + reqSent chan error // signals write completion, releases write lock + reqTimeout chan *requestOp // removes response IDs when call timeout expires + + // Configuration + batchItemLimit int + batchResponseMaxSize int +} +``` + +### Initialization Flow + +1. **Dial** → **DialContext** → **DialOptions** (public API entry points) +2. **DialOptions** parses URL and creates appropriate transport: + - HTTP/HTTPS → `newClientTransportHTTP()` + - WS/WSS → `newClientTransportWS()` + - IPC → `newClientTransportIPC()` + - stdio → `newClientTransportIO()` + +3. **newClient()** creates the Client and initializes dispatch loop: + ```go + func newClient(initctx context.Context, cfg *clientConfig, connect reconnectFunc) (*Client, error) { + conn, err := connect(initctx) // Establish initial connection + if err != nil { + return nil, err + } + c := initClient(conn, new(serviceRegistry), cfg) + c.reconnectFunc = connect // Store reconnection function + return c, nil + } + ``` + +4. **initClient()** sets up the Client: + - Creates channels for dispatch + - Determines if HTTP or not (HTTP doesn't use dispatch loop) + - Launches dispatch goroutine for non-HTTP connections + +## 2. Configuration System (client_opt.go) + +### ClientOption Pattern +Uses functional options pattern for flexible configuration: + +```go +type ClientOption interface { + applyOption(*clientConfig) +} + +type clientConfig struct { + // HTTP settings + httpClient *http.Client + httpHeaders http.Header + httpAuth HTTPAuth + + // WebSocket options + wsDialer *websocket.Dialer + wsMessageSizeLimit *int64 + + // RPC handler options + idgen func() ID + batchItemLimit int + batchResponseLimit int +} +``` + +### Available Options +- `WithHTTPClient(client)` - Custom HTTP client +- `WithHTTPAuth(authFunc)` - Authentication provider called per request +- `WithHeader(key, value)` - Custom HTTP headers +- `WithHeaders(header)` - Multiple headers +- `WithWebsocketDialer(dialer)` - Custom WS dialer +- `WithWebsocketMessageSizeLimit(limit)` - WS message size limit +- `WithBatchItemLimit(limit)` - Batch request limits +- `WithBatchResponseSizeLimit(limit)` - Batch response size limits + +**Key Insight**: These options only configure the *client-side* creation. HTTPAuth is called during request preparation. + +## 3. Connection Handling + +### Three Main Transport Types + +#### A. HTTP Transport (http.go) +- **httpConn struct**: Wrapper that implements ServerCodec interface (but mostly stubbed) +- **HTTP-specific behavior**: + - No persistent connection (stateless) + - No dispatch loop needed + - Direct request/response cycle + - Headers managed in `httpConn.headers` (protected by mutex) + - Authentication via `HTTPAuth` function applied per-request + +- **Request flow** (sendHTTP): + ``` + Client.CallContext() + → Client.sendHTTP() // Directly send via HTTP + → httpConn.doRequest() // Marshal, create HTTP request, auth, execute + → http.Client.Do() // Execute HTTP request + → JSON decode response + → op.resp <- response + ``` + +#### B. WebSocket Transport (websocket.go) +- **websocketCodec struct**: Implements ServerCodec +- **Features**: + - Persistent connection + - Ping/pong keepalive (30s interval) + - Message size limit (default 32MB) + - Origin validation + - Connection pooling for write buffers + +- **Creation**: + ```go + newClientTransportWS() + → Create websocket.Dialer + → Apply custom headers and auth + → Return connect() function that: + - Calls dialer.DialContext() + - Wraps in newWebsocketCodec() + ``` + +- **Ping loop**: Separate goroutine in websocketCodec keeps connection alive + +#### C. IPC/Stdio Transport +- **jsonCodec struct**: Standard JSON codec wrapper +- Simpler than WS, used for local domain sockets and stdio + +### ServerCodec Interface (types.go) +The abstraction that all transports must implement: + +```go +type ServerCodec interface { + peerInfo() PeerInfo // Return connection metadata + readBatch() (msgs, isBatch, err) // Read and parse JSON-RPC messages + close() // Close the connection + jsonWriter // Embedded interface +} + +type jsonWriter interface { + writeJSON(ctx context.Context, msg interface{}, isError bool) error + closed() <-chan interface{} // Channel closed when connection ends + remoteAddr() string // Peer address +} +``` + +## 4. RPC Call Flow & Request Handling + +### Single Request Flow (CallContext) +``` +Client.CallContext(ctx, result, method, args...) + 1. Validate result is pointer or nil + 2. Create jsonrpcMessage with: + - Version: "2.0" + - ID: Next ID from counter + - Method: Requested method + - Params: JSON-encoded arguments + 3. Create requestOp with: + - IDs: [msg.ID] + - resp: channel for responses (buffered) + - err: any error + 4. IF HTTP: + → Client.sendHTTP(ctx, op, msg) + → httpConn.doRequest() sends HTTP POST + → response decoded and sent to op.resp + ELSE: + → Client.send(ctx, op, msg) + → Send op to reqInit channel (dispatch picks it up) + → Send msg on connection via c.write() + → Handler receives response, routes to op.resp + 5. op.wait(ctx, c) blocks until: + - Context canceled (timeout) + - Response received on op.resp + 6. Decode response and unmarshal into result +``` + +### Batch Request Flow (BatchCallContext) +Similar to single request but: +- Creates multiple jsonrpcMessage objects +- Sends all at once via sendBatchHTTP or send +- Maps response IDs back to original request elements +- Stores errors in BatchElem.Error fields + +### Dispatch Loop (Non-HTTP Only) +The dispatch goroutine (`Client.dispatch()`) is the heart of non-HTTP clients: + +```go +func (c *Client) dispatch(codec ServerCodec) { + conn := c.newClientConn(codec) // Create handler for this connection + go c.read(codec) // Launch read loop + + for { + select { + // Close signal + case <-c.close: + return + + // Read path: incoming messages + case op := <-c.readOp: // Messages from read loop + if op.batch: + conn.handler.handleBatch(op.msgs) + else: + conn.handler.handleMsg(op.msgs[0]) + + case err := <-c.readErr: // Read error + conn.close(err, lastOp) + reading = false + + // Reconnect path: new connection + case newcodec := <-c.reconnected: + conn.close(errClientReconnected, lastOp) + conn = c.newClientConn(newcodec) + conn.handler.addRequestOp(lastOp) + + // Send path: outgoing requests + case op := <-c.reqInit: // New request to send + reqInitLock = nil // Take write lock + conn.handler.addRequestOp(op) + + case err := <-c.reqSent: // Send complete + if err != nil: + conn.handler.removeRequestOp(lastOp) + reqInitLock = c.reqInit // Release write lock + + // Timeout path + case op := <-c.reqTimeout: + conn.handler.removeRequestOp(op) + } + } +} +``` + +### Read Loop +```go +func (c *Client) read(codec ServerCodec) { + for { + msgs, batch, err := codec.readBatch() // Block reading from connection + if err != nil { + c.readErr <- err + return + } + c.readOp <- readOp{msgs, batch} // Send to dispatch + } +} +``` + +### Handler (handler.go) +The handler processes messages and manages subscriptions: +- Maps request IDs to pending requestOp objects +- Routes responses to waiting callers +- Manages subscriptions +- Handles timeouts +- Processes batches with response limits + +## 5. WebSocket Connection Details + +### WebSocket Dial (DialWebsocket / DialOptions with WS URL) +1. Parse endpoint URL +2. Extract origin and basic auth from URL +3. Apply custom headers and auth from config +4. Create websocket.Dialer with: + - ReadBufferSize: 1024 + - WriteBufferSize: 1024 + - WriteBufferPool: Shared sync.Pool for efficiency + - Proxy: http.ProxyFromEnvironment +5. DialContext with prepared headers +6. Wrap connection in websocketCodec +7. Codec starts pingLoop goroutine + +### WebSocket Message Size +- Default read limit: 32 MB (wsDefaultReadLimit) +- Configurable via WithWebsocketMessageSizeLimit +- Connection reads with codec.SetReadLimit() + +### WebSocket Ping/Pong +- Ping sent every 30s when idle +- Pong handler resets read deadline +- Write timeout for ping: 5s +- Pong expected within: 30s + +### WebSocket Headers +- Origin header set (for CORS) +- User-Agent preserved +- Custom headers from config applied +- HTTP auth applied during connection + +## 6. Context & Header Management + +### HTTP Headers in Context (context_headers.go) +Headers can be injected via context for per-request customization: + +```go +// Create context with headers +ctx := NewContextWithHeaders(context.Background(), headers) + +// Called with HTTP client: +client.CallContext(ctx, result, "method") + +// In doRequest(), headers are extracted and merged +func headersFromContext(ctx context.Context) http.Header +func setHeaders(dst http.Header, src http.Header) http.Header +``` + +**Important**: Headers from context are merged with static headers, context headers override. + +### Client Context Extraction +Via `ClientFromContext(ctx)`: +- Returns the Client associated with a request context +- Used for "reverse calls" in handler methods +- Enables handler methods to call back out on the client + +## 7. Middleware Injection Points (Currently Limited) + +### Existing Extension Points + +1. **HTTPAuth Function** + - Called during every HTTP request + - Has full access to request headers + - Can add authentication headers + - **Limitation**: Only on HTTP, doesn't apply to WS + +2. **Custom HTTP Client** + - Can implement http.RoundTripper wrapper + - Can intercept all HTTP traffic + - Applied at HTTP client level + - **Limitation**: Only HTTP + +3. **Custom WebSocket Dialer** + - Can implement custom dialing logic + - Called for initial connection + reconnects + - Limited middleware capability + +4. **HTTP Headers via Context** + - Per-request header injection + - Applied in doRequest() + - Limited to header manipulation + +### Missing Middleware Patterns + +1. **No request/response interception for non-HTTP** + - WebSocket, IPC, Stdio bypass all middleware + - Direct ServerCodec interface prevents layering + +2. **No request/response logging hook** + - No way to intercept jsonrpcMessage before/after + - No built-in tracing/metrics + +3. **No error interception** + - No hook to transform or log errors + - No metrics collection + +4. **No subscription interception** + - Subscribe requests bypass middleware + - Subscription messages not intercepted + +5. **No connection-level hooks** + - No way to inject before connection established + - No way to hook connection failures + +## 8. Critical Code Paths for Middleware + +### HTTP Path (Most Middleware-Friendly) +``` +Client.CallContext() + → Client.sendHTTP() + → httpConn.doRequest() + 1. json.Marshal(msg) ← Can intercept request + 2. http.NewRequestWithContext() + 3. req.Header = hc.headers.Clone() + 4. setHeaders(req.Header, headersFromContext(ctx)) ← Can add headers + 5. if hc.auth != nil: hc.auth(req.Header) ← HTTPAuth hook + 6. resp, err := hc.client.Do(req) ← Standard HTTP transport + 7. json.Decoder(respBody).Decode(&resp) ← Can intercept response +``` + +### Non-HTTP Path (Limited Middleware) +``` +Client.send() + → Client.write() + → c.writeConn.writeJSON(ctx, msg, isError) + → jsonCodec.writeJSON() + → c.encode(v, isErrorResponse) ← Direct function call + +In parallel: +c.read() + → codec.readBatch() + → c.decode(&rawmsg) ← Direct function call +``` + +## 9. Key Insights for Middleware Design + +### 1. Transport Asymmetry +- HTTP has good middleware hooks (HTTPAuth, context headers, http.Client) +- WebSocket/IPC/Stdio have limited hooks (only custom dialer) +- Middleware needs transport-specific implementation + +### 2. Channel-Based Architecture +- Non-HTTP uses Go channels for dispatch +- Messages flow through defined channels (readOp, readErr, reqInit, reqSent) +- Could intercept at channel boundaries + +### 3. Two-Layer Codec System +- Transport layer (httpConn, websocketCodec, jsonCodec) - implements ServerCodec +- Handler layer (handler) - processes jsonrpcMessage structs +- Middleware could target either layer + +### 4. Request ID Tracking +- Every request assigned unique ID +- Can correlate requests/responses +- Enables request tracing + +### 5. Connection Lifecycle +- Connections can be replaced (reconnect) +- New handler created per connection (newClientConn) +- Connection metadata available (peerInfo) + +### 6. Error Handling +- Transport errors: returned from send/write +- RPC errors: returned in jsonError in response +- Both should be intercepted separately + +### 7. Subscription Complexity +- Subscriptions require persistent connection (not HTTP) +- Messages flowing to handler via readOp +- Notifier pattern for server-side pushes +- Need special handling for subscription responses + +## 10. Architecture Summary + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Application Code │ +│ client.CallContext() / client.Subscribe() / etc. │ +└────────────────────────┬────────────────────────────────────┘ + │ + ┌───────────────┼───────────────┐ + │ │ │ + ▼ ▼ ▼ + ┌────────┐ ┌──────────┐ ┌──────────┐ + │ HTTP │ │WebSocket │ │ IPC │ + │Handler │ │ Codec │ │ Codec │ + └────┬───┘ └────┬─────┘ └────┬─────┘ + │ │ │ + ▼ ▼ ▼ + ┌────────┐ ┌──────────┐ ┌──────────┐ + │httpConn│ │websocket │ │ jsonCodec│ + │ │ │ Codec │ │ │ + └────┬───┘ └────┬─────┘ └────┬─────┘ + │ │ │ + [sendHTTP] [Dispatch Loop] [Dispatch Loop] + │ │ │ + ▼ ▼ ▼ + [HTTP Req] [Channel Send] [Channel Send] + │ │ │ + │ └─────┬─────────┘ + │ │ + └───────────┬───────┘ + │ + [Network I/O] + │ + ┌───────────┴────────────┐ + ▼ ▼ + [RPC Server] [Other Clients] +``` + +This architecture shows that middleware injection points exist at: +- Application layer (wrapping Client) +- HTTP layer (custom client, headers, auth) +- Transport layer (custom dialer for WS) +- Handler layer (if we extend handler) +- Channel layer (if we intercept dispatch channels) diff --git a/graphql/Screenshot 2025-11-26 at 13.52.56.png b/graphql/Screenshot 2025-11-26 at 13.52.56.png new file mode 100644 index 0000000000000000000000000000000000000000..5c1493e1d8a119513d530dbfd701d7dcafb18b5c GIT binary patch literal 96193 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

LGAzcZTp2~ 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. -package rpc_test +package rpc import ( "context" + "errors" + "fmt" "net/http" - "time" - - "github.com/ethereum/go-ethereum/rpc" + "net/http/httptest" + "testing" ) -// This example configures a HTTP-based RPC client with two options - one setting the -// overall request timeout, the other adding a custom HTTP header to all requests. -func ExampleDialOptions() { - tokenHeader := rpc.WithHeader("x-token", "foo") - httpClient := rpc.WithHTTPClient(&http.Client{ - Timeout: 10 * time.Second, - }) +func TestRequestInterceptor(t *testing.T) { + // Setup a test server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "application/json") + fmt.Fprintln(w, `{"jsonrpc":"2.0","id":1,"result":"0x1"}`) + })) + defer server.Close() - ctx := context.Background() - c, err := rpc.DialOptions(ctx, "http://rpc.example.com", httpClient, tokenHeader) + // Test that request interceptor is called + var called bool + var capturedMethod string + client, err := DialOptions(context.Background(), server.URL, + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + called = true + capturedMethod = method + return nil + }), + ) if err != nil { - panic(err) + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err != nil { + t.Fatal(err) + } + + if !called { + t.Error("request interceptor was not called") + } + if capturedMethod != "test_method" { + t.Errorf("interceptor got method %q, want %q", capturedMethod, "test_method") + } +} + +func TestRequestInterceptorBlocks(t *testing.T) { + // Setup a test server that should never be hit + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Error("server should not have been called") + })) + defer server.Close() + + // Test that request interceptor can block the request + blockErr := errors.New("blocked by interceptor") + client, err := DialOptions(context.Background(), server.URL, + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + return blockErr + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err != blockErr { + t.Errorf("got error %v, want %v", err, blockErr) + } +} + +func TestRequestInterceptorChaining(t *testing.T) { + // Setup a test server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "application/json") + fmt.Fprintln(w, `{"jsonrpc":"2.0","id":1,"result":"0x1"}`) + })) + defer server.Close() + + // Test that multiple interceptors run in order + var order []int + client, err := DialOptions(context.Background(), server.URL, + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + order = append(order, 1) + return nil + }), + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + order = append(order, 2) + return nil + }), + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + order = append(order, 3) + return nil + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err != nil { + t.Fatal(err) + } + + if len(order) != 3 || order[0] != 1 || order[1] != 2 || order[2] != 3 { + t.Errorf("interceptors ran in wrong order: %v", order) + } +} + +func TestRequestInterceptorShortCircuit(t *testing.T) { + // Setup a test server that should never be hit + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Error("server should not have been called") + })) + defer server.Close() + + // Test that first error stops the chain + blockErr := errors.New("blocked") + var thirdCalled bool + client, err := DialOptions(context.Background(), server.URL, + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + return nil + }), + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + return blockErr + }), + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + thirdCalled = true + return nil + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err != blockErr { + t.Errorf("got error %v, want %v", err, blockErr) + } + if thirdCalled { + t.Error("third interceptor should not have been called") + } +} + +func TestResponseInterceptor(t *testing.T) { + // Setup a test server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "application/json") + fmt.Fprintln(w, `{"jsonrpc":"2.0","id":1,"result":"0x1"}`) + })) + defer server.Close() + + // Test that response interceptor is called with nil error on success + var called bool + var capturedMethod string + var capturedErr error + client, err := DialOptions(context.Background(), server.URL, + WithResponseInterceptor(func(ctx context.Context, method string, err error) error { + called = true + capturedMethod = method + capturedErr = err + return err + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err != nil { + t.Fatal(err) + } + + if !called { + t.Error("response interceptor was not called") + } + if capturedMethod != "test_method" { + t.Errorf("interceptor got method %q, want %q", capturedMethod, "test_method") + } + if capturedErr != nil { + t.Errorf("interceptor got error %v, want nil", capturedErr) + } +} + +func TestResponseInterceptorWithError(t *testing.T) { + // Setup a test server that returns an error + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "application/json") + fmt.Fprintln(w, `{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"test error"}}`) + })) + defer server.Close() + + // Test that response interceptor receives the error + var capturedErr error + client, err := DialOptions(context.Background(), server.URL, + WithResponseInterceptor(func(ctx context.Context, method string, err error) error { + capturedErr = err + return err + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err == nil { + t.Fatal("expected error") + } + + if capturedErr == nil { + t.Error("interceptor should have received error") + } + if capturedErr.Error() != "test error" { + t.Errorf("interceptor got error %q, want %q", capturedErr.Error(), "test error") + } +} + +func TestResponseInterceptorCanModifyError(t *testing.T) { + // Setup a test server that returns an error + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "application/json") + fmt.Fprintln(w, `{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"original error"}}`) + })) + defer server.Close() + + // Test that response interceptor can wrap the error + wrappedErr := errors.New("wrapped error") + client, err := DialOptions(context.Background(), server.URL, + WithResponseInterceptor(func(ctx context.Context, method string, err error) error { + if err != nil { + return wrappedErr + } + return err + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err != wrappedErr { + t.Errorf("got error %v, want %v", err, wrappedErr) + } +} + +func TestResponseInterceptorChaining(t *testing.T) { + // Setup a test server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "application/json") + fmt.Fprintln(w, `{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"original"}}`) + })) + defer server.Close() + + // Test that multiple response interceptors run in order and chain errors + client, err := DialOptions(context.Background(), server.URL, + WithResponseInterceptor(func(ctx context.Context, method string, err error) error { + if err != nil { + return fmt.Errorf("first: %w", err) + } + return err + }), + WithResponseInterceptor(func(ctx context.Context, method string, err error) error { + if err != nil { + return fmt.Errorf("second: %w", err) + } + return err + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + var result string + err = client.CallContext(context.Background(), &result, "test_method") + if err == nil { + t.Fatal("expected error") + } + + // Check that error was wrapped by both interceptors + errMsg := err.Error() + if errMsg != "second: first: original" { + t.Errorf("got error %q, expected chained wrapping", errMsg) + } +} + +func TestBatchCallWithInterceptors(t *testing.T) { + // Setup a test server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("content-type", "application/json") + fmt.Fprintln(w, `[{"jsonrpc":"2.0","id":1,"result":"0x1"},{"jsonrpc":"2.0","id":2,"result":"0x2"}]`) + })) + defer server.Close() + + // Test that interceptors are called for batch requests + var reqCalled, respCalled bool + var reqMethod, respMethod string + client, err := DialOptions(context.Background(), server.URL, + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + reqCalled = true + reqMethod = method + return nil + }), + WithResponseInterceptor(func(ctx context.Context, method string, err error) error { + respCalled = true + respMethod = method + return err + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + batch := []BatchElem{ + {Method: "test_method1", Args: []interface{}{}, Result: new(string)}, + {Method: "test_method2", Args: []interface{}{}, Result: new(string)}, + } + err = client.BatchCallContext(context.Background(), batch) + if err != nil { + t.Fatal(err) + } + + if !reqCalled { + t.Error("request interceptor was not called for batch") + } + if !respCalled { + t.Error("response interceptor was not called for batch") + } + // For batch calls, method should be empty string + if reqMethod != "" { + t.Errorf("request interceptor got method %q, want empty string for batch", reqMethod) + } + if respMethod != "" { + t.Errorf("response interceptor got method %q, want empty string for batch", respMethod) + } +} + +func TestNotifyWithInterceptors(t *testing.T) { + // Test that request interceptor can block notifications. + // We don't actually send the notification since Notify is primarily + // for persistent connections (WebSocket/IPC), not HTTP. + blockErr := errors.New("blocked notification") + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Error("server should not have been called") + })) + defer server.Close() + + client, err := DialOptions(context.Background(), server.URL, + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + if method == "test_notification" { + return blockErr + } + return nil + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + err = client.Notify(context.Background(), "test_notification") + if err != blockErr { + t.Errorf("got error %v, want %v", err, blockErr) + } +} + +func TestSubscribeWithInterceptors(t *testing.T) { + // Test that request interceptor can block subscription requests. + blockErr := errors.New("blocked subscribe") + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Error("server should not have been called") + })) + defer server.Close() + + client, err := DialOptions(context.Background(), server.URL, + WithRequestInterceptor(func(ctx context.Context, method string, args []interface{}) error { + if method == "eth_subscribe" { + return blockErr + } + return nil + }), + ) + if err != nil { + t.Fatal(err) + } + defer client.Close() + + ch := make(chan interface{}) + _, err = client.EthSubscribe(context.Background(), ch, "newHeads") + + // Should get ErrNotificationsUnsupported for HTTP client first, + // but if we had a WS client, the interceptor would block it. + // For now, just verify HTTP correctly returns unsupported. + if err != ErrNotificationsUnsupported { + t.Errorf("got error %v, want %v", err, ErrNotificationsUnsupported) } - c.Close() }