module Raven::RackInterface

Public Instance Methods

from_rack(env_hash) click to toggle source
# File lib/raven/integrations/rack.rb, line 70
def from_rack(env_hash)
  req = ::Rack::Request.new(env_hash)

  self.url = req.scheme && req.url.split('?').first
  self.method = req.request_method
  self.query_string = req.query_string
  self.data = read_data_from(req)

  self.headers = format_headers_for_sentry(env_hash)
  self.env = format_env_for_sentry(env_hash)
end

Private Instance Methods

format_env_for_sentry(env_hash) click to toggle source
# File lib/raven/integrations/rack.rb, line 115
def format_env_for_sentry(env_hash)
  trimmed_hash = env_hash.select do |k, _v|
    %w(REMOTE_ADDR SERVER_NAME SERVER_PORT).include? k.to_s
  end
  Hash[trimmed_hash] # select returns an Array in Ruby 1.8
end
format_headers_for_sentry(env_hash) click to toggle source
# File lib/raven/integrations/rack.rb, line 94
def format_headers_for_sentry(env_hash)
  env_hash.each_with_object({}) do |(key, value), memo|
    key = key.to_s # rack env can contain symbols
    value = value.to_s
    next unless key.upcase == key # Non-upper case stuff isn't either
    # Rack adds in an incorrect HTTP_VERSION key, which causes downstream
    # to think this is a Version header. Instead, this is mapped to
    # env['SERVER_PROTOCOL']. But we don't want to ignore a valid header
    # if the request has legitimately sent a Version header themselves.
    # See: https://github.com/rack/rack/blob/028438f/lib/rack/handler/cgi.rb#L29
    next if key == 'HTTP_VERSION' && value == ENV['SERVER_PROTOCOL']
    if key.start_with?('HTTP_')
      # Header
      http_key = key[5..key.length - 1].split('_').map(&:capitalize).join('-')
      memo[http_key] = value
    elsif %w(CONTENT_TYPE CONTENT_LENGTH).include? key
      memo[key.capitalize] = value
    end
  end
end
read_data_from(request) click to toggle source
# File lib/raven/integrations/rack.rb, line 84
def read_data_from(request)
  if request.form_data?
    request.POST
  elsif request.body
    data = request.body.read
    request.body.rewind
    data
  end
end