Home > Article > Backend Development > How to Safely Set Context Values within HTTP Handlers in Go?
In Go's HTTP package, the HandleFunc function allows registering a handler function to process incoming HTTP requests. While setting context values within a handler is a common practice, determining the optimal approach may raise concerns.
One approach is to use the WithValue function from the context package to set a context value within a handler. However, it's important to note that the following usage can introduce a potential issue:
func setValue(r *http.Request, val string) { ctx := context.WithValue(r.Context(), myContext, val) *r = *r.WithContext(ctx) }
Assigning *r to a new request object can cause code up the stack to use the incorrect context value. To address this, the recommended approach is to create a shallow copy of the request using WithContext and return a pointer to it:
func setValue(r *http.Request, val string) *http.Request { return r.WithContext(context.WithValue(r.Context(), myContext, val)) }
By returning a pointer to the shallow copy, you ensure that the correct context value is used throughout the request processing pipeline. If the handler invokes other handlers, pass the modified request to the subsequent handler:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { r = setValue(r, "foobar") someOtherHandler.ServeHTTP(w, r) })
This approach effectively sets context values within HTTP handlers while avoiding potential pitfalls associated with modifying the original request object.
The above is the detailed content of How to Safely Set Context Values within HTTP Handlers in Go?. For more information, please follow other related articles on the PHP Chinese website!