diff --git a/ast/term.go b/ast/term.go index 9117da8f80..283ff94d39 100644 --- a/ast/term.go +++ b/ast/term.go @@ -228,16 +228,16 @@ func ValueToInterface(v Value, resolver Resolver) (interface{}, error) { return buf, nil case Object: buf := map[string]interface{}{} - err := v.Iter(func(k, v *Term) error { + err := v.Iter(func(k, value *Term) error { ki, err := ValueToInterface(k.Value, resolver) if err != nil { return err } asStr, stringKey := ki.(string) if !stringKey { - return fmt.Errorf("object value has non-string key (%T)", ki) + return fmt.Errorf("object value (%v) has non-string key of type (%T), value (%v)", v, ki, ki) } - vi, err := ValueToInterface(v.Value, resolver) + vi, err := ValueToInterface(value.Value, resolver) if err != nil { return err } diff --git a/server/server_test.go b/server/server_test.go index 4b122e5ee2..24b4508aad 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -59,6 +59,28 @@ func TestUnversionedGetHealth(t *testing.T) { } } +func TestInvalidKeyV1(t *testing.T) { + testPolicy := `package foo + + g[app] = zone { + app = ["foo"] + zone = 456 + } + ` + f := newFixture(t) + + if err := f.v1(http.MethodPut, "/policies/foo", testPolicy, 200, ""); err != nil { + t.Fatalf("Unexpected error while creating policy: %v", err) + } + + if err := f.v1(http.MethodGet, "/data/foo", "", 500, `{ + "code": "internal_error", + "message": "object value ({[\"foo\"]: 456}) has non-string key of type ([]interface {}), value ([foo])" +}`); err != nil { + t.Fatalf("Unexpected error from GET: %v", err) + } +} + func TestDataV0(t *testing.T) { testMod1 := `package test