diff --git a/context.go b/context.go index 5c1aba5e..ede16fd4 100644 --- a/context.go +++ b/context.go @@ -1186,8 +1186,12 @@ func (c *Context) Value(key interface{}) interface{} { return c.Request } if keyAsString, ok := key.(string); ok { - val, _ := c.Get(keyAsString) - return val + if val, exists := c.Get(keyAsString); exists { + return val + } } - return nil + if c.Request == nil || c.Request.Context() == nil { + return nil + } + return c.Request.Context().Value(key) } diff --git a/context_test.go b/context_test.go index 93b58ee8..91228458 100644 --- a/context_test.go +++ b/context_test.go @@ -2057,3 +2057,17 @@ func TestRemoteIPFail(t *testing.T) { assert.Nil(t, ip) assert.False(t, trust) } + +func TestContextWithFallbackValueFromRequestContext(t *testing.T) { + var key struct{} + c := &Context{} + c.Request, _ = http.NewRequest("POST", "/", nil) + c.Request = c.Request.WithContext(context.WithValue(context.TODO(), key, "value")) + + assert.Equal(t, "value", c.Value(key)) + + c2 := &Context{} + c2.Request, _ = http.NewRequest("POST", "/", nil) + c2.Request = c2.Request.WithContext(context.WithValue(context.TODO(), "key", "value2")) + assert.Equal(t, "value2", c2.Value("key")) +}