class Rack::CookieLogger::Middleware

Logs:

Constants

LOG_PREFIX

TODO: Make these configurable

Public Class Methods

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

Public Instance Methods

call(env) click to toggle source
# File lib/rack/cookie_logger/middleware.rb, line 24
def call(env)
  @logger = env[::Rack::RACK_ERRORS]
  log_request_cookies(::Rack::Request.new(env))
  status, headers, body = @app.call(env)
  log_response_cookies(::Rack::Response.new([], status, headers))
  [status, headers, body]
end

Private Instance Methods

log(message) click to toggle source
# File lib/rack/cookie_logger/middleware.rb, line 34
def log(message)
  @logger << (LOG_PREFIX + message + "\n")
end
log_request_cookies(req) click to toggle source
# File lib/rack/cookie_logger/middleware.rb, line 38
def log_request_cookies(req)
  cookies = req.cookies
  if cookies.empty?
    log 'No request cookies'
  else
    cookies.each do |name, value|
      v = log_value(name, value)
      log('Request cookie: ' + [name, v].join('='))
    end
  end
rescue StandardError => e
  warn 'Error logging request cookies: ' + e.full_message
end
log_response_cookies(rsp) click to toggle source
# File lib/rack/cookie_logger/middleware.rb, line 52
def log_response_cookies(rsp)
  sc_header = rsp.headers[::Rack::SET_COOKIE]
  if sc_header.nil?
    log 'No response cookies'
  else
    sc_header.split("\n").each do |cookie|
      left, *attrs = cookie.split(';')
      name, value = left.split('=')
      v = log_value(name, value)
      log 'Response cookie: ' + [name, v].join('=') + ';' + attrs.join(';')
    end
  end
rescue StandardError => e
  warn 'Error logging response cookies: ' + e.full_message
end
log_value(name, value) click to toggle source
# File lib/rack/cookie_logger/middleware.rb, line 68
def log_value(name, value)
  if sensitive?(name)
    redact(value)
  else
    value
  end
end
redact(value) click to toggle source

`value` can be `nil` when clearing a cookie. Some applications set the cookie value to the empty string instead of, or in addition to, setting an expiration date in the past.

# File lib/rack/cookie_logger/middleware.rb, line 79
def redact(value)
  return if value.nil?
  value[0, 3] + '.. (redacted)'
end
sensitive?(name) click to toggle source
# File lib/rack/cookie_logger/middleware.rb, line 84
def sensitive?(name)
  SENSITIVE_COOKIE_SUFFIXES.any? { |suffix| name.end_with?(suffix) }
end