Fix getting the current host for IPv6 urls (#126889)
parent
3c0be47d3c
commit
9ec26a9be5
|
@ -220,7 +220,15 @@ def _get_request_host() -> str | None:
|
|||
# partition the host to remove the port
|
||||
# because the raw host header can contain the port
|
||||
host = request.headers.get(hdrs.HOST)
|
||||
return None if host is None else host.partition(":")[0]
|
||||
if host is None:
|
||||
return None
|
||||
# IPv6 addresses are enclosed in brackets
|
||||
# use same logic as yarl and urllib to extract the host
|
||||
if "[" in host:
|
||||
return (host.partition("[")[2]).partition("]")[0]
|
||||
if ":" in host:
|
||||
host = host.partition(":")[0]
|
||||
return host
|
||||
|
||||
|
||||
@bind_hass
|
||||
|
|
|
@ -587,7 +587,7 @@ async def test_get_url(hass: HomeAssistant) -> None:
|
|||
assert get_url(hass, allow_internal=False)
|
||||
|
||||
|
||||
async def test_get_request_host(hass: HomeAssistant) -> None:
|
||||
async def test_get_request_host_with_port(hass: HomeAssistant) -> None:
|
||||
"""Test getting the host of the current web request from the request context."""
|
||||
with pytest.raises(NoURLAvailableError):
|
||||
_get_request_host()
|
||||
|
@ -604,6 +604,65 @@ async def test_get_request_host(hass: HomeAssistant) -> None:
|
|||
assert _get_request_host() == "example.com"
|
||||
|
||||
|
||||
async def test_get_request_host_without_port(hass: HomeAssistant) -> None:
|
||||
"""Test getting the host of the current web request from the request context."""
|
||||
with pytest.raises(NoURLAvailableError):
|
||||
_get_request_host()
|
||||
|
||||
with patch("homeassistant.components.http.current_request") as mock_request_context:
|
||||
mock_request = Mock()
|
||||
mock_request.headers = CIMultiDictProxy(CIMultiDict({hdrs.HOST: "example.com"}))
|
||||
mock_request.url = URL("http://example.com/test/request")
|
||||
mock_request.host = "example.com"
|
||||
mock_request_context.get = Mock(return_value=mock_request)
|
||||
|
||||
assert _get_request_host() == "example.com"
|
||||
|
||||
|
||||
async def test_get_request_ipv6_address(hass: HomeAssistant) -> None:
|
||||
"""Test getting the ipv6 host of the current web request from the request context."""
|
||||
with pytest.raises(NoURLAvailableError):
|
||||
_get_request_host()
|
||||
|
||||
with patch("homeassistant.components.http.current_request") as mock_request_context:
|
||||
mock_request = Mock()
|
||||
mock_request.headers = CIMultiDictProxy(CIMultiDict({hdrs.HOST: "[::1]:8123"}))
|
||||
mock_request.url = URL("http://[::1]:8123/test/request")
|
||||
mock_request.host = "[::1]:8123"
|
||||
mock_request_context.get = Mock(return_value=mock_request)
|
||||
|
||||
assert _get_request_host() == "::1"
|
||||
|
||||
|
||||
async def test_get_request_ipv6_address_without_port(hass: HomeAssistant) -> None:
|
||||
"""Test getting the ipv6 host of the current web request from the request context."""
|
||||
with pytest.raises(NoURLAvailableError):
|
||||
_get_request_host()
|
||||
|
||||
with patch("homeassistant.components.http.current_request") as mock_request_context:
|
||||
mock_request = Mock()
|
||||
mock_request.headers = CIMultiDictProxy(CIMultiDict({hdrs.HOST: "[::1]"}))
|
||||
mock_request.url = URL("http://[::1]/test/request")
|
||||
mock_request.host = "[::1]"
|
||||
mock_request_context.get = Mock(return_value=mock_request)
|
||||
|
||||
assert _get_request_host() == "::1"
|
||||
|
||||
|
||||
async def test_get_request_host_no_host_header(hass: HomeAssistant) -> None:
|
||||
"""Test getting the host of the current web request from the request context."""
|
||||
with pytest.raises(NoURLAvailableError):
|
||||
_get_request_host()
|
||||
|
||||
with patch("homeassistant.components.http.current_request") as mock_request_context:
|
||||
mock_request = Mock()
|
||||
mock_request.headers = CIMultiDictProxy(CIMultiDict())
|
||||
mock_request.url = URL("/test/request")
|
||||
mock_request_context.get = Mock(return_value=mock_request)
|
||||
|
||||
assert _get_request_host() is None
|
||||
|
||||
|
||||
@patch("homeassistant.components.hassio.is_hassio", Mock(return_value=True))
|
||||
@patch(
|
||||
"homeassistant.components.hassio.get_host_info",
|
||||
|
|
Loading…
Reference in New Issue