fallback Context.Deadline() Context.Done() Context.Err() to Context.Request.Context() (#2769)
* fallback Context.Deadline() Context.Done() Context.Err() to Context.Request.Context() * update comments wording
This commit is contained in:
parent
11aa11a656
commit
9a575a4c05
24
context.go
24
context.go
@ -1161,22 +1161,28 @@ func (c *Context) SetAccepted(formats ...string) {
|
|||||||
/***** GOLANG.ORG/X/NET/CONTEXT *****/
|
/***** GOLANG.ORG/X/NET/CONTEXT *****/
|
||||||
/************************************/
|
/************************************/
|
||||||
|
|
||||||
// Deadline always returns that there is no deadline (ok==false),
|
// Deadline returns that there is no deadline (ok==false) when c.Request has no Context.
|
||||||
// maybe you want to use Request.Context().Deadline() instead.
|
|
||||||
func (c *Context) Deadline() (deadline time.Time, ok bool) {
|
func (c *Context) Deadline() (deadline time.Time, ok bool) {
|
||||||
return
|
if c.Request == nil || c.Request.Context() == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return c.Request.Context().Deadline()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Done always returns nil (chan which will wait forever),
|
// Done returns nil (chan which will wait forever) when c.Request has no Context.
|
||||||
// if you want to abort your work when the connection was closed
|
|
||||||
// you should use Request.Context().Done() instead.
|
|
||||||
func (c *Context) Done() <-chan struct{} {
|
func (c *Context) Done() <-chan struct{} {
|
||||||
return nil
|
if c.Request == nil || c.Request.Context() == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return c.Request.Context().Done()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Err always returns nil, maybe you want to use Request.Context().Err() instead.
|
// Err returns nil when c.Request has no Context.
|
||||||
func (c *Context) Err() error {
|
func (c *Context) Err() error {
|
||||||
return nil
|
if c.Request == nil || c.Request.Context() == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return c.Request.Context().Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Value returns the value associated with this context for key, or nil
|
// Value returns the value associated with this context for key, or nil
|
||||||
|
@ -2058,6 +2058,48 @@ func TestRemoteIPFail(t *testing.T) {
|
|||||||
assert.False(t, trust)
|
assert.False(t, trust)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestContextWithFallbackDeadlineFromRequestContext(t *testing.T) {
|
||||||
|
c := &Context{}
|
||||||
|
deadline, ok := c.Deadline()
|
||||||
|
assert.Zero(t, deadline)
|
||||||
|
assert.False(t, ok)
|
||||||
|
|
||||||
|
c2 := &Context{}
|
||||||
|
c2.Request, _ = http.NewRequest(http.MethodGet, "/", nil)
|
||||||
|
d := time.Now().Add(time.Second)
|
||||||
|
ctx, cancel := context.WithDeadline(context.Background(), d)
|
||||||
|
defer cancel()
|
||||||
|
c2.Request = c2.Request.WithContext(ctx)
|
||||||
|
deadline, ok = c2.Deadline()
|
||||||
|
assert.Equal(t, d, deadline)
|
||||||
|
assert.True(t, ok)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestContextWithFallbackDoneFromRequestContext(t *testing.T) {
|
||||||
|
c := &Context{}
|
||||||
|
assert.Nil(t, c.Done())
|
||||||
|
|
||||||
|
c2 := &Context{}
|
||||||
|
c2.Request, _ = http.NewRequest(http.MethodGet, "/", nil)
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
c2.Request = c2.Request.WithContext(ctx)
|
||||||
|
cancel()
|
||||||
|
assert.NotNil(t, <-c2.Done())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestContextWithFallbackErrFromRequestContext(t *testing.T) {
|
||||||
|
c := &Context{}
|
||||||
|
assert.Nil(t, c.Err())
|
||||||
|
|
||||||
|
c2 := &Context{}
|
||||||
|
c2.Request, _ = http.NewRequest(http.MethodGet, "/", nil)
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
c2.Request = c2.Request.WithContext(ctx)
|
||||||
|
cancel()
|
||||||
|
|
||||||
|
assert.EqualError(t, c2.Err(), context.Canceled.Error())
|
||||||
|
}
|
||||||
|
|
||||||
func TestContextWithFallbackValueFromRequestContext(t *testing.T) {
|
func TestContextWithFallbackValueFromRequestContext(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
Loading…
Reference in New Issue
Block a user