ivanprjcts/sdklib

View on GitHub
sdklib/util/logger.py

Summary

Maintainability
A
2 hrs
Test Coverage
# -*- coding: utf-8 -*-

import json
import logging
from xml.dom.minidom import parseString

from sdklib.compat import str
from sdklib.http.headers import CONTENT_TYPE_HEADER_NAME
from sdklib.http.renderers import JSONRenderer, XMLRenderer

logger = logging.getLogger(__name__)


def _get_pretty_body(headers, body):
    """
    Return a pretty printed body using the Content-Type header information.

    :param headers: Headers for the request/response (dict)
    :param body: Body to pretty print (string)
    :return: Body pretty printed (string)
    """
    try:
        if CONTENT_TYPE_HEADER_NAME in headers:
            if XMLRenderer.DEFAULT_CONTENT_TYPE == headers[CONTENT_TYPE_HEADER_NAME]:
                xml_parsed = parseString(body)
                pretty_xml_as_string = xml_parsed.toprettyxml()
                return pretty_xml_as_string
            elif JSONRenderer.DEFAULT_CONTENT_TYPE == headers[CONTENT_TYPE_HEADER_NAME]:
                decoded_body = body.decode('utf-8')
                parsed = json.loads(decoded_body)
                return json.dumps(parsed, sort_keys=True, indent=4)
    except Exception:
        pass
    finally:
        return body


def log_print_request(method, url, query_params=None, headers=None, body=None):
    """
    Log an HTTP request data in a user-friendly representation.

    :param method: HTTP method
    :param url: URL
    :param query_params: Query parameters in the URL
    :param headers: Headers (dict)
    :param body: Body (raw body, string)
    :return: None
    """

    log_msg = '\n>>>>>>>>>>>>>>>>>>>>> Request >>>>>>>>>>>>>>>>>>> \n'
    log_msg += '\t> Method: %s\n' % method
    log_msg += '\t> Url: %s\n' % url
    if query_params is not None:
        log_msg += '\t> Query params: {}\n'.format(str(query_params))
    if headers is not None:
        log_msg += '\t> Headers:\n{}\n'.format(json.dumps(dict(headers), sort_keys=True, indent=4))
    if body is not None:
        try:
            log_msg += '\t> Payload sent:\n{}\n'.format(_get_pretty_body(headers, body))
        except Exception:
            log_msg += "\t> Payload could't be formatted"

    logger.debug(log_msg)


def log_print_response(status_code, response, headers=None):
    """
    Log an HTTP response data in a user-friendly representation.

    :param status_code: HTTP Status Code
    :param response: Raw response content (string)
    :param headers: Headers in the response (dict)
    :return: None
    """

    log_msg = '\n<<<<<<<<<<<<<<<<<<<<<< Response <<<<<<<<<<<<<<<<<<\n'
    log_msg += '\t< Response code: {}\n'.format(str(status_code))
    if headers is not None:
        log_msg += '\t< Headers:\n{}\n'.format(json.dumps(dict(headers), sort_keys=True, indent=4))
    try:
        log_msg += '\t< Payload received:\n{}'.format(_get_pretty_body(headers, response))
    except Exception:
        log_msg += '\t< Payload received:\n{}'.format(response)
    logger.debug(log_msg)