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:
3ocene 2022-10-29 15:24:43 -07:00
parent 51aea73ba0
commit 9c6f92b16b

29
gin.go
View File

@ -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.