Add Logging for Invalid JSON Data in BasePersistence.parse_json_payload (#3668)

This commit is contained in:
Bibo-Joshi 2023-04-18 16:17:20 +02:00 committed by GitHub
parent 7b116be344
commit f23315d08b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 2 deletions

View file

@ -26,6 +26,7 @@ from typing import AsyncContextManager, ClassVar, List, Optional, Tuple, Type, T
from telegram._utils.defaultvalue import DEFAULT_NONE as _DEFAULT_NONE
from telegram._utils.defaultvalue import DefaultValue
from telegram._utils.logging import get_logger
from telegram._utils.types import JSONDict, ODVInput
from telegram._version import __version__ as ptb_ver
from telegram.error import (
@ -42,6 +43,8 @@ from telegram.request._requestdata import RequestData
RT = TypeVar("RT", bound="BaseRequest")
_LOGGER = get_logger(__name__, class_name="BaseRequest")
class BaseRequest(
AsyncContextManager["BaseRequest"],
@ -351,6 +354,7 @@ class BaseRequest(
try:
return json.loads(decoded_s)
except ValueError as exc:
_LOGGER.error('Can not load invalid JSON data: "%s"', decoded_s)
raise TelegramError("Invalid server response") from exc
@abc.abstractmethod

View file

@ -20,6 +20,7 @@
implementations for BaseRequest and we want to test HTTPXRequest anyway."""
import asyncio
import json
import logging
from collections import defaultdict
from dataclasses import dataclass
from http import HTTPStatus
@ -172,15 +173,22 @@ class TestRequestWithoutRequest:
# not only implicitly.
assert httpx_request.parse_json_payload(server_response) == {"result": "test_string<EFBFBD>"}
async def test_illegal_json_response(self, monkeypatch, httpx_request: HTTPXRequest):
async def test_illegal_json_response(self, monkeypatch, httpx_request: HTTPXRequest, caplog):
# for proper JSON it should be `"result":` instead of `result:`
server_response = b'{result: "test_string"}'
monkeypatch.setattr(httpx_request, "do_request", mocker_factory(response=server_response))
with pytest.raises(TelegramError, match="Invalid server response"):
with pytest.raises(TelegramError, match="Invalid server response"), caplog.at_level(
logging.ERROR
):
await httpx_request.post(None, None, None)
assert len(caplog.records) == 1
record = caplog.records[0]
assert record.name == "telegram.request.BaseRequest"
assert record.getMessage().endswith(f'invalid JSON data: "{server_response.decode()}"')
async def test_chat_migrated(self, monkeypatch, httpx_request: HTTPXRequest):
server_response = b'{"ok": "False", "parameters": {"migrate_to_chat_id": 123}}'