Sha256: 116eb61e65273d342a1e4ccabab2d365a45b1cc3a20759bec6d4cad116ac0d62

Contents?: true

Size: 1.94 KB

Versions: 7

Compression:

Stored size: 1.94 KB

Contents

require 'set'

module Honeybadger
  module Util
    # Internal: 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)

        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.start_with?(HTTP_HEADER_PREFIX) || CGI_WHITELIST.include?(k)
          env[k] = v
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
honeybadger-3.0.0 lib/honeybadger/util/request_hash.rb
honeybadger-3.0.0.beta6 lib/honeybadger/util/request_hash.rb
honeybadger-3.0.0.beta5 lib/honeybadger/util/request_hash.rb
honeybadger-3.0.0.beta4 lib/honeybadger/util/request_hash.rb
honeybadger-3.0.0.beta3 lib/honeybadger/util/request_hash.rb
honeybadger-3.0.0.beta2 lib/honeybadger/util/request_hash.rb
honeybadger-3.0.0.beta1 lib/honeybadger/util/request_hash.rb