From 9eb1c67726dd25ed6980842efcead5d7567ed649 Mon Sep 17 00:00:00 2001 From: Nick Sonneveld Date: Fri, 30 Mar 2018 15:06:04 +1100 Subject: [PATCH] Close request object, not the whole connection. Allows keepalive This merges [PR-269](https://github.com/plamere/spotipy/pull/269) from the base spotipy project ahead of it getting merged in upstream. --- spotipy/client.py | 55 ++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/spotipy/client.py b/spotipy/client.py index 3e33a21..06858b9 100644 --- a/spotipy/client.py +++ b/spotipy/client.py @@ -107,36 +107,37 @@ class Spotify(object): if self.trace_out: print(url) - r = self._session.request(method, url, headers=headers, proxies=self.proxies, **args) + + with self._session.request(method, url, headers=headers, proxies=self.proxies, **args) as r: + + if self.trace: # pragma: no cover + print() + print ('request headers', headers) + print ('response headers', r.headers) + print ('http status', r.status_code) + print(method, r.url) + if payload: + print("DATA", json.dumps(payload)) + + try: + r.raise_for_status() + except: + try: + msg = r.json()['error']['message'] + except: + msg = 'error' + raise SpotifyException(r.status_code, + -1, '%s:\n %s' % (r.url, msg), headers=r.headers) + + try: + results = r.json() + except: + results = None if self.trace: # pragma: no cover + print('RESP', results) print() - print ('headers', headers) - print ('http status', r.status_code) - print(method, r.url) - if payload: - print("DATA", json.dumps(payload)) - - try: - r.raise_for_status() - except: - if r.text and len(r.text) > 0 and r.text != 'null': - raise SpotifyException(r.status_code, - -1, '%s:\n %s' % (r.url, r.json()['error']['message']), - headers=r.headers) - else: - raise SpotifyException(r.status_code, - -1, '%s:\n %s' % (r.url, 'error'), headers=r.headers) - finally: - r.connection.close() - if r.text and len(r.text) > 0 and r.text != 'null': - results = r.json() - if self.trace: # pragma: no cover - print('RESP', results) - print() - return results - else: - return None + return results def _get(self, url, args=None, payload=None, **kwargs): if args: