Skip to content

Commit 85c0ab1

Browse files
authored
fix: jsonrpc nil bug (#61)
1 parent 15656ac commit 85c0ab1

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

jsonrpc.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -596,11 +596,21 @@ func Params(params ...interface{}) interface{} {
596596
case reflect.Array:
597597
finalParams = params[0]
598598
case reflect.Slice:
599-
finalParams = params[0]
599+
// Handle nil slices by converting them to empty arrays for JSON-RPC compliance
600+
if reflect.ValueOf(params[0]).IsNil() {
601+
finalParams = []interface{}{}
602+
} else {
603+
finalParams = params[0]
604+
}
600605
case reflect.Interface:
601606
finalParams = params[0]
602607
case reflect.Map:
603-
finalParams = params[0]
608+
// Handle nil maps by converting them to empty objects for JSON-RPC compliance
609+
if reflect.ValueOf(params[0]).IsNil() {
610+
finalParams = map[string]interface{}{}
611+
} else {
612+
finalParams = params[0]
613+
}
604614
default: // everything else must stay in an array (int, string, etc)
605615
finalParams = params
606616
}

jsonrpc_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type RequestData struct {
2525
var responseBody = ""
2626

2727
var httpStatusCode = http.StatusOK
28+
2829
var httpServer *httptest.Server
2930

3031
// start the test-http server and stop it when tests are finished
@@ -173,6 +174,36 @@ func TestRpcClient_Call(t *testing.T) {
173174
},
174175
})
175176
check.Equal(`{"method":"nestedStruct","params":{"name":"Mars","properties":{"distance":54600000,"color":"red"}},"id":0,"jsonrpc":"2.0"}`, (<-requestChan).body)
177+
178+
// test nil slice handling for JSON-RPC compliance
179+
var nilSlice []int = nil
180+
rpcClient.Call(context.Background(), "nilSliceParam", nilSlice)
181+
check.Equal(`{"method":"nilSliceParam","params":[],"id":0,"jsonrpc":"2.0"}`, (<-requestChan).body)
182+
183+
// test nil map handling for JSON-RPC compliance
184+
var nilMap map[string]interface{} = nil
185+
rpcClient.Call(context.Background(), "nilMapParam", nilMap)
186+
check.Equal(`{"method":"nilMapParam","params":{},"id":0,"jsonrpc":"2.0"}`, (<-requestChan).body)
187+
188+
// test empty slice
189+
emptySlice := []int{}
190+
rpcClient.Call(context.Background(), "emptySliceParam", emptySlice)
191+
check.Equal(`{"method":"emptySliceParam","params":[],"id":0,"jsonrpc":"2.0"}`, (<-requestChan).body)
192+
193+
// test empty map
194+
emptyMap := map[string]interface{}{}
195+
rpcClient.Call(context.Background(), "emptyMapParam", emptyMap)
196+
check.Equal(`{"method":"emptyMapParam","params":{},"id":0,"jsonrpc":"2.0"}`, (<-requestChan).body)
197+
198+
// test nil slice of strings
199+
var nilStringSlice []string = nil
200+
rpcClient.Call(context.Background(), "nilStringSliceParam", nilStringSlice)
201+
check.Equal(`{"method":"nilStringSliceParam","params":[],"id":0,"jsonrpc":"2.0"}`, (<-requestChan).body)
202+
203+
// test nil map with string keys
204+
var nilStringMap map[string]string = nil
205+
rpcClient.Call(context.Background(), "nilStringMapParam", nilStringMap)
206+
check.Equal(`{"method":"nilStringMapParam","params":{},"id":0,"jsonrpc":"2.0"}`, (<-requestChan).body)
176207
}
177208

178209
func TestRpcClient_CallBatch(t *testing.T) {

0 commit comments

Comments
 (0)