diff options
Diffstat (limited to 'keystoneclient/session.py')
-rw-r--r-- | keystoneclient/session.py | 101 |
1 files changed, 72 insertions, 29 deletions
diff --git a/keystoneclient/session.py b/keystoneclient/session.py index 5426d99..c74f752 100644 --- a/keystoneclient/session.py +++ b/keystoneclient/session.py @@ -130,11 +130,69 @@ class Session(object): if user_agent is not None: self.user_agent = user_agent + @utils.positional() + def _http_log_request(self, url, method=None, data=None, + json=None, headers=None): + if not _logger.isEnabledFor(logging.DEBUG): + # NOTE(morganfainberg): This whole debug section is expensive, + # there is no need to do the work if we're not going to emit a + # debug log. + return + + string_parts = ['REQ: curl -i'] + + # NOTE(jamielennox): None means let requests do its default validation + # so we need to actually check that this is False. + if self.verify is False: + string_parts.append('--insecure') + + if method: + string_parts.extend(['-X', method]) + + string_parts.append(url) + + if headers: + for header in six.iteritems(headers): + string_parts.append('-H "%s: %s"' % header) + if json: + data = jsonutils.dumps(json) + if data: + string_parts.append("-d '%s'" % data) + + _logger.debug(' '.join(string_parts)) + + @utils.positional() + def _http_log_response(self, response=None, json=None, + status_code=None, headers=None, text=None): + if not _logger.isEnabledFor(logging.DEBUG): + return + + if response: + if not status_code: + status_code = response.status_code + if not headers: + headers = response.headers + if not text: + text = response.text + if json: + text = jsonutils.dumps(json) + + string_parts = ['RESP:'] + + if status_code: + string_parts.append('[%s]' % status_code) + if headers: + string_parts.append('%s' % headers) + if text: + string_parts.append('\nRESP BODY: %s\n' % text) + + _logger.debug(' '.join(string_parts)) + @utils.positional(enforcement=utils.positional.WARN) def request(self, url, method, json=None, original_ip=None, user_agent=None, redirect=None, authenticated=None, endpoint_filter=None, auth=None, requests_auth=None, - raise_exc=True, allow_reauth=True, **kwargs): + raise_exc=True, allow_reauth=True, log=True, **kwargs): """Send an HTTP request with the specified characteristics. Wrapper around `requests.Session.request` to handle tasks such as @@ -183,6 +241,8 @@ class Session(object): :param bool allow_reauth: Allow fetching a new token and retrying the request on receiving a 401 Unauthorized response. (optional, default True) + :param bool log: If True then log the request and response data to the + debug log. (optional, default True) :param kwargs: any other parameter that can be passed to requests.Session.request (such as `headers`). Except: 'data' will be overwritten by the data in 'json' param. @@ -250,28 +310,10 @@ class Session(object): if requests_auth: kwargs['auth'] = requests_auth - string_parts = ['curl -i'] - - # NOTE(jamielennox): None means let requests do its default validation - # so we need to actually check that this is False. - if self.verify is False: - string_parts.append('--insecure') - - if method: - string_parts.extend(['-X', method]) - - string_parts.append(url) - - if headers: - for header in six.iteritems(headers): - string_parts.append('-H "%s: %s"' % header) - - try: - string_parts.append("-d '%s'" % kwargs['data']) - except KeyError: - pass - - _logger.debug('REQ: %s', ' '.join(string_parts)) + if log: + self._http_log_request(url, method=method, + data=kwargs.get('data'), + headers=headers) # Force disable requests redirect handling. We will manage this below. kwargs['allow_redirects'] = False @@ -279,7 +321,7 @@ class Session(object): if redirect is None: redirect = self.redirect - resp = self._send_request(url, method, redirect, **kwargs) + resp = self._send_request(url, method, redirect, log, **kwargs) # handle getting a 401 Unauthorized response by invalidating the plugin # and then retrying the request. This is only tried once. @@ -288,7 +330,8 @@ class Session(object): token = self.get_token(auth) if token: headers['X-Auth-Token'] = token - resp = self._send_request(url, method, redirect, **kwargs) + resp = self._send_request(url, method, redirect, log, + **kwargs) if raise_exc and resp.status_code >= 400: _logger.debug('Request returned failure status: %s', @@ -297,7 +340,7 @@ class Session(object): return resp - def _send_request(self, url, method, redirect, **kwargs): + def _send_request(self, url, method, redirect, log, **kwargs): # NOTE(jamielennox): We handle redirection manually because the # requests lib follows some browser patterns where it will redirect # POSTs as GETs for certain statuses which is not want we want for an @@ -315,8 +358,8 @@ class Session(object): msg = 'Unable to establish connection to %s' % url raise exceptions.ConnectionRefused(msg) - _logger.debug('RESP: [%s] %s\nRESP BODY: %s\n', - resp.status_code, resp.headers, resp.text) + if log: + self._http_log_response(response=resp) if resp.status_code in self.REDIRECT_STATUSES: # be careful here in python True == 1 and False == 0 @@ -335,7 +378,7 @@ class Session(object): _logger.warn("Failed to redirect request to %s as new " "location was not provided.", resp.url) else: - new_resp = self._send_request(location, method, redirect, + new_resp = self._send_request(location, method, redirect, log, **kwargs) if not isinstance(new_resp.history, list): |