class Hawkei::Plugins::Rack::Middleware

Hawkei Plugins Rack Middleware

Middleware for Rack

Public Class Methods

new(app) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 14
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 18
def call(env)
  request = ::Rack::Request.new(env)

  store_tracker(request)
  store_request_data(request, env)
  store_and_send_track_request(request)

  Hawkei::Plugins::Rails::MiddlewareData.store_data(request) if defined?(::Rails)

  status, headers, body = @app.call(env)

  write_cookie_session_tracker_id!(headers)
  send_track_response(request, status)

  [status, headers, body]
ensure
  Hawkei::Store.clear! unless env['hawkei_test']
end

Private Instance Methods

https_request?(env) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 138
def https_request?(env)
  env['HTTPS'] == 'on' ||
    env['HTTP_X_FORWARDED_SSL'] == 'on' ||
    env['HTTP_X_FORWARDED_PROTO'].to_s.split(',').first == 'https' ||
    env['rack.url_scheme'] == 'https'
end
obfuscate_headers(env) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 145
def obfuscate_headers(env)
  skip_headers = %w[HTTP_COOKIE]

  headers = env.keys.grep(/^HTTP_|^CONTENT_/).each_with_object({}) do |key, hash|
    next if skip_headers.include?(key)

    name = key.gsub(/^HTTP_/, '').split('_').map(&:capitalize).join('-')

    hash[name] = env[key]
  end

  Util.deep_obfuscate_value(
    headers,
    Hawkei.configurations.obfuscated_fields
  )
rescue StandardError => _e
  {}
end
obfuscate_uri(url) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 110
def obfuscate_uri(url)
  uri = URI.parse(url)

  params =
    Util.deep_obfuscate_value(
      ::Rack::Utils.parse_query(uri.query),
      Hawkei.configurations.obfuscated_fields,
      'HIDDEN'
    )

  return url if params.empty?

  uri.merge(
    "?#{::Rack::Utils.build_query(params)}"
  ).to_s
rescue StandardError => _e
  ''
end
obfuscation_get_params(request, type) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 129
def obfuscation_get_params(request, type)
  Util.deep_obfuscate_value(
    request.send(type),
    Hawkei.configurations.obfuscated_fields
  )
rescue StandardError => _e
  {}
end
send_track_response(request, status) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 52
def send_track_response(request, status)
  auto_id = request.cookies[Hawkei::Const::FOLLOW]
  return unless auto_id

  Hawkei.track(
    nil,
    sub_type: 'response',
    url_path: request.path,
    properties: {
      status: status,
    },
  )
end
store_and_send_track_request(request) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 39
def store_and_send_track_request(request)
  auto_id = request.cookies[Hawkei::Const::FOLLOW]
  return unless auto_id

  Hawkei::Store.set(:auto_id, auto_id)

  Hawkei.track(
    nil,
    sub_type: 'request',
    url_path: request.path,
  )
end
store_request_data(request, env) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 73
def store_request_data(request, env)
  Hawkei::Store.set(
    :request,
    url: obfuscate_uri(request.url),
    ssl: request.ssl?,
    host: request.host,
    port: request.port,
    path: request.path,
    referrer: obfuscate_uri(request.referrer),
    method: request.request_method,
    xhr: request.xhr?,
    user_agent: request.user_agent,
    ip: request.ip,
    get_params: obfuscation_get_params(request, 'GET'),
    post_params: obfuscation_get_params(request, 'POST'),
    headers: obfuscate_headers(env)
  )

  Hawkei::Store.bulk_set(
    server_software: request.env['SERVER_SOFTWARE']
  )
end
store_tracker(request) click to toggle source
# File lib/hawkei/plugins/rack/middleware.rb, line 66
def store_tracker(request)
  Hawkei::Store.set(
    :session_tracker_id,
    request.cookies[Hawkei::Const::SESSION_TRACKER_ID] || SecureRandom.uuid
  )
end