From 28ebfa8697265fdc93aa178a48a1ccbb3465e9cf Mon Sep 17 00:00:00 2001 From: kelvin Date: Sat, 6 Apr 2024 07:03:44 +0100 Subject: [PATCH 1/2] Fix filtering of dictionaries with tuple keys --- honeybadger/tests/test_utils.py | 6 ++++++ honeybadger/utils.py | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/honeybadger/tests/test_utils.py b/honeybadger/tests/test_utils.py index f2f726f..c0e9d2a 100644 --- a/honeybadger/tests/test_utils.py +++ b/honeybadger/tests/test_utils.py @@ -13,3 +13,9 @@ def test_filter_dict_with_nested_dict(): expected = {'foo': 'bar', 'bar': 'baz', 'nested': {'password': '[FILTERED]'}} filter_keys = ['password'] assert filter_dict(data, filter_keys) == expected + +def test_ignores_dict_with_tuple_key(): + data = {('foo', 'bar'): 'baz', "key": "value"} + expected = {"key": "value"} + filter_keys = ['foo'] + assert filter_dict(data, filter_keys) == expected diff --git a/honeybadger/utils.py b/honeybadger/utils.py index 4cdb667..b4821cf 100644 --- a/honeybadger/utils.py +++ b/honeybadger/utils.py @@ -1,3 +1,4 @@ +import copy import json @@ -14,11 +15,20 @@ def filter_dict(data, filter_keys): if type(data) != dict: return data + data_copy = copy.deepcopy(data) + for key, value in data.items(): + # While tuples are considered valid dictionary keys, + # they are not json serializable + # so we remove them from the dictionary + if type(key) == tuple: + data_copy.pop(key) + continue + if key in filter_keys: - data[key] = "[FILTERED]" + data_copy[key] = "[FILTERED]" if type(value) == dict: - data[key] = filter_dict(data[key], filter_keys) + data_copy[key] = filter_dict(data[key], filter_keys) - return data + return data_copy From 435d3c604a195aad106a2a3b88822fc1d23b45d1 Mon Sep 17 00:00:00 2001 From: kelvin Date: Sat, 6 Apr 2024 08:55:37 +0100 Subject: [PATCH 2/2] Iterate over data_copy --- honeybadger/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/honeybadger/utils.py b/honeybadger/utils.py index b4821cf..dae073b 100644 --- a/honeybadger/utils.py +++ b/honeybadger/utils.py @@ -17,18 +17,18 @@ def filter_dict(data, filter_keys): data_copy = copy.deepcopy(data) - for key, value in data.items(): + for key, value in data_copy.items(): # While tuples are considered valid dictionary keys, # they are not json serializable # so we remove them from the dictionary if type(key) == tuple: - data_copy.pop(key) + data.pop(key) continue if key in filter_keys: - data_copy[key] = "[FILTERED]" + data[key] = "[FILTERED]" if type(value) == dict: - data_copy[key] = filter_dict(data[key], filter_keys) + data[key] = filter_dict(data[key], filter_keys) - return data_copy + return data