class Coach::RequestSerializer

Constants

RACK_UNPREFIXED_HEADERS

Rack specs dictate that CONTENT_TYPE and CONTENT_LENGTH are not prefixed with HTTP_. See rubydoc.info/github/rack/rack/master/file/SPEC

Public Class Methods

apply_header_rule(header, value) click to toggle source

Applies sanitizing rules. Expects `header` to be in 'http_header_name' form.

# File lib/coach/request_serializer.rb, line 22
def self.apply_header_rule(header, value)
  return value if header_rules[header].nil?

  header_rules[header].call(value)
end
clear_header_rules!() click to toggle source

Resets all header sanitizing

# File lib/coach/request_serializer.rb, line 29
def self.clear_header_rules!
  @header_rules = {}
end
header_rules() click to toggle source
# File lib/coach/request_serializer.rb, line 10
def self.header_rules
  @header_rules ||= {}
end
new(request) click to toggle source
# File lib/coach/request_serializer.rb, line 33
def initialize(request)
  @request = request
end
sanitize_header(header, &rule) click to toggle source

Sets global rules on how to sanitize headers. An optional block can be supplied that will determine how to transform the original header value, otherwise a default string is used.

# File lib/coach/request_serializer.rb, line 17
def self.sanitize_header(header, &rule)
  header_rules[header] = rule || ->(_value) { "[FILTERED]" }
end

Public Instance Methods

serialize() click to toggle source
# File lib/coach/request_serializer.rb, line 37
def serialize
  {
    # Identification
    request_id: @request.uuid,

    # Request details
    method: @request.method,
    path: request_path,
    format: @request.format.try(:ref),
    params: @request.filtered_parameters, # uses config.filter_parameters

    # Extra request info
    headers: filtered_headers,
    session_id: @request.remote_ip, # TODO: remove in a future release
    session_ip: @request.remote_ip,
  }
end

Private Instance Methods

filtered_headers() click to toggle source
# File lib/coach/request_serializer.rb, line 63
def filtered_headers
  header_value_pairs = @request.filtered_env.map do |key, value|
    key = if RACK_UNPREFIXED_HEADERS.include?(key)
            "http_#{key.downcase}"
          elsif key.start_with?("HTTP_")
            key.downcase
          end

    [key, self.class.apply_header_rule(key, value)] if key
  end.compact

  Hash[header_value_pairs]
end
request_path() click to toggle source
# File lib/coach/request_serializer.rb, line 57
def request_path
  @request.fullpath
rescue StandardError
  "unknown"
end