Commit 527448bb authored by Matthew Slipper's avatar Matthew Slipper

go/proxyd: Handle nil responses better

parent e52c36f0
---
'@eth-optimism/proxyd': minor
---
Handle nil responses better
...@@ -16,7 +16,7 @@ func TestCaching(t *testing.T) { ...@@ -16,7 +16,7 @@ func TestCaching(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer redis.Close() defer redis.Close()
hdlr := NewRPCResponseHandler(map[string]string{ hdlr := NewRPCResponseHandler(map[string]interface{}{
"eth_chainId": "0x420", "eth_chainId": "0x420",
"net_version": "0x1234", "net_version": "0x1234",
"eth_blockNumber": "0x64", "eth_blockNumber": "0x64",
...@@ -123,10 +123,25 @@ func TestCaching(t *testing.T) { ...@@ -123,10 +123,25 @@ func TestCaching(t *testing.T) {
}) })
} }
t.Run("block numbers update", func(t *testing.T) {
hdlr.SetResponse("eth_blockNumber", "0x100") hdlr.SetResponse("eth_blockNumber", "0x100")
time.Sleep(1500 * time.Millisecond) time.Sleep(1500 * time.Millisecond)
resRaw, _, err := client.SendRPC("eth_blockNumber", nil) resRaw, _, err := client.SendRPC("eth_blockNumber", nil)
require.NoError(t, err)
RequireEqualJSON(t, []byte("{\"id\":999,\"jsonrpc\":\"2.0\",\"result\":\"0x100\"}"), resRaw) RequireEqualJSON(t, []byte("{\"id\":999,\"jsonrpc\":\"2.0\",\"result\":\"0x100\"}"), resRaw)
backend.Reset()
})
t.Run("nil responses should not be cached", func(t *testing.T) {
hdlr.SetResponse("eth_getBlockByNumber", nil)
resRaw, _, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x123"})
require.NoError(t, err)
resCache, _, err := client.SendRPC("eth_getBlockByNumber", []interface{}{"0x123"})
require.NoError(t, err)
RequireEqualJSON(t, []byte("{\"id\":999,\"jsonrpc\":\"2.0\",\"result\":null}"), resRaw)
RequireEqualJSON(t, resRaw, resCache)
require.Equal(t, 2, countRequests(backend, "eth_getBlockByNumber"))
})
} }
func countRequests(backend *MockBackend, name string) int { func countRequests(backend *MockBackend, name string) int {
......
...@@ -33,18 +33,27 @@ func SingleResponseHandler(code int, response string) http.HandlerFunc { ...@@ -33,18 +33,27 @@ func SingleResponseHandler(code int, response string) http.HandlerFunc {
type RPCResponseHandler struct { type RPCResponseHandler struct {
mtx sync.RWMutex mtx sync.RWMutex
rpcResponses map[string]string rpcResponses map[string]interface{}
} }
func NewRPCResponseHandler(rpcResponses map[string]string) *RPCResponseHandler { func NewRPCResponseHandler(rpcResponses map[string]interface{}) *RPCResponseHandler {
return &RPCResponseHandler{ return &RPCResponseHandler{
rpcResponses: rpcResponses, rpcResponses: rpcResponses,
} }
} }
func (h *RPCResponseHandler) SetResponse(method, response string) { func (h *RPCResponseHandler) SetResponse(method string, response interface{}) {
h.mtx.Lock() h.mtx.Lock()
defer h.mtx.Unlock() defer h.mtx.Unlock()
switch response.(type) {
case string:
case nil:
break
default:
panic("invalid response type")
}
h.rpcResponses[method] = response h.rpcResponses[method] = response
} }
......
...@@ -237,7 +237,7 @@ func (s *Server) handleSingleRPC(ctx context.Context, req *RPCReq) (*RPCRes, boo ...@@ -237,7 +237,7 @@ func (s *Server) handleSingleRPC(ctx context.Context, req *RPCReq) (*RPCRes, boo
return NewRPCErrorRes(req.ID, err), false return NewRPCErrorRes(req.ID, err), false
} }
if backendRes.Error == nil { if backendRes.Error == nil && backendRes.Result != nil {
if err = s.cache.PutRPC(ctx, req, backendRes); err != nil { if err = s.cache.PutRPC(ctx, req, backendRes); err != nil {
log.Warn( log.Warn(
"cache put error", "cache put error",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment