Class: Exceptional::ExceptionData

Inherits:
Object
  • Object
show all
Defined in:
lib/exceptional/exception_data.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(exception, controller = nil, request = nil) ⇒ ExceptionData

Returns a new instance of ExceptionData.



5
6
7
8
9
# File 'lib/exceptional/exception_data.rb', line 5

def initialize(exception, controller=nil, request=nil)
  @exception = exception
  @request = request
  @controller = controller
end

Class Method Details

.sanitize_hash(hash) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/exceptional/exception_data.rb', line 67

def self.sanitize_hash(hash)
  case hash
    when Hash
      hash.inject({}) do |result, (key, value)|
        result.update(key => sanitize_hash(value))
      end
    when Fixnum, Array, String, Bignum
      hash
    else
      hash.to_s
  end
rescue
  {}
end

.sanitize_session(request) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/exceptional/exception_data.rb', line 82

def self.sanitize_session(request)
  session = request.session
  session_hash = {}
  session_hash['session_id'] = request.session_options ? request.session_options[:id] : nil
  session_hash['session_id'] ||= session.respond_to?(:session_id) ? session.session_id : session.instance_variable_get("@session_id")
  session_hash['data'] = session.respond_to?(:to_hash) ? session.to_hash : session.instance_variable_get("@data") || {}
  session_hash['session_id'] ||= session_hash['data'][:session_id]
  session_hash['data'].delete(:session_id)
  ExceptionData.sanitize_hash(session_hash)
rescue
  {}
end

Instance Method Details

#extract_http_headers(env) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
# File 'lib/exceptional/exception_data.rb', line 55

def extract_http_headers(env)
  headers = {}
  env.select{|k, v| k =~ /^HTTP_/}.each do |name, value|
    proper_name = name.sub(/^HTTP_/, '').split('_').map{|upper_case| upper_case.capitalize}.join('-')
    headers[proper_name] = value
  end
  unless headers['Cookie'].nil?
    headers['Cookie'] = headers['Cookie'].sub(/_session=\S+/, '_session=[FILTERED]')
  end
  headers
end

#filter_paramaters(hash) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/exceptional/exception_data.rb', line 47

def filter_paramaters(hash)
  if @controller.respond_to?(:filter_parameters)
    @controller.send(:filter_parameters, hash)
  else
    hash
  end
end

#to_hashObject



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/exceptional/exception_data.rb', line 11

def to_hash
  hash = ::Exceptional::ApplicationEnvironment.to_hash
  hash.merge!({
    'exception' => {
      'exception_class' => @exception.class.to_s,
      'message' => @exception.message,
      'backtrace' => @exception.backtrace,
      'occurred_at' => Time.now.strftime("%Y%m%d %H:%M:%S %Z")
    }
  })
  unless @request.nil?
    hash.merge!({
      'request' => {
        'url' => "#{@request.protocol}#{@request.host}#{@request.request_uri}",
        'controller' => @controller.class.to_s,
        'action' => @request.parameters['action'],
        'parameters' => filter_paramaters(@request.parameters),
        'request_method' => @request.request_method.to_s,
        'remote_ip' => @request.remote_ip,
        'headers' => extract_http_headers(@request.env),
        'session' => Exceptional::ExceptionData.sanitize_session(@request)
      }
    })
  end
  hash
end

#to_jsonObject



38
39
40
# File 'lib/exceptional/exception_data.rb', line 38

def to_json
  to_hash.to_json
end

#uniqueness_hashObject



42
43
44
45
# File 'lib/exceptional/exception_data.rb', line 42

def uniqueness_hash
  return nil if @exception.backtrace.blank?
  Digest::MD5.hexdigest(@exception.backtrace.join)
end