class InboundRequestLoggerMiddleware

Attributes

only_state_change[RW]
path_regexp[RW]

Public Class Methods

new(app, only_state_change: true, path_regexp: /.*/) click to toggle source
# File lib/rails_api_logger/inbound_requests_logger_middleware.rb, line 4
def initialize(app, only_state_change: true, path_regexp: /.*/)
  @app = app
  self.only_state_change = only_state_change
  self.path_regexp = path_regexp
end

Public Instance Methods

call(env) click to toggle source
# File lib/rails_api_logger/inbound_requests_logger_middleware.rb, line 10
def call(env)
  request = ActionDispatch::Request.new(env)
  logging = log?(env, request)
  if logging
    @inbound_request_log = InboundRequestLog.from_request(request)
    env["inbound_request_log"] = @inbound_request_log
    request.body.rewind
  end
  status, headers, body = @app.call(env)
  if logging
    @inbound_request_log.update_columns(response_body: parsed_body(body), response_code: status, ended_at: Time.current)
  end
  [status, headers, body]
end

Private Instance Methods

log?(env, request) click to toggle source
# File lib/rails_api_logger/inbound_requests_logger_middleware.rb, line 27
def log?(env, request)
  env["REQUEST_URI"] =~ path_regexp && (!only_state_change || request_with_state_change?(request))
end
parsed_body(body) click to toggle source
# File lib/rails_api_logger/inbound_requests_logger_middleware.rb, line 31
def parsed_body(body)
  return unless body.present?

  if body.respond_to?(:body)
    JSON.parse(body.body)
  elsif body.respond_to?(:[])
    JSON.parse(body[0])
  else
    body
  end
rescue JSON::ParserError
  body
end
request_with_state_change?(request) click to toggle source
# File lib/rails_api_logger/inbound_requests_logger_middleware.rb, line 45
def request_with_state_change?(request)
  request.post? || request.put? || request.patch? || request.delete?
end