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
26
context.go
26
context.go
@ -1161,23 +1161,29 @@ func (c *Context) SetAccepted(formats ...string) {
|
||||
/***** GOLANG.ORG/X/NET/CONTEXT *****/
|
||||
/************************************/
|
||||
|
||||
// Deadline always returns that there is no deadline (ok==false),
|
||||
// maybe you want to use Request.Context().Deadline() instead.
|
||||
// Deadline returns that there is no deadline (ok==false) when c.Request has no Context.
|
||||
func (c *Context) Deadline() (deadline time.Time, ok bool) {
|
||||
if c.Request == nil || c.Request.Context() == nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Done always returns nil (chan which will wait forever),
|
||||
// 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{} {
|
||||
return nil
|
||||
return c.Request.Context().Deadline()
|
||||
}
|
||||
|
||||
// Err always returns nil, maybe you want to use Request.Context().Err() instead.
|
||||
func (c *Context) Err() error {
|
||||
// Done returns nil (chan which will wait forever) when c.Request has no Context.
|
||||
func (c *Context) Done() <-chan struct{} {
|
||||
if c.Request == nil || c.Request.Context() == nil {
|
||||
return nil
|
||||
}
|
||||
return c.Request.Context().Done()
|
||||
}
|
||||
|
||||
// Err returns nil when c.Request has no Context.
|
||||
func (c *Context) Err() error {
|
||||
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
|
||||
// if no value is associated with key. Successive calls to Value with
|
||||
|
@ -2058,6 +2058,48 @@ func TestRemoteIPFail(t *testing.T) {
|
||||
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) {
|
||||
tests := []struct {
|
||||
name string
|
||||
|
Loading…
Reference in New Issue
Block a user