Source code for aioscraper.holders.middleware
import logging
from typing import Iterator
from aioscraper._helpers.log import get_log_name
from aioscraper.types import RequestMiddlewareFactory
logger = logging.getLogger(__name__)
[docs]
class MiddlewareHolder:
"Stores request middleware factories in registration order."
def __init__(self):
self._factories: list[RequestMiddlewareFactory] = []
[docs]
def __call__(self, factory: RequestMiddlewareFactory) -> RequestMiddlewareFactory:
"Decorator form: register a middleware factory."
self.add(factory)
return factory
[docs]
def add(self, *factories: RequestMiddlewareFactory):
"""
Register request middleware factories in order.
Each factory can accept injected dependencies and must return a middleware with signature
``async def mw(call_next, request): ...`` which wraps the request handler chain for every
request..
"""
for factory in factories:
logger.debug("Installing request middleware factory %s", get_log_name(factory))
self._factories.append(factory)
def __iter__(self) -> Iterator[RequestMiddlewareFactory]:
return iter(self._factories)
def __len__(self) -> int:
return len(self._factories)