mirror of
https://github.com/gin-gonic/gin.git
synced 2025-05-23 05:20:08 +08:00
add GetContext and ReleaseContext methods
- Add a method for retrieving a new *Context given an http.ResponseWriter and *http.Request. - Add a method for returning to the pool *Contexts which were provided by *Engine.GetRequest to the pool This allows contexts to be manipulated prior to handling whereas ServeHTTP does not provide the caller with access to the context.
This commit is contained in:
parent
51aea73ba0
commit
9c6f92b16b
29
gin.go
29
gin.go
@ -562,16 +562,39 @@ func (engine *Engine) RunListener(listener net.Listener) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServeHTTP conforms to the http.Handler interface.
|
// GetContext transforms a http.ResponseWriter and *http.Request into a new
|
||||||
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
// *Context without handling the request. This new context can then be passed
|
||||||
|
// to *Engine.HandleContext for handling.
|
||||||
|
//
|
||||||
|
// Any contexts created with this method are not automatically returned to the
|
||||||
|
// pool, so it is recommended that you call *Engine.ReleaseContext when you are
|
||||||
|
// done with it, though this is not required.
|
||||||
|
func (engine *Engine) GetContext(w http.ResponseWriter, req *http.Request) *Context {
|
||||||
c := engine.pool.Get().(*Context)
|
c := engine.pool.Get().(*Context)
|
||||||
c.writermem.reset(w)
|
c.writermem.reset(w)
|
||||||
c.Request = req
|
c.Request = req
|
||||||
c.reset()
|
c.reset()
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReleaseContext releases a context created with *Engine.GetContext back into
|
||||||
|
// the pool. Releasing a context marks it as available for reuse and therefore
|
||||||
|
// must only be called once the context is no longer in use. Releasing a context
|
||||||
|
// is not required, but it is recommended to improve performance. Calling this
|
||||||
|
// method on a context that is not created with *Engine.GetContext will result
|
||||||
|
// in undefined behavior.
|
||||||
|
func (engine *Engine) ReleaseContext(c *Context) {
|
||||||
|
engine.pool.Put(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServeHTTP conforms to the http.Handler interface.
|
||||||
|
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
|
c := engine.GetContext(w, req)
|
||||||
|
|
||||||
engine.handleHTTPRequest(c)
|
engine.handleHTTPRequest(c)
|
||||||
|
|
||||||
engine.pool.Put(c)
|
engine.ReleaseContext(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HandleContext re-enters a context that has been rewritten.
|
// HandleContext re-enters a context that has been rewritten.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user