Пример #1
0
class ChunkedLogTestCase(unittest.TestCase):

    def setUp(self):
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_does_not_error_with_binary_content_larger_than_chunk_size(self, mock_log):
        body = MAX_BODY_LENGTH * "0" + "1"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self.assert_logged(mock_log, str(request.body[:MAX_BODY_LENGTH]))
        self.assert_not_logged(mock_log, body)

    def test_request_body_logged(self, mock_log):
        body = "some body"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self.assert_logged(mock_log, "some body")

    def assert_logged(self, mock_log, expected_entry):
        calls = mock_log.log.call_args_list
        text = " ".join([call[0][1] for call in calls])
        self.assertTrue(expected_entry in text)

    def assert_not_logged(self, mock_log, unexpected_entry):
        calls = mock_log.log.call_args_list
        text = " ".join([call[0][1] for call in calls])
        self.assertTrue(unexpected_entry not in text)
Пример #2
0
class MissingRoutes(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()

        def get_response(request):
            response = mock.MagicMock()
            response.status_code = 200
            response.get.return_value = 'application/json'
            response._headers = {'test_headers': 'test_headers'}
            return response

        self.middleware = LoggingMiddleware(get_response)

    def test_no_exception_risen(self, mock_log):
        body = u"some body"
        request = self.factory.post("/a-missing-route-somewhere",
                                    data={"file": body})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, body)
Пример #3
0
 def test_request_headers_sensitive_logged(self, mock_log):
     request = self.factory.post(
         "/somewhere", **{
             'HTTP_AUTHORIZATION': 'sensitive-token',
             'HTTP_USER_AGENT': 'silly-human',
             'HTTP_PROXY_AUTHORIZATION': 'proxy-token'
         })
     middleware = LoggingMiddleware()
     middleware.process_request(request)
     self._assert_logged(mock_log, "HTTP_AUTHORIZATION")
     self._assert_logged(mock_log, "HTTP_USER_AGENT")
     self._assert_logged(mock_log, "HTTP_PROXY_AUTHORIZATION")
     self._assert_logged_with_key_value(mock_log, "HTTP_AUTHORIZATION",
                                        '*****')
     self._assert_logged_with_key_value(mock_log, "HTTP_USER_AGENT",
                                        'silly-human')
     self._assert_logged_with_key_value(mock_log,
                                        "HTTP_PROXY_AUTHORIZATION",
                                        'proxy-token')
Пример #4
0
class DecoratorTestCase(BaseLogTestCase):
    def setUp(self):
        from django.urls import set_urlconf
        set_urlconf('test_urls')
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_no_logging_decorator_class_view(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_class", data={"file": body})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, body)
        self._assert_logged(mock_log, NO_LOGGING_MSG)

    def test_no_logging_decorator_func_view(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_func", data={"file": body})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, body)
        self._assert_logged(mock_log, NO_LOGGING_MSG)

    def test_no_logging_decorator_custom_msg(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_msg", data={"file": body})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, body)
        self._assert_not_logged(mock_log, NO_LOGGING_MSG)
        self._assert_logged(mock_log, 'Custom message')
Пример #5
0
class LogTestCase(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_request_body_logged(self, mock_log):
        body = "some body"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "some body")

    def test_request_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere",
                                    **{'HTTP_USER_AGENT': 'silly-human'})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_response_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere")
        response = mock.MagicMock()
        response.get.return_value = 'application/json'
        response._headers = {'test_headers': 'test_headers'}
        self.middleware.process_response(request, response)
        self._assert_logged(mock_log, "test_headers")
Пример #6
0
class DRFTestCase(BaseLogTestCase):
    def setUp(self):
        from django.urls import set_urlconf
        set_urlconf('test_urls')
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_no_request_logging_is_honored(self, mock_log):
        uri = "/widgets"
        request = self.factory.get(uri)
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "DRF explicit annotation")

    def test_no_response_logging_is_honored(self, mock_log):
        uri = "/widgets"
        request = self.factory.get(uri)
        mock_response = HttpResponse('{"example":"response"}',
                                     content_type='application/json',
                                     status=422)
        self.middleware.process_response(request, response=mock_response)
        self._assert_not_logged(mock_log, '"example":"response"')
        self._assert_logged(mock_log, '/widgets')

    def test_non_existent_drf_route_logs(self, mock_log):
        uri = "/widgets/1234"
        request = self.factory.patch(uri, data={"almost": "had you"})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, "almost")
        self._assert_not_logged(mock_log, "had you")
Пример #7
0
class UnicodeLogTestCase(BaseLogTestCase):
    def setUp(self):
        def get_response(request):
            response = mock.MagicMock()
            response.status_code = 200
            response.get.return_value = 'application/json'
            response._headers = {'test_headers': 'test_headers'}
            return response

        self.uri = "/test_class"
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware(get_response)

    def test_logs_unicode_http_response(self, mock_log):
        request = self.factory.get(self.uri)
        response = mock.MagicMock()
        response.get.return_value = "application/json"
        response.content = str({"test_unicode_body": "El Niño"})
        response.streaming = False
        self.middleware.process_response(request, response)
        self._assert_logged(mock_log, response.content)

    def test_logs_url_with_unicode(self, mock_log):
        url = "{}/El Niño".format(self.uri)
        request = self.factory.get(url)
        self.middleware.process_request(request)
        self._assert_logged(mock_log, url)

    def test_logs_unicode_http_request_with_json_type_body(self, mock_log):
        body = "El Niño"
        request = self.factory.post("/somewhere", data={"body": body})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, body)

    def test_logs_unicode_http_request_with_url_encoded_body(self, mock_log):
        try:
            # Python 3.x
            from urllib.parse import quote, unquote
        except ImportError:
            # Python 2.7
            from urllib import quote, unquote

        body = "El Niño"
        request = self.factory.post(
            "/somewhere",
            data=quote(body, encoding='utf-8'),
            content_type="application/x-www-form-urlencoded")
        self.middleware.process_request(request)
        self._assert_logged(mock_log, unquote(body))
Пример #8
0
class MissingRoutes(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()

        def get_response(request):
            response = mock.MagicMock()
            response.status_code = 200
            response.get.return_value = "application/json"
            headers = {"test_headers": "test_headers"}
            if IS_DJANGO_VERSION_GTE_3_2_0:
                response.headers = headers
            else:
                response._headers = headers
            return response

        self.middleware = LoggingMiddleware(get_response)

    def test_no_exception_risen(self, mock_log):
        body = u"some body"
        request = self.factory.post("/a-missing-route-somewhere", data={"file": body})
        self.middleware.__call__(request)
        self._assert_logged(mock_log, body)
Пример #9
0
class LoggingContextTestCase(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_request_logging_context(self, mock_log):
        request = self.factory.post("/somewhere")
        self.middleware.process_request(request, None, request.body)
        self._asset_logged_with_additional_args_and_kwargs(
            mock_log, (), {"extra": {
                "request": request,
                "response": None
            }})

    def test_response_logging_context(self, mock_log):
        request = self.factory.post("/somewhere")
        response = mock.MagicMock()
        response.get.return_value = "application/json"
        headers = {"test_headers": "test_headers"}
        if IS_DJANGO_VERSION_GTE_3_2_0:
            response.headers = headers
        else:
            response._headers = headers
        self.middleware.process_response(request, response)
        self._asset_logged_with_additional_args_and_kwargs(
            mock_log, (),
            {"extra": {
                "request": request,
                "response": response
            }})

    def test_get_logging_context_extensibility(self, mock_log):
        request = self.factory.post("/somewhere")
        self.middleware._get_logging_context = lambda request, response: {
            "args": (1, True, "Test"),
            "kwargs": {
                "extra": {
                    "REQUEST": request,
                    "middleware": self.middleware
                },
                "exc_info": True
            },
        }

        self.middleware.process_request(request, None, request.body)
        self._asset_logged_with_additional_args_and_kwargs(
            mock_log,
            (1, True, "Test"),
            {
                "extra": {
                    "REQUEST": request,
                    "middleware": self.middleware
                },
                "exc_info": True
            },
        )
Пример #10
0
class DjangoDecoratorTestCase(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()

        def get_response(request):
            response = mock.MagicMock()
            response.status_code = 200
            response.get.return_value = 'application/json'
            return response

        self.middleware = LoggingMiddleware(get_response)

    # Because django isn't actually processing this test this test stubbed
    # out the important parts of what it does which is processes a decorator
    # like @sensitive_post_parameters('pass__word'), which gets added
    # to the request object, and then I also created the QueryDict that is
    # the underlying POST data.
    def test_log_sensitive_post_parameters(self, mock_log):
        uri = "/dont_log_sensitive_parameter"
        request = self.factory.post(uri)
        request.POST = QueryDict('pass_word=foo')
        request.sensitive_post_parameters = ["pass_word"]
        self.middleware.__call__(request)
        self._assert_not_logged(mock_log, "foo")
Пример #11
0
class LogTestCase(unittest.TestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_does_not_error_with_binary_content_larger_than_chunk_size(self, mock_log):
        body = MAX_BODY_LENGTH * "0" + "1"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, str(request.body[:MAX_BODY_LENGTH]))
        self._assert_not_logged(mock_log, body)

    def test_request_body_logged(self, mock_log):
        body = "some body"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "some body")

    def test_request_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere",
                                    **{'HTTP_USER_AGENT': 'silly-human'})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_response_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere")
        response = mock.MagicMock()
        response.get.return_value = 'application/json'
        response._headers = {'test_headers': 'test_headers'}
        self.middleware.process_response(request, response)
        self._assert_logged(mock_log, "test_headers")

    def _assert_logged(self, mock_log, expected_entry):
        calls = mock_log.log.call_args_list
        text = " ".join([call[0][1] for call in calls])
        self.assertTrue(expected_entry in text)

    def _assert_not_logged(self, mock_log, unexpected_entry):
        calls = mock_log.log.call_args_list
        text = " ".join([call[0][1] for call in calls])
        self.assertTrue(unexpected_entry not in text)
Пример #12
0
class LoggingContextTestCase(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_request_logging_context(self, mock_log):
        request = self.factory.post("/somewhere")
        self.middleware.process_request(request)
        self._asset_logged_with_additional_args_and_kwargs(
            mock_log, (), {
                'extra': {
                    'request': request,
                    'response': None,
                },
            })

    def test_response_logging_context(self, mock_log):
        request = self.factory.post("/somewhere")
        response = mock.MagicMock()
        response.get.return_value = 'application/json'
        response._headers = {'test_headers': 'test_headers'}
        self.middleware.process_response(request, response)
        self._asset_logged_with_additional_args_and_kwargs(
            mock_log, (), {
                'extra': {
                    'request': request,
                    'response': response,
                },
            })

    def test_get_logging_context_extensibility(self, mock_log):
        request = self.factory.post("/somewhere")
        self.middleware._get_logging_context = lambda request, response: {
            'args': (1, True, 'Test'),
            'kwargs': {
                'extra': {
                    'REQUEST': request,
                    'middleware': self.middleware,
                },
                'exc_info': True,
            },
        }

        self.middleware.process_request(request)
        self._asset_logged_with_additional_args_and_kwargs(
            mock_log, (1, True, 'Test'), {
                'extra': {
                    'REQUEST': request,
                    'middleware': self.middleware,
                },
                'exc_info': True,
            })
Пример #13
0
class DRFTestCase(BaseLogTestCase):
    def setUp(self):
        from django.urls import set_urlconf
        set_urlconf('test_urls')
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_no_request_logging_is_honored(self, mock_log):
        uri = "/widgets"
        request = self.factory.get(uri)
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "DRF explicit annotation")

    def test_no_response_logging_is_honored(self, mock_log):
        uri = "/widgets"
        request = self.factory.get(uri)
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, "Unannotated")

    def test_non_existent_drf_route_logs(self, mock_log):
        uri = "/widgets/1234"
        request = self.factory.post(uri, data={"test": "that amorea"})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "that amorea")
Пример #14
0
 def test_legacy_settings(self, mock_log):
     middleware = LoggingMiddleware()
     middleware.process_request(self.request, None, self.request.body)
     self.assertFalse(self._is_log_colorized(mock_log))
Пример #15
0
 def test_invalid_max_body_length(self, mock_log):
     with self.assertRaises(ValueError):
         LoggingMiddleware()
Пример #16
0
class LogTestCase(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()
        def get_response(request):
            response = mock.MagicMock()
            response.status_code = 200
            response.get.return_value = 'application/json'
            response._headers = {'test_headers': 'test_headers'}
            return response

        self.middleware = LoggingMiddleware(get_response)

    def test_request_body_logged(self, mock_log):
        body = u"some body"
        request = self.factory.post("/somewhere", data={"file": body})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, body)

    def test_request_binary_logged(self, mock_log):
        body = u"some body"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "(binary data)")

    @unittest.skipIf(sys.version_info < (3, 0), "This issue won't happen on python 2")
    def test_request_jpeg_logged(self, mock_log):
        body = b'--BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="file"; filename="campaign_carousel_img.jp' \
               b'g"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe1\x00\x18Exif\x00\x00II*\x00\x08\x00\x00\x00' \
               b'\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x11Ducky\x00\x01\x00\x04\x00\x00\x00d\x00\x00\xff\xe1' \
               b'\x03{http://ns.adobe.com/'
        datafile = io.BytesIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "(multipart/form)")

    def test_request_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere",
                                    **{'HTTP_USER_AGENT': 'silly-human'})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_response_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere")
        response = mock.MagicMock()
        response.get.return_value = 'application/json'
        response._headers = {'test_headers': 'test_headers'}
        self.middleware.process_response(request, response)
        self._assert_logged(mock_log, "test_headers")

    def test_call_logged(self, mock_log):
        body = u"some body"
        request = self.factory.post("/somewhere", data={"file": body},
                                    **{'HTTP_USER_AGENT': 'silly-human'})
        self.middleware.__call__(request)
        self._assert_logged(mock_log, body)
        self._assert_logged(mock_log, "test_headers")
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_call_binary_logged(self, mock_log):
        body = u"some body"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile},
                                    **{'HTTP_USER_AGENT': 'silly-human'})
        self.middleware.__call__(request)
        self._assert_logged(mock_log, "(binary data)")
        self._assert_logged(mock_log, "test_headers")
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    @unittest.skipIf(sys.version_info < (3, 0), "This issue won't happen on python 2")
    def test_call_jpeg_logged(self, mock_log):
        body = b'--BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="file"; filename="campaign_carousel_img.jp' \
               b'g"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe1\x00\x18Exif\x00\x00II*\x00\x08\x00\x00\x00' \
               b'\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x11Ducky\x00\x01\x00\x04\x00\x00\x00d\x00\x00\xff\xe1' \
               b'\x03{http://ns.adobe.com/'
        datafile = io.BytesIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile},
                                    **{'HTTP_USER_AGENT': 'silly-human'})
        self.middleware.__call__(request)
        self._assert_logged(mock_log, "(multipart/form)")
        self._assert_logged(mock_log, "test_headers")
        self._assert_logged(mock_log, "HTTP_USER_AGENT")
Пример #17
0
 def setUp(self):
     from django.urls import set_urlconf
     set_urlconf('test_urls')
     self.factory = RequestFactory()
     self.middleware = LoggingMiddleware()
Пример #18
0
class DecoratorTestCase(BaseLogTestCase):
    def setUp(self):
        from django.urls import set_urlconf

        set_urlconf("test_urls")
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_no_logging_decorator_class_view(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_class", data={"file": body})
        self.middleware.process_request(request, None, request.body)
        self._assert_not_logged(mock_log, body)
        self._assert_logged(mock_log, NO_LOGGING_MSG)

    def test_no_logging_decorator_func_view(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_func", data={"file": body})
        self.middleware.process_request(request, None, request.body)
        self._assert_not_logged(mock_log, body)
        self._assert_logged(mock_log, NO_LOGGING_MSG)

    def test_no_logging_decorator_custom_msg(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_msg", data={"file": body})
        self.middleware.process_request(request, None, request.body)
        self._assert_not_logged(mock_log, body)
        self._assert_not_logged(mock_log, NO_LOGGING_MSG)
        self._assert_logged(mock_log, "Custom message")

    def test_no_logging_decorator_silent(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/dont_log_silent", data={"file": body})
        self.middleware.process_request(request, None, request.body)
        self._assert_not_logged(mock_log, body)
        self._assert_not_logged(mock_log, NO_LOGGING_MSG)
        self._assert_not_logged(mock_log, "not logged because")

    def test_no_logging_empty_response_body(self, mock_log):
        body = u"our work of art"
        request = self.factory.post("/dont_log_empty_response_body",
                                    data={"file": body})
        self.middleware.process_request(request, None, request.body)
        self._assert_not_logged(mock_log, body)
        self._assert_not_logged(mock_log, NO_LOGGING_MSG)
        self._assert_logged(mock_log, "Empty response body")

    def test_no_logging_alternate_urlconf(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_route", data={"file": body})
        request.urlconf = "test_urls_alternate"
        self.middleware.process_request(request, None, request.body)
        self._assert_not_logged(mock_log, body)
        self._assert_logged(mock_log, NO_LOGGING_MSG)

    def test_still_logs_verb(self, mock_log):
        body = u"our work of art"
        request = self.factory.post("/dont_log_empty_response_body",
                                    data={"file": body})
        self.middleware.process_request(request, None, request.body)
        self._assert_logged(mock_log, "POST")

    def test_still_logs_path(self, mock_log):
        body = u"our work of art"
        uri = "/dont_log_empty_response_body"
        request = self.factory.post(uri, data={"file": body})
        self.middleware.process_request(request, None, request.body)
        self._assert_logged(mock_log, uri)
Пример #19
0
class LogTestCase(BaseLogTestCase):
    def setUp(self):
        self.factory = RequestFactory()

        def get_response(request):
            response = mock.MagicMock()
            response.status_code = 200
            response.get.return_value = "application/json"
            response._headers = {"test_headers": "test_headers"}
            return response

        self.middleware = LoggingMiddleware(get_response)

    def test_request_body_logged(self, mock_log):
        body = u"some body"
        request = self.factory.post("/somewhere", data={"file": body})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, body)

    def test_request_binary_logged(self, mock_log):
        body = u"some body"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "(binary data)")

    def test_request_jpeg_logged(self, mock_log):
        body = (
            b'--BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="file"; filename="campaign_carousel_img.jp'
            b'g"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe1\x00\x18Exif\x00\x00II*\x00\x08\x00\x00\x00'
            b"\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x11Ducky\x00\x01\x00\x04\x00\x00\x00d\x00\x00\xff\xe1"
            b"\x03{http://ns.adobe.com/")
        datafile = io.BytesIO(body)
        request = self.factory.post("/somewhere", data={"file": datafile})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "(multipart/form)")

    def test_request_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere",
                                    **{"HTTP_USER_AGENT": "silly-human"})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_request_headers_sensitive_logged_default(self, mock_log):
        request = self.factory.post(
            "/somewhere", **{
                "HTTP_AUTHORIZATION": "sensitive-token",
                "HTTP_PROXY_AUTHORIZATION": "proxy-token"
            })
        middleware = LoggingMiddleware()
        middleware.process_request(request)
        self._assert_logged(mock_log, "HTTP_AUTHORIZATION")
        self._assert_logged(mock_log, "HTTP_PROXY_AUTHORIZATION")
        self._assert_logged_with_key_value(mock_log, "HTTP_AUTHORIZATION",
                                           "*****")
        self._assert_logged_with_key_value(mock_log,
                                           "HTTP_PROXY_AUTHORIZATION", "*****")

    @override_settings(
        REQUEST_LOGGING_SENSITIVE_HEADERS=["HTTP_AUTHORIZATION"])
    def test_request_headers_sensitive_logged(self, mock_log):
        request = self.factory.post(
            "/somewhere", **{
                "HTTP_AUTHORIZATION": "sensitive-token",
                "HTTP_USER_AGENT": "silly-human",
                "HTTP_PROXY_AUTHORIZATION": "proxy-token",
            })
        middleware = LoggingMiddleware()
        middleware.process_request(request)
        self._assert_logged(mock_log, "HTTP_AUTHORIZATION")
        self._assert_logged(mock_log, "HTTP_USER_AGENT")
        self._assert_logged(mock_log, "HTTP_PROXY_AUTHORIZATION")
        self._assert_logged_with_key_value(mock_log, "HTTP_AUTHORIZATION",
                                           "*****")
        self._assert_logged_with_key_value(mock_log, "HTTP_USER_AGENT",
                                           "silly-human")
        self._assert_logged_with_key_value(mock_log,
                                           "HTTP_PROXY_AUTHORIZATION",
                                           "proxy-token")

    def test_response_headers_logged(self, mock_log):
        request = self.factory.post("/somewhere")
        response = mock.MagicMock()
        response.get.return_value = "application/json"
        response._headers = {"test_headers": "test_headers"}
        self.middleware.process_response(request, response)
        self._assert_logged(mock_log, "test_headers")

    def test_call_logged(self, mock_log):
        body = u"some body"
        request = self.factory.post("/somewhere",
                                    data={"file": body},
                                    **{"HTTP_USER_AGENT": "silly-human"})
        self.middleware.__call__(request)
        self._assert_logged(mock_log, body)
        self._assert_logged(mock_log, "test_headers")
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_call_binary_logged(self, mock_log):
        body = u"some body"
        datafile = io.StringIO(body)
        request = self.factory.post("/somewhere",
                                    data={"file": datafile},
                                    **{"HTTP_USER_AGENT": "silly-human"})
        self.middleware.__call__(request)
        self._assert_logged(mock_log, "(binary data)")
        self._assert_logged(mock_log, "test_headers")
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_call_jpeg_logged(self, mock_log):
        body = (
            b'--BoUnDaRyStRiNg\r\nContent-Disposition: form-data; name="file"; filename="campaign_carousel_img.jp'
            b'g"\r\nContent-Type: image/jpeg\r\n\r\n\xff\xd8\xff\xe1\x00\x18Exif\x00\x00II*\x00\x08\x00\x00\x00'
            b"\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x11Ducky\x00\x01\x00\x04\x00\x00\x00d\x00\x00\xff\xe1"
            b"\x03{http://ns.adobe.com/")
        datafile = io.BytesIO(body)
        request = self.factory.post("/somewhere",
                                    data={"file": datafile},
                                    **{"HTTP_USER_AGENT": "silly-human"})
        self.middleware.__call__(request)
        self._assert_logged(mock_log, "(multipart/form)")
        self._assert_logged(mock_log, "test_headers")
        self._assert_logged(mock_log, "HTTP_USER_AGENT")

    def test_minimal_logging_when_streaming(self, mock_log):
        uri = "/somewhere"
        request = self.factory.get(uri)
        response = StreamingHttpResponse(status=200,
                                         streaming_content=b"OK",
                                         content_type="application/json")
        self.middleware.process_response(request, response=response)
        self._assert_logged(mock_log, "(data_stream)")
Пример #20
0
 def test_logging_with_customized_log_level(self, mock_log):
     middleware = LoggingMiddleware()
     middleware.process_request(self.request)
     self._assert_logged_with_level(mock_log, logging.INFO)
Пример #21
0
class DecoratorTestCase(BaseLogTestCase):
    def setUp(self):
        from django.urls import set_urlconf
        set_urlconf('test_urls')
        self.factory = RequestFactory()
        self.middleware = LoggingMiddleware()

    def test_no_logging_decorator_class_view(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_class", data={"file": body})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, body)
        self._assert_logged(mock_log, NO_LOGGING_MSG)

    def test_no_logging_decorator_func_view(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_func", data={"file": body})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, body)
        self._assert_logged(mock_log, NO_LOGGING_MSG)

    def test_no_logging_decorator_custom_msg(self, mock_log):
        body = u"some super secret body"
        request = self.factory.post("/test_msg", data={"file": body})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, body)
        self._assert_not_logged(mock_log, NO_LOGGING_MSG)
        self._assert_logged(mock_log, 'Custom message')

    def test_no_logging_empty_response_body(self, mock_log):
        body = u"our work of art"
        request = self.factory.post("/dont_log_empty_response_body",
                                    data={"file": body})
        self.middleware.process_request(request)
        self._assert_not_logged(mock_log, body)
        self._assert_not_logged(mock_log, NO_LOGGING_MSG)
        self._assert_logged(mock_log, 'Empty response body')

    def test_still_logs_verb(self, mock_log):
        body = u"our work of art"
        request = self.factory.post("/dont_log_empty_response_body",
                                    data={"file": body})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, 'POST')

    def test_still_logs_path(self, mock_log):
        body = u"our work of art"
        uri = "/dont_log_empty_response_body"
        request = self.factory.post(uri, data={"file": body})
        self.middleware.process_request(request)
        self._assert_logged(mock_log, uri)
Пример #22
0
 def test_default_colorize(self, mock_log):
     middleware = LoggingMiddleware()
     middleware.process_request(self.request)
     self.assertEquals(DEFAULT_COLORIZE, self._is_log_colorized(mock_log))
Пример #23
0
 def test_log_request_200(self, mock_log):
     mock_log.reset_mock()
     middleware = LoggingMiddleware()
     middleware.process_request(self.request_200, self.response_200)
     self._assert_logged_with_level(mock_log, DEFAULT_LOG_LEVEL)
Пример #24
0
 def test_logging_default_http_4xx_error(self, mock_log):
     middleware = LoggingMiddleware()
     middleware.process_response(self.request, self.response_404)
     self.assertEqual(DEFAULT_HTTP_4XX_LOG_LEVEL, logging.ERROR)
     self._assert_logged_with_level(mock_log, DEFAULT_HTTP_4XX_LOG_LEVEL)
Пример #25
0
 def setUp(self):
     self.factory = RequestFactory()
     self.middleware = LoggingMiddleware()
Пример #26
0
 def test_logging_default_debug_level(self, mock_log):
     middleware = LoggingMiddleware()
     middleware.process_request(self.request)
     self._assert_logged_with_level(mock_log, DEFAULT_LOG_LEVEL)
Пример #27
0
 def test_legacy_settings_taking_precedence(self, mock_log):
     middleware = LoggingMiddleware()
     middleware.process_request(self.request)
     self.assertFalse(self._is_log_colorized(mock_log))
Пример #28
0
 def test_invalid_log_level(self, mock_log):
     with self.assertRaises(ValueError):
         LoggingMiddleware()
Пример #29
0
 def test_log_request_500_as_error(self, mock_log):
     mock_log.reset_mock()
     middleware = LoggingMiddleware()
     middleware.process_request(self.request_500, self.response_500)
     self._assert_logged_with_level(mock_log, logging.ERROR)
Пример #30
0
 def test_disable_colorize(self, mock_log):
     middleware = LoggingMiddleware()
     middleware.process_request(self.request)
     self.assertFalse(self._is_log_colorized(mock_log))
Пример #31
0
 def setUp(self):
     self.factory = RequestFactory()
     self.middleware = LoggingMiddleware()