lib/raven/integrations/rack.rb in sentry-raven-3.1.0 vs lib/raven/integrations/rack.rb in sentry-raven-3.1.1

- old
+ new

@@ -65,10 +65,12 @@ BreadcrumbBuffer.clear! end end module RackInterface + REQUEST_ID_HEADERS = %w(action_dispatch.request_id HTTP_X_REQUEST_ID).freeze + def from_rack(env_hash) req = ::Rack::Request.new(env_hash) self.url = req.scheme && req.url.split('?').first self.method = req.request_method @@ -80,10 +82,19 @@ self.env = format_env_for_sentry(env_hash) end private + # Request ID based on ActionDispatch::RequestId + def read_request_id_from(env_hash) + REQUEST_ID_HEADERS.each do |key| + request_id = env_hash[key] + return request_id if request_id + end + nil + end + # See Sentry server default limits at # https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py def read_data_from(request) if request.form_data? request.POST @@ -99,20 +110,20 @@ def format_headers_for_sentry(env_hash) env_hash.each_with_object({}) do |(key, value), memo| begin key = key.to_s # rack env can contain symbols value = value.to_s + next memo['X-Request-Id'] ||= read_request_id_from(env_hash) if REQUEST_ID_HEADERS.include?(key) 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_hash['SERVER_PROTOCOL'] next if key == 'HTTP_COOKIE' # Cookies don't go here, they go somewhere else - next unless key.start_with?('HTTP_') || %w(CONTENT_TYPE CONTENT_LENGTH).include?(key) # Rack stores headers as HTTP_WHAT_EVER, we need What-Ever key = key.sub(/^HTTP_/, "") key = key.split('_').map(&:capitalize).join('-') @@ -126,11 +137,13 @@ end end end def format_env_for_sentry(env_hash) + return env_hash if Raven.configuration.rack_env_whitelist.empty? + env_hash.select do |k, _v| - %w(REMOTE_ADDR SERVER_NAME SERVER_PORT).include? k.to_s + Raven.configuration.rack_env_whitelist.include? k.to_s end end end class HttpInterface