Modify c.Request.Context() when using ContextWithFallback #3367
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.
Gin 1.8 added the
ContextWithFallback
feature flag, which causes thecontext.Context
methods to fall back toc.Request.Context()
. Presumably, the intent of this feature was to cause the Gin context to be a part of the overall context chain of the request. However, this intent breaks down when usinggin.WrapH
with a third-partyhttp.Handler
.Because the signature of an
http.Handler
does not include a*gin.Context
, anhttp.Handler
can only accessreq.Context()
. However, this always refers to the request's original context instead of the Gin context. This means that any values set with Gin'sc.Set
are not accessible in those handlers. This means that Gin middleware that sets context values actually can't pass values to third-party handlers!This PR therefore sets
c.Request.Context()
to be the Gin context itself. That way,req.Context()
in a third-party handler returns the Gin context, and can get the values it expects.It only does this when using
ContextWithFallback
, to avoid breakage. I figure this is probably enough breakage-avoidance, because this flag is already opt-in and most people won't opt in. However, if you needed to avoid further breakage, I could perhaps update this to only do this work when usinggin.WrapH
.Refs #2751, #2769, #3166, #3172