Module: Dontbugme::Store::JsonSafe

Defined in:
lib/dontbugme/store/json_safe.rb

Overview

Sanitizes data for JSON encoding by replacing invalid UTF-8 sequences. Trace data can contain binary from SQL binds, HTTP bodies, Redis, etc.

Constant Summary collapse

REPLACEMENT =
"\uFFFD".freeze

Class Method Summary collapse

Class Method Details

.sanitize(obj) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/dontbugme/store/json_safe.rb', line 12

def sanitize(obj)
  case obj
  when String
    sanitize_string(obj)
  when Hash
    obj.transform_values { |v| sanitize(v) }
  when Array
    obj.map { |v| sanitize(v) }
  when Symbol
    sanitize_string(obj.to_s)
  when Numeric, TrueClass, FalseClass, NilClass
    obj
  when Time
    obj.respond_to?(:iso8601) ? obj.iso8601(3) : obj.to_s
  else
    sanitize_string(obj.to_s)
  end
end

.sanitize_string(str) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/dontbugme/store/json_safe.rb', line 31

def sanitize_string(str)
  return str if str.nil?
  return str if str.encoding == Encoding::UTF_8 && str.valid_encoding?

  str.encode('UTF-8', invalid: :replace, undef: :replace, replace: REPLACEMENT)
rescue StandardError
  REPLACEMENT
end