Source code for aioscraper.core.session.factory

import logging
from typing import Callable

from aioscraper.config import HttpBackend, SessionConfig
from aioscraper.exceptions import AIOScraperException

from .base import BaseSession

logger = logging.getLogger(__name__)


SessionMaker = Callable[[], BaseSession]
SessionMakerFactory = Callable[[SessionConfig], SessionMaker]


[docs] def get_sessionmaker(config: SessionConfig) -> SessionMaker: "Return a factory that builds a session using the chosen or available HTTP backend." if config.http_backend != HttpBackend.HTTPX: try: from .aiohttp import AiohttpSession, ClientTimeout, TCPConnector logger.info( "Using aiohttp session: timeout=%.10gs, ssl=%s", config.timeout, "configured" if config.ssl is not None else "default", ) return lambda: AiohttpSession( timeout=ClientTimeout(total=config.timeout), connector=TCPConnector(ssl=ssl) if (ssl := config.ssl) is not None else None, proxy=config.proxy if isinstance(config.proxy, str) else None, ) except ModuleNotFoundError: # pragma: no cover logger.debug("aiohttp not available, trying httpx") if config.http_backend != HttpBackend.AIOHTTP: try: from .httpx import HttpxSession logger.info( "Using httpx session: timeout=%.10gs, ssl=%s", config.timeout, "configured" if config.ssl is not None else "default", ) return lambda: HttpxSession( timeout=config.timeout, verify=config.ssl, proxy=config.proxy, ) except ModuleNotFoundError: # pragma: no cover logger.debug("httpx not available") logger.error("No HTTP backend available: aiohttp and httpx are not installed") raise AIOScraperException("aiohttp or httpx is not installed")