diff --git a/roborock/protocols/v1_protocol.py b/roborock/protocols/v1_protocol.py index 34a596ae..8b2ceae5 100644 --- a/roborock/protocols/v1_protocol.py +++ b/roborock/protocols/v1_protocol.py @@ -135,7 +135,7 @@ def decode_rpc_response(message: RoborockMessage) -> ResponseMessage: return ResponseMessage(request_id=message.seq, data={}) try: payload = json.loads(message.payload.decode()) - except (json.JSONDecodeError, TypeError) as e: + except (json.JSONDecodeError, TypeError, UnicodeDecodeError) as e: raise RoborockException(f"Invalid V1 message payload: {e} for {message.payload!r}") from e _LOGGER.debug("Decoded V1 message payload: %s", payload) diff --git a/tests/protocols/test_v1_protocol.py b/tests/protocols/test_v1_protocol.py index 688c02cc..c7ff730b 100644 --- a/tests/protocols/test_v1_protocol.py +++ b/tests/protocols/test_v1_protocol.py @@ -274,3 +274,17 @@ def test_decode_no_request_id(): ) with pytest.raises(RoborockException, match="The method called is not recognized by the device"): decode_rpc_response(message) + + +def test_invalid_unicode() -> None: + """Test an error while decoding unicode bytes""" + message = RoborockMessage( + protocol=RoborockMessageProtocol.GENERAL_RESPONSE, + payload=b"hello\xff\xfe", # Invalid UTF-8 bytes + seq=12750, + version=b"1.0", + random=97431, + timestamp=1652547161, + ) + with pytest.raises(RoborockException, match="Invalid V1 message payload"): + decode_rpc_response(message)