Change URL handling (#22713)

This commit is contained in:
Pascal Vizeli 2019-04-04 11:10:44 +02:00 committed by GitHub
parent d231d59896
commit beb6ddfa68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 19 deletions

View File

@ -30,7 +30,7 @@ class HassIOIngress(HomeAssistantView):
"""Hass.io view to handle base part."""
name = "api:hassio:ingress"
url = "/api/hassio_ingress/{addon}/{path:.+}"
url = "/api/hassio_ingress/{token}/{path:.+}"
requires_auth = False
def __init__(self, host: str, websession: aiohttp.ClientSession):
@ -38,21 +38,21 @@ class HassIOIngress(HomeAssistantView):
self._host = host
self._websession = websession
def _create_url(self, addon: str, path: str) -> str:
def _create_url(self, token: str, path: str) -> str:
"""Create URL to service."""
return "http://{}/addons/{}/web/{}".format(self._host, addon, path)
return "http://{}/ingress/{}/{}".format(self._host, token, path)
async def _handle(
self, request: web.Request, addon: str, path: str
self, request: web.Request, token: str, path: str
) -> Union[web.Response, web.StreamResponse, web.WebSocketResponse]:
"""Route data to Hass.io ingress service."""
try:
# Websocket
if _is_websocket(request):
return await self._handle_websocket(request, addon, path)
return await self._handle_websocket(request, token, path)
# Request
return await self._handle_request(request, addon, path)
return await self._handle_request(request, token, path)
except aiohttp.ClientError:
pass
@ -65,15 +65,15 @@ class HassIOIngress(HomeAssistantView):
delete = _handle
async def _handle_websocket(
self, request: web.Request, addon: str, path: str
self, request: web.Request, token: str, path: str
) -> web.WebSocketResponse:
"""Ingress route for websocket."""
ws_server = web.WebSocketResponse()
await ws_server.prepare(request)
# Preparing
url = self._create_url(addon, path)
source_header = _init_header(request, addon)
url = self._create_url(token, path)
source_header = _init_header(request, token)
# Support GET query
if request.query_string:
@ -95,12 +95,12 @@ class HassIOIngress(HomeAssistantView):
return ws_server
async def _handle_request(
self, request: web.Request, addon: str, path: str
self, request: web.Request, token: str, path: str
) -> Union[web.Response, web.StreamResponse]:
"""Ingress route for request."""
url = self._create_url(addon, path)
url = self._create_url(token, path)
data = await request.read()
source_header = _init_header(request, addon)
source_header = _init_header(request, token)
async with self._websession.request(
request.method, url, headers=source_header,
@ -136,7 +136,7 @@ class HassIOIngress(HomeAssistantView):
def _init_header(
request: web.Request, addon: str
request: web.Request, token: str
) -> Union[CIMultiDict, Dict[str, str]]:
"""Create initial header."""
headers = {}
@ -151,7 +151,7 @@ def _init_header(
headers[X_HASSIO] = os.environ.get('HASSIO_TOKEN', "")
# Ingress information
headers[X_INGRESS_PATH] = "/api/hassio_ingress/{}".format(addon)
headers[X_INGRESS_PATH] = "/api/hassio_ingress/{}".format(token)
# Set X-Forwarded-For
forward_for = request.headers.get(hdrs.X_FORWARDED_FOR)

View File

@ -13,7 +13,7 @@ import pytest
async def test_ingress_request_get(
hassio_client, build_type, aioclient_mock):
"""Test no auth needed for ."""
aioclient_mock.get("http://127.0.0.1/addons/{}/web/{}".format(
aioclient_mock.get("http://127.0.0.1/ingress/{}/{}".format(
build_type[0], build_type[1]), text="test")
resp = await hassio_client.get(
@ -45,7 +45,7 @@ async def test_ingress_request_get(
async def test_ingress_request_post(
hassio_client, build_type, aioclient_mock):
"""Test no auth needed for ."""
aioclient_mock.post("http://127.0.0.1/addons/{}/web/{}".format(
aioclient_mock.post("http://127.0.0.1/ingress/{}/{}".format(
build_type[0], build_type[1]), text="test")
resp = await hassio_client.post(
@ -77,7 +77,7 @@ async def test_ingress_request_post(
async def test_ingress_request_put(
hassio_client, build_type, aioclient_mock):
"""Test no auth needed for ."""
aioclient_mock.put("http://127.0.0.1/addons/{}/web/{}".format(
aioclient_mock.put("http://127.0.0.1/ingress/{}/{}".format(
build_type[0], build_type[1]), text="test")
resp = await hassio_client.put(
@ -109,7 +109,7 @@ async def test_ingress_request_put(
async def test_ingress_request_delete(
hassio_client, build_type, aioclient_mock):
"""Test no auth needed for ."""
aioclient_mock.delete("http://127.0.0.1/addons/{}/web/{}".format(
aioclient_mock.delete("http://127.0.0.1/ingress/{}/{}".format(
build_type[0], build_type[1]), text="test")
resp = await hassio_client.delete(
@ -142,7 +142,7 @@ async def test_ingress_request_delete(
async def test_ingress_websocket(
hassio_client, build_type, aioclient_mock):
"""Test no auth needed for ."""
aioclient_mock.get("http://127.0.0.1/addons/{}/web/{}".format(
aioclient_mock.get("http://127.0.0.1/ingress/{}/{}".format(
build_type[0], build_type[1]))
# Ignore error because we can setup a full IO infrastructure