From b5690290816468d3026c63609e3d0dc9fb230066 Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Wed, 3 Oct 2018 21:59:31 +0200 Subject: [PATCH] Improve error reporting when upstream API is defunct with e.g. "Service Unavailable: Back-end server is at capacity, see #5 --- CHANGES.rst | 2 ++ uspto/util/client.py | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 4bf12c9..e781a8c 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,8 @@ USPTO Open Data API client CHANGES development =========== - Upgrade to lxml 4.2.5 to satisfy libxml2 compilation on recent Homebrew +- Improve error reporting when upstream API is defunct + with e.g. ``Service Unavailable: Back-end server is at capacity``. Thanks, Mohamed! 2017-11-20 0.7.4 ================ diff --git a/uspto/util/client.py b/uspto/util/client.py index ad302f9..f4be5b5 100644 --- a/uspto/util/client.py +++ b/uspto/util/client.py @@ -57,23 +57,34 @@ def query(self, expression, filter=None, sort=None, start=None, rows=None, defau # Submit the query to the Solr search service response = self.session.post(self.QUERY_URL, json=solr_query) - #print(response.text) + #print(self.QUERY_URL, response.text) # Check response and scrape appropriate error message from HTML on failure if response.status_code != 200: - logger.error('Error while querying for %s\n%s', expression, response.text) - if response.headers['Content-Type'].startswith('text/html'): + + # First error message + message = u'Error while querying for {}'.format(expression) + if response.text: + message += u'\n{}'.format(response.text) + logger.error(message) + + # Compute second error message to reveal more details + if 'Content-Type' in response.headers and response.headers['Content-Type'].startswith('text/html'): soup = BeautifulSoup(response.text, 'html.parser') title = soup.find('title') message = title.string.strip() hr = soup.body.find('hr') reason = hr.next_sibling.string.strip() if reason: - message += '. ' + reason + message += u'. ' + reason message += ' (status={})'.format(response.status_code) + logger.error(message) raise ValueError(message) else: - raise ValueError('Search error with response of unknown Content-Type') + message = u'API error. Status: {}, Reason: {}, Content-Type: {}'.format( + response.status_code, response.reason, response.headers.get('Content-Type')) + logger.error(message) + raise ValueError(message) return response.json()