Sha256: 11471d21b8de5c5490783c2818e06aee29471c87df220313f06aab34fe9ed641

Contents?: true

Size: 1.41 KB

Versions: 2

Compression:

Stored size: 1.41 KB

Contents

class Bullhorn
  module Sender
    extend self

    def serialize(str)
      Base64.encode64(str.to_json).strip
    end

    def notify(exception, env)
      Net::HTTP.post_form(URI(url), {
        :api_key      => api_key,
        :message      => exception.message,
        :backtrace    => serialize(exception.backtrace),
        :env          => serialize(whitelist(env)),
        :request_body => serialize(whitelist(request_body(env))),
        :sha1         => sha1(exception)
      })
    end

  protected
    def request_body(env)
      if io = env['rack.input']
        io.rewind if io.respond_to?(:rewind)
        io.read
      end
    # TODO : only rescue the expected exceptions
    rescue
      ""
    end

    def whitelist(str_or_hash)
      case str_or_hash
      when Hash
        str_or_hash.dup.tap do |h|
          h.keys.each do |key|
            if h[key].respond_to?(:gsub)
              h[key] = sanitize(h[key])
            else
              h[key] = h[key].inspect
            end
          end
        end

      when String
        sanitize(str_or_hash)
      end
    end

    def sanitize(str)
      str.dup.tap do |ret|
        @filters.each do |filter|
          ret.gsub!(Regexp.new(FILTERING % filter)) { |m|
            m.gsub($1, '[FILTERED]')
          }
        end
      end
    end

    def sha1(exception)
      Digest::SHA1.hexdigest(exception.message + exception.backtrace.inspect)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
bullhorn-0.0.6 lib/bullhorn/sender.rb
bullhorn-0.0.4 lib/bullhorn/sender.rb