Allow multiple set-cookie headers with hassio ingress (#148148)

This commit is contained in:
Ruben van Dijk 2025-07-08 06:13:08 +02:00 committed by GitHub
parent 9ce03c79f0
commit f478812568
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 9 deletions

View File

@ -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}"
def _init_header(request: web.Request, token: str) -> CIMultiDict | dict[str, str]:
def _init_header(request: web.Request, token: str) -> CIMultiDict:
"""Create initial header."""
headers = {
name: value
headers = CIMultiDict(
(name, value)
for name, value in request.headers.items()
if name not in INIT_HEADERS_FILTER
}
)
# Ingress information
headers[X_HASS_SOURCE] = "core.ingress"
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
def _response_header(response: aiohttp.ClientResponse) -> dict[str, str]:
def _response_header(response: aiohttp.ClientResponse) -> CIMultiDict:
"""Create response header."""
return {
name: value
return CIMultiDict(
(name, value)
for name, value in response.headers.items()
if name not in RESPONSE_HEADERS_FILTER
}
)
def _is_websocket(request: web.Request) -> bool:

View File

@ -4,6 +4,7 @@ from http import HTTPStatus
from unittest.mock import MagicMock, patch
from aiohttp.hdrs import X_FORWARDED_FOR, X_FORWARDED_HOST, X_FORWARDED_PROTO
from multidict import CIMultiDict
import pytest
from homeassistant.components.hassio.const import X_AUTH_TOKEN
@ -28,15 +29,22 @@ async def test_ingress_request_get(
aioclient_mock.get(
f"http://127.0.0.1/ingress/{build_type[0]}/{build_type[1]}",
text="test",
headers=CIMultiDict(
[("Set-Cookie", "cookie1=value1"), ("Set-Cookie", "cookie2=value2")]
),
)
resp = await hassio_noauth_client.get(
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
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()
assert body == "test"
@ -49,6 +57,10 @@ async def test_ingress_request_get(
== 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].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_HOST]
assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO]