diff options
| author | Jenkins <jenkins@review.openstack.org> | 2017-01-05 22:27:39 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2017-01-05 22:27:39 +0000 |
| commit | 3ce49412da1dd4d7fa32d0964f2ec63edddd30a0 (patch) | |
| tree | 4375738d0160a57a4b7b4cf8bb6a767ce90a4862 /keystoneclient/session.py | |
| parent | 004450040c38a0df05469b844ba30854b67aabd5 (diff) | |
| parent | 3e56e0d7e5e1a76d806a3bc1f6d5ef9070f95771 (diff) | |
| download | python-keystoneclient-3ce49412da1dd4d7fa32d0964f2ec63edddd30a0.tar.gz | |
Merge "Prevent MemoryError when logging response bodies"
Diffstat (limited to 'keystoneclient/session.py')
| -rw-r--r-- | keystoneclient/session.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/keystoneclient/session.py b/keystoneclient/session.py index 41bb124..1e70a53 100644 --- a/keystoneclient/session.py +++ b/keystoneclient/session.py @@ -37,6 +37,8 @@ osprofiler_web = importutils.try_import("osprofiler.web") USER_AGENT = 'python-keystoneclient' +_LOG_CONTENT_TYPES = set(['application/json', 'application/text']) + _logger = logging.getLogger(__name__) @@ -216,7 +218,18 @@ class Session(object): if not logger.isEnabledFor(logging.DEBUG): return - text = _remove_service_catalog(response.text) + # NOTE(samueldmq): If the response does not provide enough info about + # the content type to decide whether it is useful and safe to log it + # or not, just do not log the body. Trying to# read the response body + # anyways may result on reading a long stream of bytes and getting an + # unexpected MemoryError. See bug 1616105 for further details. + content_type = response.headers.get('content-type', None) + if content_type in _LOG_CONTENT_TYPES: + text = _remove_service_catalog(response.text) + else: + text = ('Omitted, Content-Type is set to %s. Only ' + 'application/json and application/text responses ' + 'have their bodies logged.') % content_type string_parts = [ 'RESP:', @@ -224,9 +237,7 @@ class Session(object): ] for header in six.iteritems(response.headers): string_parts.append('%s: %s' % self._process_header(header)) - if text: - string_parts.append('\nRESP BODY: %s\n' % - strutils.mask_password(text)) + string_parts.append('\nRESP BODY: %s\n' % strutils.mask_password(text)) logger.debug(' '.join(string_parts)) |
