diff --git a/server/socket_helper.go b/server/socket_helper.go index f1a8c2e99..0cb3c6c32 100644 --- a/server/socket_helper.go +++ b/server/socket_helper.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "math" + "reflect" "strings" "time" @@ -39,8 +40,33 @@ func encode(v interface{}) (string, error) { return s, nil } +func encodeSlice(v interface{}) (string, error) { + rv := reflect.ValueOf(v) + res := make([]string, rv.Len()) + + for i := 0; i < rv.Len(); i++ { + var err error + if res[i], err = encode(rv.Index(i).Interface()); err != nil { + return "", err + } + } + + return fmt.Sprintf("[%s]", strings.Join(res, ",")), nil +} + func kv(p util.Param) string { - val, err := encode(p.Val) + var ( + val string + err error + ) + + // unwrap slices + if p.Val != nil && reflect.TypeOf(p.Val).Kind() == reflect.Slice { + val, err = encodeSlice(p.Val) + } else { + val, err = encode(p.Val) + } + if err != nil { panic(err) } diff --git a/server/socket_test.go b/server/socket_test.go index ffe7368f0..dd40b9456 100644 --- a/server/socket_test.go +++ b/server/socket_test.go @@ -31,3 +31,20 @@ func TestEncode(t *testing.T) { assert.Equal(t, tc.out, out) } } + +func TestEncodeSlice(t *testing.T) { + tc := []struct { + in interface{} + out string + }{ + {[]string{"a", "b"}, `["a","b"]`}, + {[2]int64{1, 2}, `[1,2]`}, + {[]float64{1, math.NaN()}, `[1,null]`}, + } + + for _, tc := range tc { + out, err := encodeSlice(tc.in) + assert.NoError(t, err) + assert.Equal(t, tc.out, out) + } +}