Skip to content

Commit

Permalink
Do not serialize mappings with custom __repr__ as dict-s
Browse files Browse the repository at this point in the history
Fixes #1296
  • Loading branch information
vmarkovtsev committed Jan 25, 2022
1 parent 6d89f4f commit e1791a9
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 5 deletions.
5 changes: 4 additions & 1 deletion sentry_sdk/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,10 @@ def _serialize_node_impl(
else safe_repr(obj)
)

elif isinstance(obj, Mapping):
elif isinstance(obj, Mapping) and type(obj).__repr__ in (
object.__repr__,
dict.__repr__,
):
# Create temporary copy here to avoid calling too much code that
# might mutate our dictionary while we're still iterating over it.
obj = dict(iteritems(obj))
Expand Down
15 changes: 11 additions & 4 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,8 @@ def test_chained_exceptions(sentry_init, capture_events):


@pytest.mark.tests_internal_exceptions
def test_broken_mapping(sentry_init, capture_events):
@pytest.mark.parametrize("with_custom_repr", [False, True])
def test_broken_mapping(sentry_init, capture_events, with_custom_repr):
sentry_init()
events = capture_events()

Expand All @@ -660,8 +661,10 @@ def broken(self, *args, **kwargs):
__iter__ = broken
__len__ = broken

def __repr__(self):
return "broken"
if with_custom_repr:

def __repr__(self):
return "still works"

try:
a = C() # noqa
Expand All @@ -670,9 +673,13 @@ def __repr__(self):
capture_exception()

(event,) = events
if with_custom_repr:
valid_repr = "still works"
else:
valid_repr = "<failed to serialize, use init(debug=True) to see error logs>"
assert (
event["exception"]["values"][0]["stacktrace"]["frames"][0]["vars"]["a"]
== "<failed to serialize, use init(debug=True) to see error logs>"
== valid_repr
)


Expand Down
9 changes: 9 additions & 0 deletions tests/test_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,12 @@ def test_bytes_serialization_repr(message_normalizer):
def test_serialize_sets(extra_normalizer):
result = extra_normalizer({1, 2, 3})
assert result == [1, 2, 3]


def test_serialize_custom_mapping(extra_normalizer):
class CustomReprDict(dict):
def __repr__(self):
return "custom!"

result = extra_normalizer(CustomReprDict(one=1, two=2))
assert result == "custom!"

0 comments on commit e1791a9

Please sign in to comment.