Skip to content

Commit 1f65c2d

Browse files
authored
Handle raising JSON library when encoding (#715)
1 parent 3e820f7 commit 1f65c2d

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

lib/sentry/client.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,11 @@ defmodule Sentry.Client do
323323
end
324324

325325
defp sanitize_non_jsonable_value(value, json_library) do
326-
case json_library.encode(value) do
326+
try do
327+
json_library.encode(value)
328+
catch
329+
_type, _reason -> {:changed, inspect(value)}
330+
else
327331
{:ok, _encoded} -> :unchanged
328332
{:error, _reason} -> {:changed, inspect(value)}
329333
end

test/sentry/client_test.exs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ defmodule Sentry.ClientTest do
3030
valid: "yes",
3131
self: self(),
3232
keyword: [key: "value"],
33-
nested: %{self: self()}
33+
nested: %{self: self()},
34+
bool: true,
35+
null: nil,
36+
int: 2,
37+
map: %{bool: false}
3438
},
3539
user: %{id: "valid-ID", email: {"user", "@example.com"}},
3640
tags: %{valid: "yes", tokens: MapSet.new([1])}
@@ -42,13 +46,36 @@ defmodule Sentry.ClientTest do
4246
assert rendered.extra.self == inspect(self())
4347
assert rendered.extra.keyword == [~s({:key, "value"})]
4448
assert rendered.extra.nested.self == inspect(self())
49+
assert rendered.extra.bool == true
50+
assert rendered.extra.null == nil
51+
assert rendered.extra.int == 2
52+
assert rendered.extra.map.bool == false
4553

4654
assert rendered.user.id == "valid-ID"
4755
assert rendered.user.email == ~s({"user", "@example.com"})
4856

4957
assert rendered.tags.valid == "yes"
5058
assert rendered.tags.tokens == inspect(MapSet.new([1]))
5159
end
60+
61+
test "works if the JSON library crashes" do
62+
defmodule RaisingJSONClient do
63+
def encode(:crash), do: raise("Oops")
64+
def encode(term), do: Jason.encode(term)
65+
66+
def decode(term), do: Jason.decode(term)
67+
end
68+
69+
put_test_config(json_library: RaisingJSONClient)
70+
71+
event = Event.create_event(message: "Something went wrong", extra: %{crasher: :crash})
72+
73+
assert %{} = rendered = Client.render_event(event)
74+
assert rendered.extra.crasher == ":crash"
75+
after
76+
:code.delete(RaisingJSONClient)
77+
:code.purge(RaisingJSONClient)
78+
end
5279
end
5380

5481
describe "send_event/2" do

0 commit comments

Comments
 (0)