Projet

Général

Profil

0001-misc-log-bytes-as-string-without-enclosing-b-57253.patch

Valentin Deniaud, 05 octobre 2021 17:27

Télécharger (8,65 ko)

Voir les différences:

Subject: [PATCH] misc: log bytes as string without enclosing b"" (#57253)

 passerelle/base/models.py        |  4 ++++
 passerelle/utils/__init__.py     |  4 ++--
 passerelle/utils/jsonresponse.py |  2 +-
 tests/test_proxylogger.py        | 18 ++++++++----------
 tests/test_requests.py           | 14 +++++++-------
 5 files changed, 22 insertions(+), 20 deletions(-)
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
                    extra[k] = repr(v)[2:-1]  # convert bytes to string representation without enclosing b""
975

  
972 976
            def is_json_serializable(value):
973 977
                return isinstance(value, (list, dict, bool) + six.integer_types + six.string_types)
974 978

  
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):
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
-