| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- // ⚡️ Fiber is an Express inspired web framework written in Go with ☕️
- // 🤖 GitHub Repository: https://github.com/gofiber/fiber
- // 📌 API Documentation: https://docs.gofiber.io
- package fiber
- import (
- "github.com/valyala/fasthttp"
- )
- // CustomCtx extends Ctx with the additional methods required by Fiber's
- // internals and middleware helpers.
- type CustomCtx interface {
- Ctx
- // Reset is a method to reset context fields by given request when to use server handlers.
- Reset(fctx *fasthttp.RequestCtx)
- // release is called before returning the context to the pool.
- release()
- // Abandon marks the context as abandoned. An abandoned context will not be
- // returned to the pool when ReleaseCtx is called. This is used by the timeout
- // middleware to return immediately while the handler goroutine continues.
- // The cleanup goroutine must call ForceRelease when the handler finishes.
- Abandon()
- // IsAbandoned returns true if the context has been abandoned.
- IsAbandoned() bool
- // ForceRelease releases an abandoned context back to the pool.
- // Must only be called after the handler goroutine has completely finished.
- ForceRelease()
- // Methods to use with next stack.
- getMethodInt() int
- getIndexRoute() int
- getTreePathHash() int
- getDetectionPath() string
- getPathOriginal() string
- getValues() *[maxParams]string
- getMatched() bool
- getSkipNonUseRoutes() bool
- setIndexHandler(handler int)
- setIndexRoute(route int)
- setMatched(matched bool)
- setSkipNonUseRoutes(skip bool)
- setRoute(route *Route)
- }
- // NewDefaultCtx constructs the default context implementation bound to the
- // provided application.
- func NewDefaultCtx(app *App) *DefaultCtx {
- // return ctx
- ctx := &DefaultCtx{
- // Set app reference
- app: app,
- }
- ctx.DefaultReq.c = ctx
- ctx.DefaultRes.c = ctx
- return ctx
- }
- // AcquireCtx retrieves a new Ctx from the pool.
- func (app *App) AcquireCtx(fctx *fasthttp.RequestCtx) CustomCtx {
- ctx, ok := app.pool.Get().(CustomCtx)
- if !ok {
- panic(errCustomCtxTypeAssertion)
- }
- if app.hasCustomCtx {
- if setter, ok := ctx.(interface{ setHandlerCtx(CustomCtx) }); ok {
- setter.setHandlerCtx(ctx)
- }
- }
- ctx.Reset(fctx)
- return ctx
- }
- // ReleaseCtx releases the ctx back into the pool.
- // If the context was abandoned (e.g., by timeout middleware), this is a no-op.
- // Call ForceRelease only when you can guarantee no goroutines (including the
- // requestHandler and ErrorHandler) still touch the context; the timeout
- // middleware intentionally leaves abandoned contexts unreleased to avoid races.
- func (app *App) ReleaseCtx(c CustomCtx) {
- if c.IsAbandoned() {
- return
- }
- c.release()
- app.pool.Put(c)
- }
|