From 2fa05ddf65fcb1899ab2d0ca87bd055c49cfa27d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 11:31:10 +0200 Subject: [PATCH 1/4] Add BadResponseException exception with code -1 --- trakt/errors.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/trakt/errors.py b/trakt/errors.py index 8a54cd48..6c6a1acc 100644 --- a/trakt/errors.py +++ b/trakt/errors.py @@ -6,7 +6,13 @@ __author__ = 'Jon Nappi' __all__ = [ + # Base Exception 'TraktException', + + # Errors for use by PyTrakt + 'BadResponseException', + + # Exceptions by HTTP status code 'BadRequestException', 'OAuthException', 'ForbiddenException', @@ -32,6 +38,12 @@ def __str__(self): return self.message +class BadResponseException(TraktException): + """TraktException type to be raised when json could not be decoded""" + http_code = -1 + message = "Bad Response - Response could not be parsed" + + class BadRequestException(TraktException): """TraktException type to be raised when a 400 return code is received""" http_code = 400 From 6d36b688b02e6687fff9da7e00fec95963eb54e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 11:41:08 +0200 Subject: [PATCH 2/4] Catch json decode errors for unhandled status codes --- trakt/core.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/trakt/core.py b/trakt/core.py index dd3f8931..8132ba59 100644 --- a/trakt/core.py +++ b/trakt/core.py @@ -5,6 +5,7 @@ import json import logging import os +from json import JSONDecodeError from urllib.parse import urljoin import requests @@ -529,7 +530,12 @@ def _handle_request(self, method, url, data=None): raise self.error_map[response.status_code](response) elif response.status_code == 204: # HTTP no content return None - json_data = json.loads(response.content.decode('UTF-8', 'ignore')) + + try: + json_data = json.loads(response.content.decode('UTF-8', 'ignore')) + except JSONDecodeError: + raise errors.BadResponseException(response) + return json_data def get(self, f): From 31d6737571b14ee37938bcccab6cbbe6a876c180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 21:47:18 +0200 Subject: [PATCH 3/4] Add details parameter to BadResponseException constructor --- trakt/errors.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/trakt/errors.py b/trakt/errors.py index 6c6a1acc..30e01694 100644 --- a/trakt/errors.py +++ b/trakt/errors.py @@ -43,6 +43,10 @@ class BadResponseException(TraktException): http_code = -1 message = "Bad Response - Response could not be parsed" + def __init__(self, response=None, details=None): + super().__init__(response) + self.details = details + class BadRequestException(TraktException): """TraktException type to be raised when a 400 return code is received""" From 27d90b1a4c4850889accd5234356a8253e5b59a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= Date: Sat, 15 Jan 2022 18:09:04 +0200 Subject: [PATCH 4/4] Add details to BadResponseException of json error --- trakt/core.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/trakt/core.py b/trakt/core.py index 8132ba59..6dcaa04a 100644 --- a/trakt/core.py +++ b/trakt/core.py @@ -16,6 +16,7 @@ from requests_oauthlib import OAuth2Session from datetime import datetime, timedelta, timezone from trakt import errors +from trakt.errors import BadResponseException __author__ = 'Jon Nappi' __all__ = ['Airs', 'Alias', 'Comment', 'Genre', 'get', 'delete', 'post', 'put', @@ -533,8 +534,8 @@ def _handle_request(self, method, url, data=None): try: json_data = json.loads(response.content.decode('UTF-8', 'ignore')) - except JSONDecodeError: - raise errors.BadResponseException(response) + except JSONDecodeError as e: + raise BadResponseException(response, f"Unable to parse JSON: {e}") return json_data