mirror of
https://github.com/gin-gonic/gin.git
synced 2025-10-22 01:12:16 +08:00
It makes possible to correctly cancel handlers when request cancelled (connection closed, etc.) Try to extract value from request context when it was not found in gin context Signed-off-by: Vladimir Stolyarov <xakep6666@gmail.com>
63 lines
2.0 KiB
Go
63 lines
2.0 KiB
Go
// Copyright 2018 Gin Core Team. All rights reserved.
|
|
// Use of this source code is governed by a MIT style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build go1.7
|
|
|
|
package gin
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin/render"
|
|
"time"
|
|
)
|
|
|
|
// PureJSON serializes the given struct as JSON into the response body.
|
|
// PureJSON, unlike JSON, does not replace special html characters with their unicode entities.
|
|
func (c *Context) PureJSON(code int, obj interface{}) {
|
|
c.Render(code, render.PureJSON{Data: obj})
|
|
}
|
|
|
|
/*****************************************/
|
|
/***** STDLIB CONTEXT IMPLEMENTATION *****/
|
|
/*****************************************/
|
|
|
|
// Deadline returns the time when work done on behalf of this context
|
|
// should be canceled. Deadline returns ok==false when no deadline is
|
|
// set. Successive calls to Deadline return the same results.
|
|
func (c *Context) Deadline() (deadline time.Time, ok bool) {
|
|
return c.Request.Context().Deadline()
|
|
}
|
|
|
|
// Done returns a channel that's closed when work done on behalf of this
|
|
// context should be canceled. Done may return nil if this context can
|
|
// never be canceled. Successive calls to Done return the same value.
|
|
func (c *Context) Done() <-chan struct{} {
|
|
return c.Request.Context().Done()
|
|
}
|
|
|
|
// Err returns a non-nil error value after Done is closed,
|
|
// successive calls to Err return the same error.
|
|
// If Done is not yet closed, Err returns nil.
|
|
// If Done is closed, Err returns a non-nil error explaining why:
|
|
// Canceled if the context was canceled
|
|
// or DeadlineExceeded if the context's deadline passed.
|
|
func (c *Context) Err() error {
|
|
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
|
|
// the same key returns the same result.
|
|
func (c *Context) Value(key interface{}) interface{} {
|
|
if key == 0 {
|
|
return c.Request
|
|
}
|
|
if keyAsString, ok := key.(string); ok {
|
|
val, exists := c.Get(keyAsString)
|
|
if exists {
|
|
return val
|
|
}
|
|
}
|
|
return c.Request.Context().Value(key)
|
|
}
|