diff --git a/context.go b/context.go index 1c76c0f6..b85f49d2 100644 --- a/context.go +++ b/context.go @@ -458,6 +458,16 @@ func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string) return getTyped[map[string][]string](c, key) } +// Iterate iterates the key/value pairs stored in c.Keys and executes the callback. +// It does nothing if c.Keys is nil or empty. +func (c *Context) Iterate(fn func(key string, value interface{})) { + c.mu.RLock() + for k, v := range c.Keys { + fn(k, v) + } + c.mu.RUnlock() +} + /************************************/ /************ INPUT DATA ************/ /************************************/ diff --git a/context_test.go b/context_test.go index ef0cfccd..c24e60de 100644 --- a/context_test.go +++ b/context_test.go @@ -276,6 +276,22 @@ func TestContextSetGetValues(t *testing.T) { assert.Exactly(t, 1, c.MustGet("intInterface").(int)) } +func TestContextIterate(t *testing.T) { + c, _ := CreateTestContext(httptest.NewRecorder()) + c.Set("string", "this is a string") + c.Set("int32", int32(-42)) + c.Set("int64", int64(42424242424242)) + c.Set("uint64", uint64(42)) + c.Set("float32", float32(4.2)) + c.Set("float64", 4.2) + var a interface{} = 1 + c.Set("intInterface", a) + + c.Iterate(func(key string, value interface{}) { + assert.Exactly(t, c.MustGet(key), value) + }) +} + func TestContextGetString(t *testing.T) { c, _ := CreateTestContext(httptest.NewRecorder()) c.Set("string", "this is a string")