Fix URL param loss when middleware replaces request context#5
Open
elevasyncsolutions-jpg wants to merge 1 commit into
Open
Fix URL param loss when middleware replaces request context#5elevasyncsolutions-jpg wants to merge 1 commit into
elevasyncsolutions-jpg wants to merge 1 commit into
Conversation
The issue occurs when middleware wraps the request with context.WithValue(), creating a new context that no longer carries the chi routing context. This fix ensures URL params are re-injected into the final handler's request context, preserving access to URL parameters through middleware chains. Key changes: - RouteContext now searches parent contexts to find chi context - ServeHTTP re-wraps context before calling final handler - URLParam uses the enhanced RouteContext lookup
5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
When middleware replaces the request context using
context.WithValue(), the chi routing context (containing URL parameters) is lost. This meansURLParam(req, "key")returns empty strings after middleware context replacement.Root Cause
The
ServeHTTPmethod stores the routing context in the request context before middleware execution. When middleware creates a new context chain viacontext.WithValue(), the original context including the chi routing context becomes inaccessible to downstream handlers.Fix
After middleware processing completes, the final handler re-injects the chi routing context into the request context using
context.WithValue(r.Context(), RouteCtxKey, rctx). This ensures URL parameters are always available to the final route handler.Testing
TestMiddlewareRxCloneURLParams: Verifies URL params survive single middleware context replacementTestURLParamsWithoutMiddleware: Baseline test without middlewareTestURLParamsWithMultipleMiddleware: Verifies URL params survive multiple middleware context replacementsReferences