mirror of
https://github.com/home-assistant/core.git
synced 2025-12-20 02:48:57 +00:00
Fix webhook exception when empty json data is sent (#158254)
This commit is contained in:
@@ -15,6 +15,7 @@ from homeassistant.helpers import config_validation as cv
|
|||||||
from homeassistant.helpers.template import Template
|
from homeassistant.helpers.template import Template
|
||||||
from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
|
from homeassistant.helpers.trigger import TriggerActionType, TriggerInfo
|
||||||
from homeassistant.helpers.typing import ConfigType, TemplateVarsType
|
from homeassistant.helpers.typing import ConfigType, TemplateVarsType
|
||||||
|
from homeassistant.util.json import json_loads
|
||||||
|
|
||||||
from . import (
|
from . import (
|
||||||
DEFAULT_METHODS,
|
DEFAULT_METHODS,
|
||||||
@@ -62,7 +63,9 @@ async def _handle_webhook(
|
|||||||
base_result: dict[str, Any] = {"platform": "webhook", "webhook_id": webhook_id}
|
base_result: dict[str, Any] = {"platform": "webhook", "webhook_id": webhook_id}
|
||||||
|
|
||||||
if "json" in request.headers.get(hdrs.CONTENT_TYPE, ""):
|
if "json" in request.headers.get(hdrs.CONTENT_TYPE, ""):
|
||||||
base_result["json"] = await request.json()
|
# Always attempt to read the body; request.text() returns "" if empty
|
||||||
|
text = await request.text()
|
||||||
|
base_result["json"] = json_loads(text) if text else {}
|
||||||
else:
|
else:
|
||||||
base_result["data"] = await request.post()
|
base_result["data"] = await request.post()
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import pytest
|
|||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
|
from tests.common import async_capture_events
|
||||||
from tests.typing import ClientSessionGenerator
|
from tests.typing import ClientSessionGenerator
|
||||||
|
|
||||||
|
|
||||||
@@ -377,3 +378,46 @@ async def test_webhook_template(
|
|||||||
|
|
||||||
assert len(events) == 1
|
assert len(events) == 1
|
||||||
assert events[0].data["hello"] == "yo world"
|
assert events[0].data["hello"] == "yo world"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_webhook_query_json_header_no_payload(
|
||||||
|
hass: HomeAssistant, hass_client_no_auth: ClientSessionGenerator
|
||||||
|
) -> None:
|
||||||
|
"""Test requests with application/json header but no payload."""
|
||||||
|
events = async_capture_events(hass, "test_success")
|
||||||
|
|
||||||
|
assert await async_setup_component(
|
||||||
|
hass,
|
||||||
|
"automation",
|
||||||
|
{
|
||||||
|
"automation": {
|
||||||
|
"trigger": {
|
||||||
|
"platform": "webhook",
|
||||||
|
"webhook_id": "no_payload_webhook",
|
||||||
|
"local_only": True,
|
||||||
|
"allowed_methods": ["GET", "POST"],
|
||||||
|
},
|
||||||
|
"action": {
|
||||||
|
"event": "test_success",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
client = await hass_client_no_auth()
|
||||||
|
|
||||||
|
# GET
|
||||||
|
response = await client.get(
|
||||||
|
"/api/webhook/no_payload_webhook", headers={"Content-Type": "application/json"}
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert response.status == 200
|
||||||
|
|
||||||
|
# POST
|
||||||
|
response = await client.post(
|
||||||
|
"/api/webhook/no_payload_webhook", headers={"Content-Type": "application/json"}
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert response.status == 200
|
||||||
|
|
||||||
|
assert len(events) == 2
|
||||||
|
|||||||
Reference in New Issue
Block a user