mirror of
https://github.com/home-assistant/core.git
synced 2025-07-26 06:37:52 +00:00
Add message from Bad Request errors to HassioAPIError (#113144)
Co-authored-by: Mike Degatano <michael.degatano@gmail.com>
This commit is contained in:
parent
6ecafbcc2c
commit
99eaa07f6f
@ -21,6 +21,7 @@ ATTR_HOMEASSISTANT = "homeassistant"
|
|||||||
ATTR_HOMEASSISTANT_EXCLUDE_DATABASE = "homeassistant_exclude_database"
|
ATTR_HOMEASSISTANT_EXCLUDE_DATABASE = "homeassistant_exclude_database"
|
||||||
ATTR_INPUT = "input"
|
ATTR_INPUT = "input"
|
||||||
ATTR_ISSUES = "issues"
|
ATTR_ISSUES = "issues"
|
||||||
|
ATTR_MESSAGE = "message"
|
||||||
ATTR_METHOD = "method"
|
ATTR_METHOD = "method"
|
||||||
ATTR_PANELS = "panels"
|
ATTR_PANELS = "panels"
|
||||||
ATTR_PASSWORD = "password"
|
ATTR_PASSWORD = "password"
|
||||||
|
@ -22,7 +22,7 @@ from homeassistant.const import SERVER_PORT
|
|||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.loader import bind_hass
|
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")
|
_P = ParamSpec("_P")
|
||||||
|
|
||||||
@ -577,7 +577,7 @@ class HassIO:
|
|||||||
raise HassioAPIError()
|
raise HassioAPIError()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
request = await self.websession.request(
|
response = await self.websession.request(
|
||||||
method,
|
method,
|
||||||
joined_url,
|
joined_url,
|
||||||
json=payload,
|
json=payload,
|
||||||
@ -590,14 +590,23 @@ class HassIO:
|
|||||||
timeout=aiohttp.ClientTimeout(total=timeout),
|
timeout=aiohttp.ClientTimeout(total=timeout),
|
||||||
)
|
)
|
||||||
|
|
||||||
if request.status != HTTPStatus.OK:
|
if response.status != HTTPStatus.OK:
|
||||||
_LOGGER.error("%s return code %d", command, request.status)
|
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()
|
raise HassioAPIError()
|
||||||
|
|
||||||
if return_text:
|
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:
|
except TimeoutError:
|
||||||
_LOGGER.error("Timeout on %s request", command)
|
_LOGGER.error("Timeout on %s request", command)
|
||||||
|
@ -22,7 +22,6 @@ from .const import (
|
|||||||
ATTR_DATA,
|
ATTR_DATA,
|
||||||
ATTR_ENDPOINT,
|
ATTR_ENDPOINT,
|
||||||
ATTR_METHOD,
|
ATTR_METHOD,
|
||||||
ATTR_RESULT,
|
|
||||||
ATTR_SESSION_DATA_USER_ID,
|
ATTR_SESSION_DATA_USER_ID,
|
||||||
ATTR_TIMEOUT,
|
ATTR_TIMEOUT,
|
||||||
ATTR_WS_EVENT,
|
ATTR_WS_EVENT,
|
||||||
@ -132,9 +131,6 @@ async def websocket_supervisor_api(
|
|||||||
payload=payload,
|
payload=payload,
|
||||||
source="core.websocket_api",
|
source="core.websocket_api",
|
||||||
)
|
)
|
||||||
|
|
||||||
if result.get(ATTR_RESULT) == "error":
|
|
||||||
raise HassioAPIError(result.get("message"))
|
|
||||||
except HassioAPIError as err:
|
except HassioAPIError as err:
|
||||||
_LOGGER.error("Failed to to call %s - %s", msg[ATTR_ENDPOINT], err)
|
_LOGGER.error("Failed to to call %s - %s", msg[ATTR_ENDPOINT], err)
|
||||||
connection.send_error(
|
connection.send_error(
|
||||||
|
@ -172,6 +172,7 @@ async def test_websocket_supervisor_api_error(
|
|||||||
aioclient_mock.get(
|
aioclient_mock.get(
|
||||||
"http://127.0.0.1/ping",
|
"http://127.0.0.1/ping",
|
||||||
json={"result": "error", "message": "example error"},
|
json={"result": "error", "message": "example error"},
|
||||||
|
status=400,
|
||||||
)
|
)
|
||||||
|
|
||||||
await websocket_client.send_json(
|
await websocket_client.send_json(
|
||||||
@ -184,9 +185,39 @@ async def test_websocket_supervisor_api_error(
|
|||||||
)
|
)
|
||||||
|
|
||||||
msg = await websocket_client.receive_json()
|
msg = await websocket_client.receive_json()
|
||||||
|
assert msg["error"]["code"] == "unknown_error"
|
||||||
assert msg["error"]["message"] == "example 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(
|
async def test_websocket_non_admin_user(
|
||||||
hassio_env,
|
hassio_env,
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user