Compare commits

...

3 Commits

Author SHA1 Message Date
Ben Turner
57d71ae429
Merge c17ae54e64177e6e340f475a40a2eb1a7a876e89 into c0048f645ee945c4db30593afdea10123e2c30a6 2025-10-22 09:34:32 -03:00
3ocene
c17ae54e64 add method for handling contexts without resetting
HandleContext resets contexts completely, overwriting any modifications since GetContext was called. This is undermines the purpose of being able to GetContexts separately, so this commit adds a new method which only resets the index, but leaves everything else intact.
2022-10-29 16:11:47 -07:00
3ocene
9c6f92b16b 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.
2022-10-29 15:24:43 -07:00

39
gin.go
View File

@ -633,16 +633,49 @@ func (engine *Engine) RunListener(listener net.Listener) (err error) {
return
}
// ServeHTTP conforms to the http.Handler interface.
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
// GetContext transforms a http.ResponseWriter and *http.Request into a new
// *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.writermem.reset(w)
c.Request = req
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)
}
// HandleContextAsIs handles the context as is without resetting it. This means
// that all key/values, middleware, etc. will be retained. This is useful for
// handling a context that has been created with *Engine.GetContext.
func (engine *Engine) HandleContextAsIs(c *Context) {
oldIndex := c.index
c.index = -1
engine.handleHTTPRequest(c)
c.index = oldIndex
}
// 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.pool.Put(c)
engine.ReleaseContext(c)
}
// HandleContext re-enters a context that has been rewritten.