diff --git a/starlette/responses.py b/starlette/responses.py index b73e04a40..fc92cbab1 100644 --- a/starlette/responses.py +++ b/starlette/responses.py @@ -272,6 +272,9 @@ def __init__(self, max_size: int) -> None: self.max_size = max_size +_RANGE_PATTERN = re.compile(r"(\d*)-(\d*)") + + class FileResponse(Response): chunk_size = 64 * 1024 @@ -453,7 +456,7 @@ def _parse_range_header(http_range: str, file_size: int) -> list[tuple[int, int] int(_[0]) if _[0] else file_size - int(_[1]), int(_[1]) + 1 if _[0] and _[1] and int(_[1]) < file_size else file_size, ) - for _ in re.findall(r"(\d*)-(\d*)", range_) + for _ in _RANGE_PATTERN.findall(range_) if _ != ("", "") ] diff --git a/starlette/schemas.py b/starlette/schemas.py index 688fd85be..94b9cca78 100644 --- a/starlette/schemas.py +++ b/starlette/schemas.py @@ -29,6 +29,9 @@ class EndpointInfo(typing.NamedTuple): func: typing.Callable[..., typing.Any] +_remove_converter_pattern = re.compile(r":\w+}") + + class BaseSchemaGenerator: def get_schema(self, routes: list[BaseRoute]) -> dict[str, typing.Any]: raise NotImplementedError() # pragma: no cover @@ -89,7 +92,7 @@ def _remove_converter(self, path: str) -> str: Route("/users/{id:int}", endpoint=get_user, methods=["GET"]) Should be represented as `/users/{id}` in the OpenAPI schema. """ - return re.sub(r":\w+}", "}", path) + return _remove_converter_pattern.sub("}", path) def parse_docstring(self, func_or_method: typing.Callable[..., typing.Any]) -> dict[str, typing.Any]: """