Home Assistant Unofficial Reference 2024.12.1
web_runner.py
Go to the documentation of this file.
1 """HomeAssistant specific aiohttp Site."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from ssl import SSLContext
7 
8 from aiohttp import web
9 from yarl import URL
10 
11 
12 class HomeAssistantTCPSite(web.BaseSite):
13  """HomeAssistant specific aiohttp Site.
14 
15  Vanilla TCPSite accepts only str as host. However, the underlying asyncio's
16  create_server() implementation does take a list of strings to bind to multiple
17  host IP's. To support multiple server_host entries (e.g. to enable dual-stack
18  explicitly), we would like to pass an array of strings. Bring our own
19  implementation inspired by TCPSite.
20 
21  Custom TCPSite can be dropped when https://github.com/aio-libs/aiohttp/pull/4894
22  is merged.
23  """
24 
25  __slots__ = ("_host", "_port", "_reuse_address", "_reuse_port", "_hosturl")
26 
27  def __init__(
28  self,
29  runner: web.BaseRunner,
30  host: str | list[str] | None,
31  port: int,
32  *,
33  ssl_context: SSLContext | None = None,
34  backlog: int = 128,
35  reuse_address: bool | None = None,
36  reuse_port: bool | None = None,
37  ) -> None:
38  """Initialize HomeAssistantTCPSite."""
39  super().__init__(
40  runner,
41  ssl_context=ssl_context,
42  backlog=backlog,
43  )
44  self._host_host = host
45  self._port_port = port
46  self._reuse_address_reuse_address = reuse_address
47  self._reuse_port_reuse_port = reuse_port
48 
49  @property
50  def name(self) -> str:
51  """Return server URL."""
52  scheme = "https" if self._ssl_context else "http"
53  host = self._host_host[0] if isinstance(self._host_host, list) else "0.0.0.0"
54  return str(URL.build(scheme=scheme, host=host, port=self._port_port))
55 
56  async def start(self) -> None:
57  """Start server."""
58  await super().start()
59  loop = asyncio.get_running_loop()
60  server = self._runner.server
61  assert server is not None
62  self._server_server = await loop.create_server(
63  server,
64  self._host_host,
65  self._port_port,
66  ssl=self._ssl_context,
67  backlog=self._backlog,
68  reuse_address=self._reuse_address_reuse_address,
69  reuse_port=self._reuse_port_reuse_port,
70  )
None __init__(self, web.BaseRunner runner, str|list[str]|None host, int port, *SSLContext|None ssl_context=None, int backlog=128, bool|None reuse_address=None, bool|None reuse_port=None)
Definition: web_runner.py:37