mirror of
https://github.com/home-assistant/core.git
synced 2025-07-28 15:47:12 +00:00
Allow multiple set-cookie headers with hassio ingress (#148148)
This commit is contained in:
parent
9ce03c79f0
commit
f478812568
@ -239,13 +239,13 @@ def _forwarded_for_header(forward_for: str | None, peer_name: str) -> str:
|
|||||||
return f"{forward_for}, {connected_ip!s}" if forward_for else f"{connected_ip!s}"
|
return f"{forward_for}, {connected_ip!s}" if forward_for else f"{connected_ip!s}"
|
||||||
|
|
||||||
|
|
||||||
def _init_header(request: web.Request, token: str) -> CIMultiDict | dict[str, str]:
|
def _init_header(request: web.Request, token: str) -> CIMultiDict:
|
||||||
"""Create initial header."""
|
"""Create initial header."""
|
||||||
headers = {
|
headers = CIMultiDict(
|
||||||
name: value
|
(name, value)
|
||||||
for name, value in request.headers.items()
|
for name, value in request.headers.items()
|
||||||
if name not in INIT_HEADERS_FILTER
|
if name not in INIT_HEADERS_FILTER
|
||||||
}
|
)
|
||||||
# Ingress information
|
# Ingress information
|
||||||
headers[X_HASS_SOURCE] = "core.ingress"
|
headers[X_HASS_SOURCE] = "core.ingress"
|
||||||
headers[X_INGRESS_PATH] = f"/api/hassio_ingress/{token}"
|
headers[X_INGRESS_PATH] = f"/api/hassio_ingress/{token}"
|
||||||
@ -273,13 +273,13 @@ def _init_header(request: web.Request, token: str) -> CIMultiDict | dict[str, st
|
|||||||
return headers
|
return headers
|
||||||
|
|
||||||
|
|
||||||
def _response_header(response: aiohttp.ClientResponse) -> dict[str, str]:
|
def _response_header(response: aiohttp.ClientResponse) -> CIMultiDict:
|
||||||
"""Create response header."""
|
"""Create response header."""
|
||||||
return {
|
return CIMultiDict(
|
||||||
name: value
|
(name, value)
|
||||||
for name, value in response.headers.items()
|
for name, value in response.headers.items()
|
||||||
if name not in RESPONSE_HEADERS_FILTER
|
if name not in RESPONSE_HEADERS_FILTER
|
||||||
}
|
)
|
||||||
|
|
||||||
|
|
||||||
def _is_websocket(request: web.Request) -> bool:
|
def _is_websocket(request: web.Request) -> bool:
|
||||||
|
@ -4,6 +4,7 @@ from http import HTTPStatus
|
|||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
from aiohttp.hdrs import X_FORWARDED_FOR, X_FORWARDED_HOST, X_FORWARDED_PROTO
|
from aiohttp.hdrs import X_FORWARDED_FOR, X_FORWARDED_HOST, X_FORWARDED_PROTO
|
||||||
|
from multidict import CIMultiDict
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.hassio.const import X_AUTH_TOKEN
|
from homeassistant.components.hassio.const import X_AUTH_TOKEN
|
||||||
@ -28,15 +29,22 @@ async def test_ingress_request_get(
|
|||||||
aioclient_mock.get(
|
aioclient_mock.get(
|
||||||
f"http://127.0.0.1/ingress/{build_type[0]}/{build_type[1]}",
|
f"http://127.0.0.1/ingress/{build_type[0]}/{build_type[1]}",
|
||||||
text="test",
|
text="test",
|
||||||
|
headers=CIMultiDict(
|
||||||
|
[("Set-Cookie", "cookie1=value1"), ("Set-Cookie", "cookie2=value2")]
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
resp = await hassio_noauth_client.get(
|
resp = await hassio_noauth_client.get(
|
||||||
f"/api/hassio_ingress/{build_type[0]}/{build_type[1]}",
|
f"/api/hassio_ingress/{build_type[0]}/{build_type[1]}",
|
||||||
headers={"X-Test-Header": "beer"},
|
headers=CIMultiDict(
|
||||||
|
[("X-Test-Header", "beer"), ("X-Test-Header", "more beer")]
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check we got right response
|
# Check we got right response
|
||||||
assert resp.status == HTTPStatus.OK
|
assert resp.status == HTTPStatus.OK
|
||||||
|
assert resp.headers["Set-Cookie"] == "cookie1=value1"
|
||||||
|
assert resp.headers.getall("Set-Cookie") == ["cookie1=value1", "cookie2=value2"]
|
||||||
body = await resp.text()
|
body = await resp.text()
|
||||||
assert body == "test"
|
assert body == "test"
|
||||||
|
|
||||||
@ -49,6 +57,10 @@ async def test_ingress_request_get(
|
|||||||
== f"/api/hassio_ingress/{build_type[0]}"
|
== f"/api/hassio_ingress/{build_type[0]}"
|
||||||
)
|
)
|
||||||
assert aioclient_mock.mock_calls[-1][3]["X-Test-Header"] == "beer"
|
assert aioclient_mock.mock_calls[-1][3]["X-Test-Header"] == "beer"
|
||||||
|
assert aioclient_mock.mock_calls[-1][3].getall("X-Test-Header") == [
|
||||||
|
"beer",
|
||||||
|
"more beer",
|
||||||
|
]
|
||||||
assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_FOR]
|
assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_FOR]
|
||||||
assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_HOST]
|
assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_HOST]
|
||||||
assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO]
|
assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user