0001-misc-log-bytes-as-string-without-enclosing-b-57253.patch
passerelle/base/models.py | ||
---|---|---|
969 | 969 |
extra.update(kwargs.get('extra', {})) |
970 | 970 |
request = extra.get('request') |
971 | 971 | |
972 |
for k, v in extra.items(): |
|
973 |
if isinstance(v, bytes): |
|
974 |
try: |
|
975 |
extra[k] = v.decode('utf-8') |
|
976 |
except UnicodeDecodeError: |
|
977 |
# convert bytes to string representation without enclosing b"" |
|
978 |
extra[k] = repr(v)[2:-1] |
|
979 | ||
972 | 980 |
def is_json_serializable(value): |
973 | 981 |
return isinstance(value, (list, dict, bool) + six.integer_types + six.string_types) |
974 | 982 |
passerelle/utils/__init__.py | ||
---|---|---|
199 | 199 |
max_size = settings.LOGGED_REQUESTS_MAX_SIZE |
200 | 200 |
if hasattr(logger, 'connector'): |
201 | 201 |
max_size = logger.connector.logging_parameters.requests_max_size or max_size |
202 |
extra['request_payload'] = repr(request.body[:max_size])
|
|
202 |
extra['request_payload'] = request.body[:max_size]
|
|
203 | 203 |
if response is not None: |
204 | 204 |
message = message + ' (=> %s)' % response.status_code |
205 | 205 |
extra['response_status'] = response.status_code |
... | ... | |
211 | 211 |
if hasattr(logger, 'connector'): |
212 | 212 |
max_size = logger.connector.logging_parameters.responses_max_size or max_size |
213 | 213 |
content = response.content[:max_size] |
214 |
extra['response_content'] = repr(content)
|
|
214 |
extra['response_content'] = content
|
|
215 | 215 |
if response.status_code // 100 == 3: |
216 | 216 |
log_function = logger.warning |
217 | 217 |
elif response.status_code // 100 >= 4: |
passerelle/utils/jsonresponse.py | ||
---|---|---|
140 | 140 |
max_size = settings.LOGGED_REQUESTS_MAX_SIZE |
141 | 141 |
if hasattr(logger, 'connector'): |
142 | 142 |
max_size = logger.connector.logging_parameters.requests_max_size or max_size |
143 |
extras.update({'body': repr(req.body[:max_size])})
|
|
143 |
extras.update({'body': req.body[:max_size]})
|
|
144 | 144 | |
145 | 145 |
if isinstance(e, ObjectDoesNotExist): |
146 | 146 |
logger.warning('object not found: %r', e, extra=extras) |
tests/test_proxylogger.py | ||
---|---|---|
318 | 318 |
if PY2: |
319 | 319 |
assert ResourceLog.objects.all()[2].extra['body'] == "'user_query_var=11111111111111111111'" |
320 | 320 |
else: |
321 |
assert ResourceLog.objects.all()[2].extra['body'] == "b'user_query_var=11111111111111111111'"
|
|
321 |
assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=11111111111111111111'
|
|
322 | 322 |
assert ( |
323 | 323 |
ResourceLog.objects.all()[2].extra['exception'] == "{'connector_error_var': '44444444444444444444'}" |
324 | 324 |
) |
... | ... | |
332 | 332 |
assert len(ResourceLog.objects.all()) == 3 |
333 | 333 | |
334 | 334 |
# - connector POST queries |
335 |
assert ( |
|
336 |
ResourceLog.objects.all()[1].extra['request_payload'] == "'connector_query_var=22222222222222222222'" |
|
337 |
) |
|
335 |
assert ResourceLog.objects.all()[1].extra['request_payload'] == "connector_query_var=22222222222222222222" |
|
338 | 336 |
assert ResourceLog.objects.all()[1].extra.get('response_headers') == {'Content-Type': 'foo/bar'} |
339 | 337 |
if PY2: |
340 | 338 |
assert ( |
341 | 339 |
ResourceLog.objects.all()[1].extra.get('response_content') |
342 |
== '\'{"service_reply_var": "33333333333333333333"}\''
|
|
340 |
== '{"service_reply_var": "33333333333333333333"}'
|
|
343 | 341 |
) |
344 | 342 |
else: |
345 | 343 |
assert ( |
346 | 344 |
ResourceLog.objects.all()[1].extra.get('response_content') |
347 |
== 'b\'{"service_reply_var": "33333333333333333333"}\''
|
|
345 |
== '{"service_reply_var": "33333333333333333333"}'
|
|
348 | 346 |
) |
349 | 347 | |
350 | 348 |
# log troncated payloads |
... | ... | |
360 | 358 |
assert ResourceLog.objects.all()[0].extra['connector_payload'] == 'user_query_var=1111111111' |
361 | 359 | |
362 | 360 |
# - connector POST queries |
363 |
assert ResourceLog.objects.all()[1].extra['request_payload'] == "'connector_query_var=22222'"
|
|
361 |
assert ResourceLog.objects.all()[1].extra['request_payload'] == 'connector_query_var=22222'
|
|
364 | 362 | |
365 | 363 |
# - connector error |
366 | 364 |
if PY2: |
367 | 365 |
assert ResourceLog.objects.all()[2].extra['body'] == "'user_query_var=1111111111'" |
368 | 366 |
else: |
369 |
assert ResourceLog.objects.all()[2].extra['body'] == "b'user_query_var=1111111111'"
|
|
367 |
assert ResourceLog.objects.all()[2].extra['body'] == 'user_query_var=1111111111'
|
|
370 | 368 | |
371 | 369 |
# log troncated service response |
372 | 370 |
parameters = connector.logging_parameters |
... | ... | |
379 | 377 | |
380 | 378 |
# - connector POST queries |
381 | 379 |
if PY2: |
382 |
assert ResourceLog.objects.all()[1].extra.get('response_content') == '\'{"service_reply_var": "33\''
|
|
380 |
assert ResourceLog.objects.all()[1].extra.get('response_content') == '{"service_reply_var": "33'
|
|
383 | 381 |
else: |
384 |
assert ResourceLog.objects.all()[1].extra.get('response_content') == 'b\'{"service_reply_var": "33\''
|
|
382 |
assert ResourceLog.objects.all()[1].extra.get('response_content') == '{"service_reply_var": "33'
|
|
385 | 383 | |
386 | 384 | |
387 | 385 |
def test_proxy_logger_email_traceback(app, db, email_handler, settings, mailoutbox, connector, monkeypatch): |
... | ... | |
395 | 393 |
monkeypatch.setattr(Feed, 'json', json) |
396 | 394 |
resp = app.get(endpoint_url, status=500) |
397 | 395 |
assert any('Traceback:' in mail.body for mail in mailoutbox) |
396 | ||
397 | ||
398 |
def test_proxy_logger_bytes(db, connector): |
|
399 |
base_logger = ProxyLogger(connector) |
|
400 |
base_logger.debug('test', extra={'payload': b'bytes'}) |
|
401 |
log = ResourceLog.objects.latest('id') |
|
402 |
assert log.extra == {'payload': 'bytes'} |
|
403 | ||
404 |
base_logger = ProxyLogger(connector) |
|
405 |
base_logger.debug('test', extra={'payload': b'\xff\xff'}) |
|
406 |
log = ResourceLog.objects.latest('id') |
|
407 |
assert log.extra == {'payload': '\\xff\\xff'} |
tests/test_requests.py | ||
---|---|---|
71 | 71 |
assert record.request_url == url |
72 | 72 |
assert record.response_status == response.status_code |
73 | 73 |
if logger.level == 10: # DEBUG |
74 |
assert record.request_payload.replace('b', '') == '\'{"name": "josh"}\''
|
|
75 |
assert record.response_content == repr(response.content)
|
|
74 |
assert record.request_payload == b'{"name": "josh"}'
|
|
75 |
assert record.response_content == response.content
|
|
76 | 76 |
assert record.response_headers |
77 | 77 |
else: |
78 | 78 |
assert not hasattr(record, 'request_payload') |
... | ... | |
103 | 103 |
assert record.request_url == url |
104 | 104 |
assert record.response_status == response.status_code |
105 | 105 |
if logger.level == 10: # DEBUG |
106 |
assert record.request_payload.replace('b', '') == '\'{"name": "josh"}\''
|
|
107 |
assert record.response_content == repr(response.content)
|
|
106 |
assert record.request_payload == b'{"name": "josh"}'
|
|
107 |
assert record.response_content == response.content
|
|
108 | 108 |
assert record.response_headers |
109 | 109 |
else: |
110 | 110 |
assert not hasattr(record, 'request_payload') |
... | ... | |
128 | 128 | |
129 | 129 |
if logger.level == 10: # DEBUG |
130 | 130 |
records = [record for record in caplog.records if record.name == 'requests'] |
131 |
assert records[0].request_payload.replace('b', '') == '\'{"name":\''
|
|
132 |
assert records[0].response_content.replace('b', '') == '\'{"foo":\''
|
|
131 |
assert records[0].request_payload == b'{"name":'
|
|
132 |
assert records[0].response_content == b'{"foo":'
|
|
133 | 133 | |
134 | 134 | |
135 | 135 |
@pytest.fixture(params=['xml', 'whatever', 'jpeg', 'pdf']) |
... | ... | |
179 | 179 | |
180 | 180 |
if 'xml' in endpoint_response.headers.get('Content-Type'): |
181 | 181 |
assert len(records) == 1 |
182 |
assert records[0].response_content == "'<tests><test>xml test</test></tests>'"
|
|
182 |
assert records[0].response_content == '<tests><test>xml test</test></tests>'
|
|
183 | 183 |
else: |
184 | 184 |
assert len(records) == 1 |
185 | 185 | |
186 |
- |