core/homeassistant/components/frontend/dev.py

61 lines
1.9 KiB
Python

"""Development helpers for the frontend."""
import aiohttp
from aiohttp import hdrs, web
from homeassistant.components.http.view import HomeAssistantView
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import aiohttp_client
@callback
def async_setup_frontend_dev(hass: HomeAssistant) -> None:
"""Set up frontend dev views."""
hass.http.register_view( # type: ignore
FrontendDevView(
"http://localhost:8000", aiohttp_client.async_get_clientsession(hass)
)
)
FILTER_RESPONSE_HEADERS = {hdrs.CONTENT_LENGTH, hdrs.CONTENT_ENCODING}
class FrontendDevView(HomeAssistantView):
"""Frontend dev view."""
name = "_dev:frontend"
url = "/_dev_frontend/{path:.*}"
requires_auth = False
extra_urls = ["/__web-dev-server__/{path:.*}"]
def __init__(self, forward_base: str, websession: aiohttp.ClientSession):
"""Initialize a Hass.io ingress view."""
self._forward_base = forward_base
self._websession = websession
async def get(self, request: web.Request, path: str) -> web.Response:
"""Frontend routing."""
# To deal with: import * as commonjsHelpers from '/__web-dev-server__/rollup/commonjsHelpers.js
if request.path.startswith("/__web-dev-server__/"):
path = f"__web-dev-server__/{path}"
url = f"{self._forward_base}/{path}"
if request.query_string:
url += f"?{request.query_string}"
async with self._websession.get(
url,
headers=request.headers,
allow_redirects=False,
) as result:
return web.Response(
headers={
hdr: val
for hdr, val in result.headers.items()
if hdr not in FILTER_RESPONSE_HEADERS
},
status=result.status,
body=await result.read(),
)