diff --git a/starlette/schemas.py b/starlette/schemas.py index f939cb5a3..72d93e7d7 100644 --- a/starlette/schemas.py +++ b/starlette/schemas.py @@ -4,7 +4,7 @@ from starlette.requests import Request from starlette.responses import Response -from starlette.routing import BaseRoute, Mount, Route +from starlette.routing import BaseRoute, Host, Mount, Route try: import yaml @@ -49,9 +49,12 @@ def get_endpoints( endpoints_info: list = [] for route in routes: - if isinstance(route, Mount): - path = self._remove_converter(route.path) + if isinstance(route, (Mount, Host)): routes = route.routes or [] + if isinstance(route, Mount): + path = self._remove_converter(route.path) + else: + path = "" sub_endpoints = [ EndpointInfo( path="".join((path, sub_endpoint.path)), diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 26884b391..6c5b1d603 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -1,6 +1,6 @@ from starlette.applications import Starlette from starlette.endpoints import HTTPEndpoint -from starlette.routing import Mount, Route, WebSocketRoute +from starlette.routing import Host, Mount, Route, Router, WebSocketRoute from starlette.schemas import SchemaGenerator schemas = SchemaGenerator( @@ -123,6 +123,7 @@ def schema(request): Route("/no-docstring", endpoint=no_docstring), Route("/schema", endpoint=schema, methods=["GET"], include_in_schema=False), Mount("/subapp", subapp), + Host("sub.domain.com", app=Router(routes=[Mount("/subapp2", subapp)])), ] ) @@ -165,6 +166,13 @@ def test_schema_generation(): } } }, + "/subapp2/subapp-endpoint": { + "get": { + "responses": { + 200: {"description": "This endpoint is part of a subapp."} + } + } + }, "/users": { "get": { "responses": { @@ -224,6 +232,11 @@ def test_schema_generation(): responses: 200: description: This endpoint is part of a subapp. + /subapp2/subapp-endpoint: + get: + responses: + 200: + description: This endpoint is part of a subapp. /users: get: responses: