@@ -283,14 +283,12 @@ defmodule Sentry.Client do
283283 |> Event . remove_non_payload_keys ( )
284284 |> update_if_present ( :breadcrumbs , fn bcs -> Enum . map ( bcs , & Map . from_struct / 1 ) end )
285285 |> update_if_present ( :sdk , & Map . from_struct / 1 )
286- |> update_if_present ( :message , fn message ->
287- message = update_in ( message . formatted , & String . slice ( & 1 , 0 , @ max_message_length ) )
288- Map . from_struct ( message )
289- end )
286+ |> update_if_present ( :message , & sanitize_message ( & 1 , json_library ) )
290287 |> update_if_present ( :request , & ( & 1 |> Map . from_struct ( ) |> remove_nils ( ) ) )
291288 |> update_if_present ( :extra , & sanitize_non_jsonable_values ( & 1 , json_library ) )
292289 |> update_if_present ( :user , & sanitize_non_jsonable_values ( & 1 , json_library ) )
293290 |> update_if_present ( :tags , & sanitize_non_jsonable_values ( & 1 , json_library ) )
291+ |> update_if_present ( :fingerprint , & sanitize_non_jsonable_values_in_list ( & 1 , json_library ) )
294292 |> update_if_present ( :exception , fn list -> Enum . map ( list , & render_exception / 1 ) end )
295293 |> update_if_present ( :threads , fn list -> Enum . map ( list , & render_thread / 1 ) end )
296294 end
@@ -332,6 +330,23 @@ defmodule Sentry.Client do
332330 :maps . filter ( fn _key , value -> not is_nil ( value ) end , map )
333331 end
334332
333+ defp sanitize_message ( % Interfaces.Message { } = message , json_library ) do
334+ message = update_in ( message . formatted , & String . slice ( & 1 , 0 , @ max_message_length ) )
335+
336+ message
337+ |> Map . from_struct ( )
338+ |> sanitize_non_jsonable_values ( json_library )
339+ end
340+
341+ defp sanitize_non_jsonable_values_in_list ( list , json_library ) when is_list ( list ) do
342+ Enum . map ( list , fn elem ->
343+ case sanitize_non_jsonable_value ( elem , json_library ) do
344+ :unchanged -> elem
345+ { :changed , value } -> value
346+ end
347+ end )
348+ end
349+
335350 defp sanitize_non_jsonable_values ( map , json_library ) do
336351 # We update the existing map instead of building a new one from scratch
337352 # due to performance reasons. See the docs for :maps.map/2.
@@ -344,8 +359,11 @@ defmodule Sentry.Client do
344359 end
345360
346361 # For performance, skip all the keys that we know for sure are JSON encodable.
362+ # Binaries are a little nasty: something like <<1, 2, 3>> can be encoded in JSON,
363+ # but other non-printable binaries can't. That's why we skip them here and we
364+ # let them fall through to when we try to JSON-encode and inspect if that fails.
347365 defp sanitize_non_jsonable_value ( value , _json_library )
348- when is_binary ( value ) or is_number ( value ) or is_boolean ( value ) or is_nil ( value ) do
366+ when is_number ( value ) or is_boolean ( value ) or is_nil ( value ) do
349367 :unchanged
350368 end
351369
0 commit comments