Sha256: 4ef3774cc86c39fbe58d17fb650393d9bb08bef5c31f649de0dabab2f590eae1

Contents?: true

Size: 1.99 KB

Versions: 28

Compression:

Stored size: 1.99 KB

Contents

require 'set'

module Honeybadger
  module Util
    # Constructs a request hash from a Rack::Request matching the /v1/notices
    # API specification.
    module RequestHash
      HTTP_HEADER_PREFIX = 'HTTP_'.freeze

      CGI_WHITELIST = %w(
        AUTH_TYPE
        CONTENT_LENGTH
        CONTENT_TYPE
        GATEWAY_INTERFACE
        HTTPS
        REMOTE_ADDR
        REMOTE_HOST
        REMOTE_IDENT
        REMOTE_USER
        REQUEST_METHOD
        SERVER_NAME
        SERVER_PORT
        SERVER_PROTOCOL
        SERVER_SOFTWARE
      ).freeze

      def self.from_env(env)
        return {} unless defined?(::Rack::Request)
        return {} unless env

        hash, request = {}, ::Rack::Request.new(env)

        hash[:url] = extract_url(request)
        hash[:params] = extract_params(request)
        hash[:component] = hash[:params]['controller']
        hash[:action] = hash[:params]['action']
        hash[:session] = extract_session(request)
        hash[:cgi_data] = extract_cgi_data(request)

        hash
      end

      def self.extract_url(request)
        request.env['honeybadger.request.url'] || request.url
      rescue => e
        "Failed to access URL -- #{e}"
      end

      def self.extract_params(request)
        (request.env['action_dispatch.request.parameters'] || request.params).to_hash || {}
      rescue => e
        { error: "Failed to access params -- #{e}" }
      end

      def self.extract_session(request)
        request.session.to_hash
      rescue => e
        # Rails raises ArgumentError when `config.secret_token` is missing, and
        # ActionDispatch::Session::SessionRestoreError when the session can't be
        # restored.
        { error: "Failed to access session data -- #{e}" }
      end

      def self.extract_cgi_data(request)
        request.env.each_with_object({}) do |(k,v), env|
          next unless k.is_a?(String)
          next unless k.start_with?(HTTP_HEADER_PREFIX) || CGI_WHITELIST.include?(k)
          env[k] = v
        end
      end
    end
  end
end

Version data entries

28 entries across 28 versions & 1 rubygems

Version Path
honeybadger-4.12.1 lib/honeybadger/util/request_hash.rb
honeybadger-4.12.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.11.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.10.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.9.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.8.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.7.3 lib/honeybadger/util/request_hash.rb
honeybadger-4.7.2 lib/honeybadger/util/request_hash.rb
honeybadger-4.7.1 lib/honeybadger/util/request_hash.rb
honeybadger-4.7.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.6.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.5.6 lib/honeybadger/util/request_hash.rb
honeybadger-4.5.5 lib/honeybadger/util/request_hash.rb
honeybadger-4.5.4 lib/honeybadger/util/request_hash.rb
honeybadger-4.5.3 lib/honeybadger/util/request_hash.rb
honeybadger-4.5.2 lib/honeybadger/util/request_hash.rb
honeybadger-4.5.1 lib/honeybadger/util/request_hash.rb
honeybadger-4.5.0 lib/honeybadger/util/request_hash.rb
honeybadger-4.4.2 lib/honeybadger/util/request_hash.rb
honeybadger-4.4.1 lib/honeybadger/util/request_hash.rb