summaryrefslogtreecommitdiff
path: root/keystoneclient/session.py
diff options
context:
space:
mode:
Diffstat (limited to 'keystoneclient/session.py')
-rw-r--r--keystoneclient/session.py101
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):