Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homeassistant/components/hassio/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
ATTR_HOMEASSISTANT_EXCLUDE_DATABASE = "homeassistant_exclude_database"
ATTR_INPUT = "input"
ATTR_ISSUES = "issues"
ATTR_MESSAGE = "message"
ATTR_METHOD = "method"
ATTR_PANELS = "panels"
ATTR_PASSWORD = "password"
Expand Down
21 changes: 15 additions & 6 deletions homeassistant/components/hassio/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from homeassistant.core import HomeAssistant
from homeassistant.loader import bind_hass

from .const import ATTR_DISCOVERY, DOMAIN, X_HASS_SOURCE
from .const import ATTR_DISCOVERY, ATTR_MESSAGE, ATTR_RESULT, DOMAIN, X_HASS_SOURCE

_P = ParamSpec("_P")

Expand Down Expand Up @@ -577,7 +577,7 @@ async def send_command(
raise HassioAPIError()

try:
request = await self.websession.request(
response = await self.websession.request(
method,
joined_url,
json=payload,
Expand All @@ -590,14 +590,23 @@ async def send_command(
timeout=aiohttp.ClientTimeout(total=timeout),
)

if request.status != HTTPStatus.OK:
_LOGGER.error("%s return code %d", command, request.status)
if response.status != HTTPStatus.OK:
error = await response.json(encoding="utf-8")
if error.get(ATTR_RESULT) == "error":
raise HassioAPIError(error.get(ATTR_MESSAGE))

_LOGGER.error(
"Request to %s method %s returned with code %d",
command,
method,
response.status,
)
raise HassioAPIError()

if return_text:
return await request.text(encoding="utf-8")
return await response.text(encoding="utf-8")

return await request.json(encoding="utf-8")
return await response.json(encoding="utf-8")

except TimeoutError:
_LOGGER.error("Timeout on %s request", command)
Expand Down
4 changes: 0 additions & 4 deletions homeassistant/components/hassio/websocket_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
ATTR_DATA,
ATTR_ENDPOINT,
ATTR_METHOD,
ATTR_RESULT,
ATTR_SESSION_DATA_USER_ID,
ATTR_TIMEOUT,
ATTR_WS_EVENT,
Expand Down Expand Up @@ -132,9 +131,6 @@ async def websocket_supervisor_api(
payload=payload,
source="core.websocket_api",
)

if result.get(ATTR_RESULT) == "error":
raise HassioAPIError(result.get("message"))
except HassioAPIError as err:
_LOGGER.error("Failed to to call %s - %s", msg[ATTR_ENDPOINT], err)
connection.send_error(
Expand Down
31 changes: 31 additions & 0 deletions tests/components/hassio/test_websocket_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ async def test_websocket_supervisor_api_error(
aioclient_mock.get(
"http://127.0.0.1/ping",
json={"result": "error", "message": "example error"},
status=400,
)

await websocket_client.send_json(
Expand All @@ -184,9 +185,39 @@ async def test_websocket_supervisor_api_error(
)

msg = await websocket_client.receive_json()
assert msg["error"]["code"] == "unknown_error"
assert msg["error"]["message"] == "example error"


async def test_websocket_supervisor_api_error_without_msg(
hassio_env,
hass: HomeAssistant,
hass_ws_client: WebSocketGenerator,
aioclient_mock: AiohttpClientMocker,
) -> None:
"""Test Supervisor websocket api error."""
assert await async_setup_component(hass, "hassio", {})
websocket_client = await hass_ws_client(hass)
aioclient_mock.get(
"http://127.0.0.1/ping",
json={},
status=400,
)

await websocket_client.send_json(
{
WS_ID: 1,
WS_TYPE: WS_TYPE_API,
ATTR_ENDPOINT: "/ping",
ATTR_METHOD: "get",
}
)

msg = await websocket_client.receive_json()
assert msg["error"]["code"] == "unknown_error"
assert msg["error"]["message"] == ""


async def test_websocket_non_admin_user(
hassio_env,
hass: HomeAssistant,
Expand Down