diff options
author | Armin Ronacher <armin.ronacher@active-4.com> | 2016-04-27 13:11:15 +0200 |
---|---|---|
committer | Armin Ronacher <armin.ronacher@active-4.com> | 2016-04-27 13:11:15 +0200 |
commit | 4baedc02013c9bbe2d4f8cdd1418903f74214130 (patch) | |
tree | 915795e2b08e348494bd4751f9d63d498848dc97 | |
parent | bb660fc1eab73479252f42eba2ab62cefdb0a59c (diff) | |
download | raven-4baedc02013c9bbe2d4f8cdd1418903f74214130.tar.gz |
Added httplib support
-rw-r--r-- | raven/breadcrumbs.py | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/raven/breadcrumbs.py b/raven/breadcrumbs.py index 4c0fabb..9d8bd78 100644 --- a/raven/breadcrumbs.py +++ b/raven/breadcrumbs.py @@ -165,12 +165,17 @@ def install_logging_hook(): _patch_logger() -def ignore_logger(name_or_logger): +def ignore_logger(name_or_logger, allow_level=None): """Ignores a logger for the regular breadcrumb code. This is useful for framework integration code where some log messages should be specially handled. """ - register_special_log_handler(name_or_logger, lambda *args: True) + def handler(logger, level, msg, args, kwargs): + if allow_level is not None and \ + level >= allow_level: + return False + return True + register_special_log_handler(name_or_logger, handler) def register_special_log_handler(name_or_logger, callback): @@ -200,7 +205,7 @@ def libraryhook(name): @libraryhook('requests') def _hook_requests(): try: - from requests.sesisons import Session + from requests.sessions import Session except ImportError: return @@ -211,7 +216,7 @@ def _hook_requests(): record_breadcrumb('http_request', { 'url': request.url, 'method': request.method, - 'status_code': response and response.status or None, + 'status_code': response and response.status_code or None, 'reason': response and response.reason or None, 'classifier': 'requests', }) @@ -226,9 +231,59 @@ def _hook_requests(): Session.send = send + ignore_logger('requests.packages.urllib3.connectionpool', + allow_level=logging.WARNING) + + +@libraryhook('httplib') +def _install_httplib(): + try: + from httplib import HTTPConnection + except ImportError: + from http.client import HTTPConnection + + real_putrequest = HTTPConnection.putrequest + real_getresponse = HTTPConnection.getresponse + + def putrequest(self, method, url, *args, **kwargs): + self._raven_status_dict = status = {} + host = self.host + port = self.port + default_port = self.default_port + + def _make_data(): + real_url = url + if not real_url.startswith(('http://', 'https://')): + real_url = '%s://%s%s%s' % ( + default_port == 443 and 'https' or 'http', + host, + port != default_port and ':%s' % port or '', + url, + ) + data = { + 'url': real_url, + 'method': method, + 'classifier': 'httplib', + } + data.update(status) + return data + record_breadcrumb('http_request', _make_data) + return real_putrequest(self, method, url, *args, **kwargs) + + def getresponse(self, *args, **kwargs): + rv = real_getresponse(self, *args, **kwargs) + status = getattr(self, '_raven_status_dict', None) + if status is not None and 'status_code' not in status: + status['status_code'] = rv.status + status['reason'] = rv.reason + return rv + + HTTPConnection.putrequest = putrequest + HTTPConnection.getresponse = getresponse + def hook_libraries(libraries): - if not libraries: + if libraries is None: libraries = hooked_libraries.keys() for lib in libraries: func = hooked_libraries.get(lib) |