Observe the route template constraints in the Swagger middleware#2418
Merged
martincostello merged 4 commits intoApr 18, 2024
Merged
Conversation
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.
The default route template, i.e.
swagger/{documentName}/swagger.{json|yaml}which is used by theSwaggerMiddlewareis problematic because it matches any file extension. Even though it looks like onlyjsonandyamlextensions are supported, actually any extension matches. Trying to hit the following endpoints all return the JSON swagger document:swagger/v1/swagger.xmlswagger/v1/swagger.ymlswagger/v1/swagger.anythingThis is not a very big deal, until the
SwaggerUIMiddlewareis also used and one chooses to modify the default route toswagger/{documentName}.{json|yaml}.This is the problematic configuration:
At this point, the
SwaggerMiddlewarewill try to serveswagger/index.htmlbecause the route template matches (documentName=indexandjson|yaml=html) but theindexdocument doesn't exist and this results in a 404 instead of calling the next (SwaggerUI) middleware.To fix this issue, the default route template has been modified to
swagger/{documentName}/swagger.{extension:regex(^(json|ya?ml)$)}, leveraging ASP.NET Core route constraints and the constraints are actually enforced in theSwaggerMiddlewareimplementation.The default route template has also been modified in the
MapSwaggermethod to ensure that onlyjson,yamlandymlextensions are supported by default.