docs/guide/context.md
import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
context.ContextFiber's Ctx implements Go's
context.Context interface.
You can pass c directly to functions that expect a context.Context
without adapters, but only to read values from it. Ctx is a context that can
never be canceled: Deadline, Done, and Err always report no deadline,
nil, and nil, whatever you set with c.SetContext. For cancellation and
deadlines, use c.Context().
:::caution
The fiber.Ctx instance is only valid within the lifetime of the handler.
It is reused for subsequent requests, so avoid storing c or using it in
goroutines that outlive the handler. For asynchronous work, call
c.Context() inside the handler to obtain a context.Context that can safely
be used after the handler returns. By default, this returns context.Background()
unless a custom context was provided with c.SetContext.
:::
func doSomething(ctx context.Context) {
// ... your logic here
}
app.Get("/", func(c fiber.Ctx) error {
doSomething(c) // c satisfies context.Context
return nil
})
fiber.Ctx is recycled after each request. If you need a context that lives
longer—for example, for work performed in a new goroutine—obtain it with
c.Context() before returning from the handler.
app.Get("/job", func(c fiber.Ctx) error {
ctx := c.Context()
go performAsync(ctx)
return c.SendStatus(fiber.StatusAccepted)
})
You can customize the base context by calling c.SetContext before
requesting it. This changes what c.Context() returns for the rest of the
request; it does not make c itself cancelable.
app.Get("/job", func(c fiber.Ctx) error {
c.SetContext(context.WithValue(context.Background(), "requestID", "123"))
ctx := c.Context()
go performAsync(ctx)
return nil
})
Ctx.Value is backed by Locals.
Values stored with c.Locals are accessible through Value or
standard context.WithValue helpers.
app.Get("/", func(c fiber.Ctx) error {
c.Locals("role", "admin")
role := c.Value("role") // returns "admin"
return c.SendString(role.(string))
})
RequestCtx and fasthttpctxThe underlying fasthttp.RequestCtx
can be accessed via c.RequestCtx().
This exposes low-level APIs and the extra context support provided by
fasthttpctx.
app.Get("/raw", func(c fiber.Ctx) error {
fctx := c.RequestCtx()
// use fasthttp APIs directly
fctx.Response.Header.Set("X-Engine", "fasthttp")
return nil
})
fasthttpctx enables fasthttp to satisfy the context.Context interface.
Deadline always reports no deadline. Done closes only when the server
shuts down, and Err then returns context.Canceled. Note that this is the
fasthttp.RequestCtx, not Fiber's Ctx, whose Done is always nil.
:::caution
Done does not fire when an individual client disconnects. To stop a
long-running handler at a deadline, wrap c.Context() with
context.WithTimeout as shown below.
:::
Fiber and its middleware expose a number of helper functions that retrieve request-scoped values from the context.
The RequestID middleware stores the generated identifier in the context.
Use requestid.FromContext to read it later.
app.Use(requestid.New())
app.Get("/", func(c fiber.Ctx) error {
id := requestid.FromContext(c)
return c.SendString(id)
})
The CSRF middleware provides helpers to fetch the token or the handler attached to the current context.
app.Use(csrf.New())
app.Get("/form", func(c fiber.Ctx) error {
token := csrf.TokenFromContext(c)
return c.SendString(token)
})
app.Post("/logout", func(c fiber.Ctx) error {
handler := csrf.HandlerFromContext(c)
if handler != nil {
// Invalidate the token on logout
_ = handler.DeleteToken(c)
}
// ... other logout logic
return c.SendString("Logged out")
})
Sessions are stored on the context and can be retrieved via
session.FromContext.
app.Use(session.New())
app.Get("/", func(c fiber.Ctx) error {
sess := session.FromContext(c)
count := sess.Get("visits")
return c.JSON(fiber.Map{"visits": count})
})
After successful authentication, the username is available with
basicauth.UsernameFromContext. Passwords in Users must be pre-hashed.
app.Use(basicauth.New(basicauth.Config{
Users: map[string]string{
// "secret" hashed using SHA-256
"admin": "{SHA256}K7gNU3sdo+OL0wNhqoVWhr3g6s1xYv72ol/pe/Unols=",
},
}))
app.Get("/", func(c fiber.Ctx) error {
user := basicauth.UsernameFromContext(c)
return c.SendString(user)
})
For API key authentication, the extracted token is stored in the
context and accessible via keyauth.TokenFromContext.
app.Use(keyauth.New())
app.Get("/", func(c fiber.Ctx) error {
token := keyauth.TokenFromContext(c)
return c.SendString(token)
})
context.WithValue and FriendsStandard helpers such as context.WithValue, context.WithTimeout, or
context.WithCancel can wrap the request context when needed. Derive them
from c.Context(), not from c: c can never be canceled, so a context
derived from it would never inherit a deadline or a cancellation.
app.Get("/job", func(c fiber.Ctx) error {
ctx, cancel := context.WithTimeout(c.Context(), 5*time.Second)
defer cancel()
// pass ctx to async operations that honor cancellation
if err := doWork(ctx); err != nil {
return err
}
return c.SendStatus(fiber.StatusOK)
})
When starting asynchronous work inside a handler, Fiber does not cancel the base fiber.Ctx automatically.
By wrapping the request context with context.WithTimeout, you can create a derived context that honors deadlines and cancellation signals.
The goroutine checks ctx.Done() before sending a result.
If the deadline elapses, the goroutine exits early and avoids leaking resources.
The handler then waits for either:
context timeout (which returns a 504 Gateway Timeout)This pattern ensures that long-running operations (database queries, external API calls, background tasks) do not continue running after the request has ended.
func Handler(c fiber.Ctx) error {
ctx, cancel := context.WithTimeout(c.Context(), 2*time.Second)
defer cancel()
resultChan := make(chan string, 1)
go func() {
select {
case <-time.After(3 * time.Second):
select {
case <-ctx.Done():
return
case resultChan <- "done":
}
case <-ctx.Done():
return
}
}()
select {
case res := <-resultChan:
return c.SendString(res)
case <-ctx.Done():
return c.Status(fiber.StatusGatewayTimeout).SendString("timeout")
}
}
This approach provides safe cancellation semantics for goroutine-based work while allowing you to integrate Fiber handlers with context-aware APIs.
fiber.Ctx satisfies context.Context but its Deadline, Done, and Err
methods are currently no-ops.RequestCtx exposes the raw fasthttp context. Its Done channel
closes only on server shutdown, not on client disconnect.fiber.StoreInContext(c, key, value) to store request-scoped values in both
c.Locals() and c.Context() when values must be available through either API.requestid.FromContext or session.FromContext
make it easy to retrieve request-scoped data.context.WithTimeout can wrap fiber.Ctx to create
fully featured derived contexts inside handlers.fiber.Config.PassLocalsToContext controls whether Fiber context helpers
also propagate values into the request context.Context for Fiber-backed
contexts when using StoreInContext. It defaults to false for backward
compatibility, while ValueFromContext keeps reading from c.Locals().c.Context() to obtain a context.Context that can outlive the handler,
and c.SetContext() to customize it with additional values or deadlines.With these tools, you can seamlessly integrate Fiber applications with Go's context-based APIs and manage request-scoped data effectively.