"""HACS http endpoints.""" import os from integrationhelper import Logger from homeassistant.components.http import HomeAssistantView from aiohttp import web from hacs_frontend import locate_gz, locate_debug_gz from custom_components.hacs.globals import get_hacs IGNORE = ["class-map.js.map"] class HacsFrontend(HomeAssistantView): """Base View Class for HACS.""" requires_auth = False name = "hacs_files" url = r"/hacsfiles/{requested_file:.+}" async def get(self, request, requested_file): # pylint: disable=unused-argument """Handle HACS Web requests.""" return await get_file_response(requested_file) async def get_file_response(requested_file): """Get file.""" hacs = get_hacs() if requested_file in IGNORE: hacs.logger.debug(f"Ignoring request for {requested_file}") return web.Response(status=200) if requested_file.startswith("frontend-"): if hacs.configuration.debug: servefile = await hacs.hass.async_add_executor_job(locate_debug_gz) hacs.logger.debug("Serving DEBUG frontend") elif hacs.configuration.frontend_repo_url: hacs.logger.debug("Serving REMOTE DEVELOPMENT frontend") request = await hacs.session.get(f"{hacs.configuration.frontend_repo_url}/main.js") if request.status == 200: result = await request.read() response = web.Response(body=result) response.headers["Cache-Control"] = "no-store, max-age=0" response.headers["Pragma"] = "no-store" return response elif hacs.configuration.frontend_repo: hacs.logger.debug("Serving LOCAL DEVELOPMENT frontend") servefile = f"{hacs.configuration.frontend_repo}/hacs_frontend/main.js" else: servefile = await hacs.hass.async_add_executor_job(locate_gz) if os.path.exists(servefile): response = web.FileResponse(servefile) if hacs.configuration.frontend_repo: response.headers["Cache-Control"] = "no-store, max-age=0" response.headers["Pragma"] = "no-store" return response elif requested_file == "iconset.js": return web.FileResponse( f"{hacs.system.config_path}/custom_components/hacs/iconset.js" ) try: if requested_file.startswith("themes"): file = f"{hacs.system.config_path}/{requested_file}" else: file = f"{hacs.system.config_path}/www/community/{requested_file}" # Serve .gz if it exist if os.path.exists(file + ".gz"): file += ".gz" if os.path.exists(file): hacs.logger.debug("Serving {} from {}".format(requested_file, file)) response = web.FileResponse(file) response.headers["Cache-Control"] = "no-store, max-age=0" response.headers["Pragma"] = "no-store" return response else: hacs.logger.error(f"Tried to serve up '{file}' but it does not exist") except Exception as error: # pylint: disable=broad-except hacs.logger.debug( "there was an issue trying to serve {} - {}".format(requested_file, error) ) return web.Response(status=404)