Class: MongoRequestLogger::Rack

Inherits:
Object
  • Object
show all
Defined in:
lib/mongo_request_logger/rack.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Rack

Returns a new instance of Rack.



18
19
20
21
# File 'lib/mongo_request_logger/rack.rb', line 18

def initialize(app, options = {})
  @app = app
  @options = options
end

Class Method Details

.ignore_prefix(prefix) ⇒ Object



11
12
13
14
# File 'lib/mongo_request_logger/rack.rb', line 11

def self.ignore_prefix prefix
  self.ignore_prefixes ||= []
  self.ignore_prefixes << prefix
end

Instance Method Details

#call(env) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/mongo_request_logger/rack.rb', line 27

def call(env)
  if logger
    env['rack.logger'] = logger
  end

  if logger && logger.is_a?(MongoRequestLogger::Logger)

    #HACK: Don't log the log viewer itself
    self.class.ignore_prefixes.each do |prefix|
      if env["PATH_INFO"].to_s.start_with? prefix
        return @app.call(env)
      end
    end
    # TODO: filter parameters
    # KLUDGE: this will cause parameter parsing to happen twice: once here, once later on in Rails.
    # Or maybe it's automatically cached in env?
    logger.log_request do
      begin
        request = ::Rack::Request.new(env)
        begin
          cl = request.content_length.to_i
        rescue
          cl = 0
        end

        options = {
            path: request.path_info,
            host: request.host_with_port,
            user_agent: request.user_agent,
            ip: request.ip,
            referer: request.referrer,
            query_string: request.query_string,
            request_method: request.request_method,
            content_type: request.content_type,
            content_length: cl,
            params: filter(request.params)
        }
        logger. options
        logger. :tags, "rack"
        status, headers, body = @app.call(env)
        logger. response: status.to_i
        [status, headers, body]
      rescue Exception => e
        logger. response: 500
        raise
      end
    end
  else
    # No logger configured - just pass the request straight through
    @app.call(env)
  end

end

#filter(params) ⇒ Object



81
82
83
84
85
86
87
88
89
# File 'lib/mongo_request_logger/rack.rb', line 81

def filter(params)
  filtered = params.dup
  filtered.each do |key, value|
    if (key =~ /password/) && value.is_a?(String)
      filtered[key] = '*filtered*'
    end
  end
  filtered
end

#loggerObject



23
24
25
# File 'lib/mongo_request_logger/rack.rb', line 23

def logger
  self.class.logger
end