File: base.rb

package info (click to toggle)
ruby-samuel 0.3.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 172 kB
  • sloc: ruby: 735; makefile: 2
file content (75 lines) | stat: -rw-r--r-- 1,887 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
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
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
module Samuel
  module LogEntries
    class Base
      def initialize(http, request, response, time_requested, time_responded)
        @http, @request, @response = http, request, response
        @seconds = time_responded - time_requested
      end

      def log!
        Samuel.logger.add(log_level, log_message)
      end

    protected

      def log_message
        bold      = "\e[1m"
        blue      = "\e[34m"
        underline = "\e[4m"
        reset     = "\e[0m"
        "  #{bold}#{blue}#{underline}#{label} request (#{milliseconds}ms) " +
        "#{response_summary}#{reset}  #{method} #{uri}"
      end

      def milliseconds
        (@seconds * 1000).round
      end

      def uri
        "#{scheme}://#{host}#{port_if_not_default}#{path}#{'?' if query}#{filtered_query}"
      end

      def label
        return Samuel.config[:label] if Samuel.config[:label]

        default = lambda { ["", "HTTP"] }
        Samuel.config[:labels].detect(default) { |domain, label|
          host.include?(domain)
        }[1]
      end

      def response_summary
        if @response.is_a?(Exception)
          @response.class
        else
          "[#{status_code} #{status_message}]"
        end
      end

      def log_level
        error? ? Logger::WARN : Logger::INFO
      end

      def ssl?
        scheme == 'https'
      end

      def filtered_query
        return "" if query.nil?
        patterns = [Samuel.config[:filtered_params]].flatten
        patterns.map { |pattern|
          pattern_for_regex = Regexp.escape(pattern.to_s)
          [/([^&]*#{pattern_for_regex}[^&=]*)=(?:[^&]+)/, '\1=[FILTERED]']
        }.inject(query) { |filtered, filter| filtered.gsub(*filter) }
      end

      def port_if_not_default
        if (!ssl? && port == 80) || (ssl? && port == 443)
          ""
        else
          ":#{port}"
        end
      end
    end
  end
end