Skip to content

Fix URL param loss when middleware replaces request context#5

Open
elevasyncsolutions-jpg wants to merge 1 commit into
RoseMark45:mainfrom
elevasyncsolutions-jpg:main
Open

Fix URL param loss when middleware replaces request context#5
elevasyncsolutions-jpg wants to merge 1 commit into
RoseMark45:mainfrom
elevasyncsolutions-jpg:main

Conversation

@elevasyncsolutions-jpg

Copy link
Copy Markdown

Problem

When middleware replaces the request context using context.WithValue(), the chi routing context (containing URL parameters) is lost. This means URLParam(req, "key") returns empty strings after middleware context replacement.

Root Cause

The ServeHTTP method stores the routing context in the request context before middleware execution. When middleware creates a new context chain via context.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 replacement
  • TestURLParamsWithoutMiddleware: Baseline test without middleware
  • TestURLParamsWithMultipleMiddleware: Verifies URL params survive multiple middleware context replacements

References

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant