mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 20:27:08 +00:00
Remove crazy JSON encoding things that are no longer used (#13029)
Catch JSON encoding errors in HTTP view
This commit is contained in:
parent
ae286a550b
commit
0a2e949e0a
@ -9,7 +9,7 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
from aiohttp.web_exceptions import HTTPUnauthorized
|
from aiohttp.web_exceptions import HTTPUnauthorized, HTTPInternalServerError
|
||||||
|
|
||||||
import homeassistant.remote as rem
|
import homeassistant.remote as rem
|
||||||
from homeassistant.core import is_callback
|
from homeassistant.core import is_callback
|
||||||
@ -31,8 +31,12 @@ class HomeAssistantView(object):
|
|||||||
# pylint: disable=no-self-use
|
# pylint: disable=no-self-use
|
||||||
def json(self, result, status_code=200, headers=None):
|
def json(self, result, status_code=200, headers=None):
|
||||||
"""Return a JSON response."""
|
"""Return a JSON response."""
|
||||||
msg = json.dumps(
|
try:
|
||||||
result, sort_keys=True, cls=rem.JSONEncoder).encode('UTF-8')
|
msg = json.dumps(
|
||||||
|
result, sort_keys=True, cls=rem.JSONEncoder).encode('UTF-8')
|
||||||
|
except TypeError as err:
|
||||||
|
_LOGGER.error('Unable to serialize to JSON: %s\n%s', err, result)
|
||||||
|
raise HTTPInternalServerError
|
||||||
response = web.Response(
|
response = web.Response(
|
||||||
body=msg, content_type=CONTENT_TYPE_JSON, status=status_code,
|
body=msg, content_type=CONTENT_TYPE_JSON, status=status_code,
|
||||||
headers=headers)
|
headers=headers)
|
||||||
|
@ -240,7 +240,11 @@ class ActiveConnection:
|
|||||||
if message is None:
|
if message is None:
|
||||||
break
|
break
|
||||||
self.debug("Sending", message)
|
self.debug("Sending", message)
|
||||||
await self.wsock.send_json(message, dumps=JSON_DUMP)
|
try:
|
||||||
|
await self.wsock.send_json(message, dumps=JSON_DUMP)
|
||||||
|
except TypeError as err:
|
||||||
|
_LOGGER.error('Unable to serialize to JSON: %s\n%s',
|
||||||
|
err, message)
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def send_message_outside(self, message):
|
def send_message_outside(self, message):
|
||||||
|
@ -123,17 +123,7 @@ class JSONEncoder(json.JSONEncoder):
|
|||||||
elif hasattr(o, 'as_dict'):
|
elif hasattr(o, 'as_dict'):
|
||||||
return o.as_dict()
|
return o.as_dict()
|
||||||
|
|
||||||
try:
|
return json.JSONEncoder.default(self, o)
|
||||||
return json.JSONEncoder.default(self, o)
|
|
||||||
except TypeError:
|
|
||||||
# If the JSON serializer couldn't serialize it
|
|
||||||
# it might be a generator, convert it to a list
|
|
||||||
try:
|
|
||||||
return [self.default(child_obj)
|
|
||||||
for child_obj in o]
|
|
||||||
except TypeError:
|
|
||||||
# Ok, we're lost, cause the original error
|
|
||||||
return json.JSONEncoder.default(self, o)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_api(api):
|
def validate_api(api):
|
||||||
|
15
tests/components/http/test_view.py
Normal file
15
tests/components/http/test_view.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
"""Tests for Home Assistant View."""
|
||||||
|
from aiohttp.web_exceptions import HTTPInternalServerError
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from homeassistant.components.http.view import HomeAssistantView
|
||||||
|
|
||||||
|
|
||||||
|
async def test_invalid_json(caplog):
|
||||||
|
"""Test trying to return invalid JSON."""
|
||||||
|
view = HomeAssistantView()
|
||||||
|
|
||||||
|
with pytest.raises(HTTPInternalServerError):
|
||||||
|
view.json(object)
|
||||||
|
|
||||||
|
assert str(object) in caplog.text
|
Loading…
x
Reference in New Issue
Block a user