From 9a7300cda170a67bcbc26fb25c21278e94a64550 Mon Sep 17 00:00:00 2001 From: Bas Stottelaar Date: Wed, 11 Jun 2014 13:18:59 +0200 Subject: [PATCH] Parse response content for HTTP errors when verbose is turned on --- headphones/request.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/headphones/request.py b/headphones/request.py index 4edb8b2f..20fae2bf 100644 --- a/headphones/request.py +++ b/headphones/request.py @@ -45,10 +45,10 @@ def request_response(url, method="get", auto_raise=True, whitelist_status_code=N return response except requests.ConnectionError: - logger.error("Unable to connect to remote host.") + logger.error("Unable to connect to remote host. Check if the remote host is up and running.") except requests.Timeout: - logger.error("Request timed out.") - except requests.HTTPError, e: + logger.error("Request timed out. The remote host did not respeond timely.") + except requests.HTTPError as e: if e.response is not None: if e.response.status_code >= 500: cause = "remote server error" @@ -59,9 +59,27 @@ def request_response(url, method="get", auto_raise=True, whitelist_status_code=N cause = "unknown" logger.error("Request raise HTTP error with status code %d (%s).", e.response.status_code, cause) + + # Some servers return extra information in the result. Try to parse + # it for debugging purpose. Messages are limited to 100 characters, + # since it may return the whole page in case of normal web page URLs + if headphones.VERBOSE: + if e.response.headers.get('content-type') == 'text/html': + soup = BeautifulSoup(e.response.content, "html5lib") + + message = soup.find("body") + message = message.text if message else soup.text + else: + message = e.response.content + + # Truncate message if it is too long. + if len(message) > 100: + message = message[:100] + "..." + + logger.debug("Server responded with message: %s", message) else: logger.error("Request raised HTTP error.") - except requests.RequestException, e: + except requests.RequestException as e: logger.error("Request raised exception: %s", e) def request_soup(url, **kwargs):