Spaces:
Runtime error
Runtime error
| from typing import TYPE_CHECKING, Any, Awaitable, Callable, Iterable, TypeVar | |
| from aiohttp.web_request import Request | |
| from aiohttp.web_response import StreamResponse | |
| if TYPE_CHECKING: | |
| F = TypeVar("F", bound=Callable[..., Any]) | |
| middleware: Callable[[F], F] | |
| else: | |
| try: | |
| from aiohttp.web_middlewares import middleware | |
| except ImportError: | |
| # @middleware is deprecated and its behaviour is the default since aiohttp 4.0 | |
| # so if it doesn't exist anymore, define a no-op for forward compatibility. | |
| middleware = lambda x: x # noqa: E731 | |
| Handler = Callable[[Request], Awaitable[StreamResponse]] | |
| Middleware = Callable[[Request, Handler], Awaitable[StreamResponse]] | |
| def cors(allow_headers: Iterable[str]) -> Middleware: | |
| async def impl(request: Request, handler: Handler) -> StreamResponse: | |
| is_options = request.method == "OPTIONS" | |
| is_preflight = is_options and "Access-Control-Request-Method" in request.headers | |
| if is_preflight: | |
| resp = StreamResponse() | |
| else: | |
| resp = await handler(request) | |
| origin = request.headers.get("Origin") | |
| if not origin: | |
| return resp | |
| resp.headers["Access-Control-Allow-Origin"] = "*" | |
| resp.headers["Access-Control-Expose-Headers"] = "*" | |
| if is_options: | |
| resp.headers["Access-Control-Allow-Headers"] = ", ".join(allow_headers) | |
| resp.headers["Access-Control-Allow-Methods"] = ", ".join( | |
| ("OPTIONS", "POST") | |
| ) | |
| return resp | |
| return impl | |