From bc2898afee277735a4c481493414bfe33ebf432e Mon Sep 17 00:00:00 2001 From: coreGreenberet Date: Sun, 12 Apr 2020 09:42:14 +0200 Subject: [PATCH] added calls to response.close() to fix a memory leak see https://github.com/psf/requests/issues/4601#issuecomment-603326738 for details --- meraki/rest_session.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/meraki/rest_session.py b/meraki/rest_session.py index fc084a33..38bb9281 100644 --- a/meraki/rest_session.py +++ b/meraki/rest_session.py @@ -95,6 +95,8 @@ def request(self, metadata, method, url, **kwargs): while retries > 0: # Make the HTTP request to the API endpoint try: + if response: + response.close() response = self._req_session.request(method, abs_url, allow_redirects=False, **kwargs) reason = response.reason if response.reason else '' status = response.status_code @@ -190,7 +192,12 @@ def get(self, metadata, url, params=None): metadata['url'] = url metadata['params'] = params response = self.request(metadata, 'GET', url, params=params) - return response.json() if response and response.text.strip() else None + ret = None + if response: + if response.text.strip(): + ret = response.json() + response.close() + return ret def get_pages(self, metadata, url, params=None, total_pages=-1, direction='next'): if type(total_pages) == str and total_pages.lower() == 'all': @@ -217,6 +224,9 @@ def get_pages(self, metadata, url, params=None, total_pages=-1, direction='next' elif 'rel=last' in l: last = l[l.find('<')+1:l.find('>')] + response.close() + response = None + # GET the subsequent page if direction == 'next' and next: metadata['page'] += 1 @@ -243,6 +253,9 @@ def get_pages(self, metadata, url, params=None, total_pages=-1, direction='next' total_pages -= 1 + if response: + response.close() + return results def post(self, metadata, url, json=None): @@ -250,17 +263,29 @@ def post(self, metadata, url, json=None): metadata['url'] = url metadata['json'] = json response = self.request(metadata, 'POST', url, json=json) - return response.json() if response and response.text.strip() else None + ret = None + if response: + if response.text.strip(): + ret = response.json() + response.close() + return ret def put(self, metadata, url, json=None): metadata['method'] = 'PUT' metadata['url'] = url metadata['json'] = json response = self.request(metadata, 'PUT', url, json=json) - return response.json() if response and response.text.strip() else None + ret = None + if response: + if response.text.strip(): + ret = response.json() + response.close() + return ret def delete(self, metadata, url): metadata['method'] = 'DELETE' metadata['url'] = url - self.request(metadata, 'DELETE', url) + response = self.request(metadata, 'DELETE', url) + if response: + response.close() return None