From 3a9008bacda17d32c1856a226c6c8df80e35b799 Mon Sep 17 00:00:00 2001 From: J2mF Date: Wed, 30 Aug 2023 08:25:55 +0300 Subject: [PATCH] fix(middleware): fix put issue of reading body and refactor --- kn_defaults/logging/middlewares.py | 35 +++++++++++++++++------------- runtests.py | 4 ++++ tests/test_settings.py | 6 ++--- tests/tests.py | 6 ++--- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/kn_defaults/logging/middlewares.py b/kn_defaults/logging/middlewares.py index af7e356..2ebe9b6 100644 --- a/kn_defaults/logging/middlewares.py +++ b/kn_defaults/logging/middlewares.py @@ -97,28 +97,33 @@ def get_post_parameters(self, request, method='POST'): else: sensitive_post_parameters = getattr(request, 'sensitive_post_parameters', []) if method == "PUT": - method_attr = json.loads(getattr(request, "body", b"{}")) + if hasattr(request, "data"): # if drf is used we can safely access data + method_attr = request.data + # If it's not used we can't read body twice as it will cause an exception + # so return empty json instead + # method_attr = json.loads(getattr(request, "body", b"{}")) + method_attr = {} else: method_attr = getattr(request, method, None) - + if not method_attr: return {} cleansed = method_attr.copy() - if sensitive_post_parameters: - if sensitive_post_parameters == '__ALL__': - # Cleanse all parameters. - for k in cleansed: - cleansed[k] = CLEANSED_SUBSTITUTE - return cleansed - else: - # Cleanse only the specified parameters. - for param in sensitive_post_parameters: - if param in cleansed: - cleansed[param] = CLEANSED_SUBSTITUTE - return cleansed - else: + if not sensitive_post_parameters: return cleansed + if sensitive_post_parameters == '__ALL__': + # Cleanse all parameters. + for k in cleansed: + cleansed[k] = CLEANSED_SUBSTITUTE + return cleansed + + # Cleanse only the specified parameters. + for param in sensitive_post_parameters: + if param in cleansed: + cleansed[param] = CLEANSED_SUBSTITUTE + return cleansed + def process_exception(self, request, exception): data = self.get_data(request, exception=exception) traceback_ = traceback.format_exc() diff --git a/runtests.py b/runtests.py index 83cfb48..5bacda3 100644 --- a/runtests.py +++ b/runtests.py @@ -8,6 +8,10 @@ if __name__ == "__main__": os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings' + os.environ['DJANGO_PROJECT_NAME'] = 'kn_defaults_test' + os.environ['DJANGO_PROJECT_ROOT'] = '.' + os.environ['DJANGO_LOGSTASH_HOST'] = '' + os.environ['DJANGO_LOGSTASH_PORT'] = '0' django.setup() TestRunner = get_runner(settings) test_runner = TestRunner() diff --git a/tests/test_settings.py b/tests/test_settings.py index 4fa4d15..131af16 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -1,5 +1,7 @@ import os +from kn_defaults.logging.defaults import get_base_logging + BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY = 'fake-key' @@ -50,9 +52,7 @@ 'success_func_view', 'error_func_view', ] -from kn_defaults.logging.defaults import BASE_LOGGING -BASE_LOGGING.update({}) -LOGGING = BASE_LOGGING +LOGGING = get_base_logging(logstash=False) RAVEN_CONFIG = {'dsn': ''} diff --git a/tests/tests.py b/tests/tests.py index 22a9a95..619a1e7 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -1,14 +1,14 @@ +from unittest._log import _CapturingHandler +from unittest.case import _BaseTestCaseContext + from django.test import TestCase, override_settings from django.urls import reverse import pdb import logging -from unittest.case import _AssertLogsContext, _BaseTestCaseContext, _CapturingHandler from kn_defaults.logging.defaults import KN_FORMATTER, logging_decorator, FUNCTION_LOGGER_FORMATTER -_AssertLogsContext.LOGGING_FORMAT = KN_FORMATTER - class _AssertLogsContext(_BaseTestCaseContext): """A context manager used to implement TestCase.assertLogs()."""