mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 16:57:10 +00:00
Change URL handling (#22713)
This commit is contained in:
parent
d231d59896
commit
beb6ddfa68
@ -30,7 +30,7 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
"""Hass.io view to handle base part."""
|
"""Hass.io view to handle base part."""
|
||||||
|
|
||||||
name = "api:hassio:ingress"
|
name = "api:hassio:ingress"
|
||||||
url = "/api/hassio_ingress/{addon}/{path:.+}"
|
url = "/api/hassio_ingress/{token}/{path:.+}"
|
||||||
requires_auth = False
|
requires_auth = False
|
||||||
|
|
||||||
def __init__(self, host: str, websession: aiohttp.ClientSession):
|
def __init__(self, host: str, websession: aiohttp.ClientSession):
|
||||||
@ -38,21 +38,21 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
self._host = host
|
self._host = host
|
||||||
self._websession = websession
|
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."""
|
"""Create URL to service."""
|
||||||
return "http://{}/addons/{}/web/{}".format(self._host, addon, path)
|
return "http://{}/ingress/{}/{}".format(self._host, token, path)
|
||||||
|
|
||||||
async def _handle(
|
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]:
|
) -> Union[web.Response, web.StreamResponse, web.WebSocketResponse]:
|
||||||
"""Route data to Hass.io ingress service."""
|
"""Route data to Hass.io ingress service."""
|
||||||
try:
|
try:
|
||||||
# Websocket
|
# Websocket
|
||||||
if _is_websocket(request):
|
if _is_websocket(request):
|
||||||
return await self._handle_websocket(request, addon, path)
|
return await self._handle_websocket(request, token, path)
|
||||||
|
|
||||||
# Request
|
# Request
|
||||||
return await self._handle_request(request, addon, path)
|
return await self._handle_request(request, token, path)
|
||||||
|
|
||||||
except aiohttp.ClientError:
|
except aiohttp.ClientError:
|
||||||
pass
|
pass
|
||||||
@ -65,15 +65,15 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
delete = _handle
|
delete = _handle
|
||||||
|
|
||||||
async def _handle_websocket(
|
async def _handle_websocket(
|
||||||
self, request: web.Request, addon: str, path: str
|
self, request: web.Request, token: str, path: str
|
||||||
) -> web.WebSocketResponse:
|
) -> web.WebSocketResponse:
|
||||||
"""Ingress route for websocket."""
|
"""Ingress route for websocket."""
|
||||||
ws_server = web.WebSocketResponse()
|
ws_server = web.WebSocketResponse()
|
||||||
await ws_server.prepare(request)
|
await ws_server.prepare(request)
|
||||||
|
|
||||||
# Preparing
|
# Preparing
|
||||||
url = self._create_url(addon, path)
|
url = self._create_url(token, path)
|
||||||
source_header = _init_header(request, addon)
|
source_header = _init_header(request, token)
|
||||||
|
|
||||||
# Support GET query
|
# Support GET query
|
||||||
if request.query_string:
|
if request.query_string:
|
||||||
@ -95,12 +95,12 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
return ws_server
|
return ws_server
|
||||||
|
|
||||||
async def _handle_request(
|
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]:
|
) -> Union[web.Response, web.StreamResponse]:
|
||||||
"""Ingress route for request."""
|
"""Ingress route for request."""
|
||||||
url = self._create_url(addon, path)
|
url = self._create_url(token, path)
|
||||||
data = await request.read()
|
data = await request.read()
|
||||||
source_header = _init_header(request, addon)
|
source_header = _init_header(request, token)
|
||||||
|
|
||||||
async with self._websession.request(
|
async with self._websession.request(
|
||||||
request.method, url, headers=source_header,
|
request.method, url, headers=source_header,
|
||||||
@ -136,7 +136,7 @@ class HassIOIngress(HomeAssistantView):
|
|||||||
|
|
||||||
|
|
||||||
def _init_header(
|
def _init_header(
|
||||||
request: web.Request, addon: str
|
request: web.Request, token: str
|
||||||
) -> Union[CIMultiDict, Dict[str, str]]:
|
) -> Union[CIMultiDict, Dict[str, str]]:
|
||||||
"""Create initial header."""
|
"""Create initial header."""
|
||||||
headers = {}
|
headers = {}
|
||||||
@ -151,7 +151,7 @@ def _init_header(
|
|||||||
headers[X_HASSIO] = os.environ.get('HASSIO_TOKEN', "")
|
headers[X_HASSIO] = os.environ.get('HASSIO_TOKEN', "")
|
||||||
|
|
||||||
# Ingress information
|
# Ingress information
|
||||||
headers[X_INGRESS_PATH] = "/api/hassio_ingress/{}".format(addon)
|
headers[X_INGRESS_PATH] = "/api/hassio_ingress/{}".format(token)
|
||||||
|
|
||||||
# Set X-Forwarded-For
|
# Set X-Forwarded-For
|
||||||
forward_for = request.headers.get(hdrs.X_FORWARDED_FOR)
|
forward_for = request.headers.get(hdrs.X_FORWARDED_FOR)
|
||||||
|
@ -13,7 +13,7 @@ import pytest
|
|||||||
async def test_ingress_request_get(
|
async def test_ingress_request_get(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""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")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.get(
|
resp = await hassio_client.get(
|
||||||
@ -45,7 +45,7 @@ async def test_ingress_request_get(
|
|||||||
async def test_ingress_request_post(
|
async def test_ingress_request_post(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""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")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.post(
|
resp = await hassio_client.post(
|
||||||
@ -77,7 +77,7 @@ async def test_ingress_request_post(
|
|||||||
async def test_ingress_request_put(
|
async def test_ingress_request_put(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""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")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.put(
|
resp = await hassio_client.put(
|
||||||
@ -109,7 +109,7 @@ async def test_ingress_request_put(
|
|||||||
async def test_ingress_request_delete(
|
async def test_ingress_request_delete(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""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")
|
build_type[0], build_type[1]), text="test")
|
||||||
|
|
||||||
resp = await hassio_client.delete(
|
resp = await hassio_client.delete(
|
||||||
@ -142,7 +142,7 @@ async def test_ingress_request_delete(
|
|||||||
async def test_ingress_websocket(
|
async def test_ingress_websocket(
|
||||||
hassio_client, build_type, aioclient_mock):
|
hassio_client, build_type, aioclient_mock):
|
||||||
"""Test no auth needed for ."""
|
"""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]))
|
build_type[0], build_type[1]))
|
||||||
|
|
||||||
# Ignore error because we can setup a full IO infrastructure
|
# Ignore error because we can setup a full IO infrastructure
|
||||||
|
Loading…
x
Reference in New Issue
Block a user