"""ZiGate Admin panel proxy.""" import aiohttp from homeassistant.components.http import HomeAssistantView class PanelProxy(HomeAssistantView): """Reverse Proxy View.""" requires_auth = False cors_allowed = True name = "panelproxy" def __init__(self, url, proxy_url): """Initialize view url.""" self.url = url + r"{requested_url:.*}" self.proxy_url = proxy_url async def get(self, request, requested_url): """Handle GET proxy requests.""" return await self._handle_request("GET", request, requested_url) async def post(self, request, requested_url): """Handle POST proxy requests.""" return await self._handle_request("POST", request, requested_url) async def _handle_request(self, method, request, requested_url): """Handle proxy requests.""" requested_url = requested_url or "/" headers = request.headers.copy() headers["Host"] = request.host headers["X-Real-Ip"] = request.remote headers["X-Forwarded-For"] = request.remote headers["X-Forwarded-Proto"] = request.scheme post_data = await request.read() async with aiohttp.request( method, self.proxy_url + requested_url, params=request.query, data=post_data, headers=headers, ) as resp: content = await resp.read() headers = resp.headers.copy() return aiohttp.web.Response( body=content, status=resp.status, headers=headers ) def adminpanel_setup(hass, url_path): """Set up the proxy frontend panels.""" hass.http.register_view(PanelProxy("/" + url_path, 'http://localhost:9998/' + url_path)) hass.components.frontend.async_register_built_in_panel( "iframe", "Zigate Admin", "mdi:zigbee", "proxy_" + url_path, {"url": "/" + url_path}, require_admin=True, )