From 21b3d992492efd36e676945e4672e95f13ced4f2 Mon Sep 17 00:00:00 2001 From: Bas Stottelaar Date: Mon, 15 Sep 2014 00:40:32 +0200 Subject: [PATCH] Debug JSON responses --- headphones/request.py | 61 +++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/headphones/request.py b/headphones/request.py index f5e8b5d9..6cc0f7f2 100644 --- a/headphones/request.py +++ b/headphones/request.py @@ -80,25 +80,9 @@ def request_response(url, method="get", auto_raise=True, 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 150 characters, - # since it may return the whole page in case of normal web page URLs + # Debug response 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 - message = message.strip() - else: - message = e.response.content.strip() - - if message: - # Truncate message if it is too long. - if len(message) > 150: - message = message[:150] + "..." - - logger.debug("Server responded with message: %s", message) + server_message(e.response) else: logger.error("Request raised HTTP error.") except requests.RequestException as e: @@ -144,12 +128,16 @@ def request_json(url, **kwargs): result = response.json() if validator and not validator(result): - logger.error("JSON validation result vailed") + logger.error("JSON validation result failed") else: return result except ValueError: logger.error("Response returned invalid JSON data") + # Debug response + if headphones.VERBOSE: + server_message(response) + def request_content(url, **kwargs): """ Wrapper for `request_response', which will return the raw content. @@ -168,4 +156,37 @@ def request_feed(url, **kwargs): response = request_response(url, **kwargs) if response is not None: - return feedparser.parse(response.content) \ No newline at end of file + return feedparser.parse(response.content) + +def server_message(response): + """ + Extract server message from response and log in to logger with DEBUG level. + + Some servers return extra information in the result. Try to parse it for + debugging purpose. Messages are limited to 150 characters, since it may + return the whole page in case of normal web page URLs + """ + + message = None + + # First attempt is to 'read' the response as HTML + if response.headers.get("content-type") == "text/html": + try: + soup = BeautifulSoup(response.content, "html5lib") + except Exception: + pass + + message = soup.find("body") + message = message.text if message else soup.text + message = message.strip() + + # Second attempt is to just take the response + if message is None: + message = response.content.strip() + + if message: + # Truncate message if it is too long. + if len(message) > 150: + message = message[:150] + "..." + + logger.debug("Server responded with message: %s", message) \ No newline at end of file