diff --git a/CHANGELOG.md b/CHANGELOG.md index 534f00d..f446aae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -// Add your changes here and then delete this line +### Fixed + +- SpotifyException now thrown when a request fails & has no response ( fixes #571, #581 ) ## [2.16.0] - 2020-09-16 diff --git a/spotipy/client.py b/spotipy/client.py index 6d4ff07..0d40114 100644 --- a/spotipy/client.py +++ b/spotipy/client.py @@ -243,7 +243,8 @@ class Spotify(object): response.raise_for_status() results = response.json() - except requests.exceptions.HTTPError: + except requests.exceptions.HTTPError as http_error: + response = http_error.response try: msg = response.json()["error"]["message"] except (ValueError, KeyError): @@ -263,13 +264,18 @@ class Spotify(object): reason=reason, headers=response.headers, ) - except requests.exceptions.RetryError: + except requests.exceptions.RetryError as retry_error: + request = retry_error.request logger.error('Max Retries reached') + try: + reason = retry_error.args[0].reason + except (IndexError, AttributeError): + reason = None raise SpotifyException( 599, -1, - "%s:\n %s" % (response.url, "Max Retries"), - headers=response.headers, + "%s:\n %s" % (request.path_url, "Max Retries"), + reason=reason ) except ValueError: results = None diff --git a/tests/integration/test_non_user_endpoints.py b/tests/integration/test_non_user_endpoints.py index 02b1a78..a6dcc34 100644 --- a/tests/integration/test_non_user_endpoints.py +++ b/tests/integration/test_non_user_endpoints.py @@ -240,6 +240,20 @@ class AuthTestSpotipy(unittest.TestCase): self.assertRaises((requests.exceptions.Timeout, requests.exceptions.ConnectionError), lambda: sp.search(q='my*', type='track')) + def test_max_retries_reached(self): + spotify_no_retry = Spotify( + client_credentials_manager=SpotifyClientCredentials(), + retries=0) + i = 0 + while i < 100: + try: + spotify_no_retry.search(q='foo') + except spotipy.exceptions.SpotifyException as e: + self.assertIsInstance(e, spotipy.exceptions.SpotifyException) + return + i += 1 + self.fail() + def test_album_search(self): results = self.spotify.search(q='weezer pinkerton', type='album') self.assertTrue('albums' in results)