Commit 9784c462 authored by Matthew Slipper's avatar Matthew Slipper Committed by GitHub

Merge pull request #2183 from mslipper/bugfix/proxyd-nil-cache

go/proxyd: Handle nil responses better
parents bf77e75b 527448bb
---
'@eth-optimism/proxyd': minor
---
Handle nil responses better
......@@ -16,7 +16,7 @@ func TestCaching(t *testing.T) {
require.NoError(t, err)
defer redis.Close()
hdlr := NewRPCResponseHandler(map[string]string{
hdlr := NewRPCResponseHandler(map[string]interface{}{
"eth_chainId": "0x420",
"net_version": "0x1234",
"eth_blockNumber": "0x64",
......@@ -123,10 +123,25 @@ func TestCaching(t *testing.T) {
})
}
hdlr.SetResponse("eth_blockNumber", "0x100")
time.Sleep(1500 * time.Millisecond)
resRaw, _, err := client.SendRPC("eth_blockNumber", nil)
RequireEqualJSON(t, []byte("{\"id\":999,\"jsonrpc\":\"2.0\",\"result\":\"0x100\"}"), resRaw)
t.Run("block numbers update", func(t *testing.T) {
hdlr.SetResponse("eth_blockNumber", "0x100")
time.Sleep(1500 * time.Millisecond)
resRaw, _, err := client.SendRPC("eth_blockNumber", nil)
require.NoError(t, err)
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 {
......
......@@ -33,18 +33,27 @@ func SingleResponseHandler(code int, response string) http.HandlerFunc {
type RPCResponseHandler struct {
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{
rpcResponses: rpcResponses,
}
}
func (h *RPCResponseHandler) SetResponse(method, response string) {
func (h *RPCResponseHandler) SetResponse(method string, response interface{}) {
h.mtx.Lock()
defer h.mtx.Unlock()
switch response.(type) {
case string:
case nil:
break
default:
panic("invalid response type")
}
h.rpcResponses[method] = response
}
......
......@@ -237,7 +237,7 @@ func (s *Server) handleSingleRPC(ctx context.Context, req *RPCReq) (*RPCRes, boo
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 {
log.Warn(
"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