class CamelPatrol::Middleware

Public Class Methods

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

Public Instance Methods

call(env) click to toggle source
# File lib/camel_patrol/middleware.rb, line 7
def call(env)
  underscore_params(env) if json?(env["CONTENT_TYPE"])

  @app.call(env).tap do |_status, headers, response|
    camelize_response(response) if json?(headers["Content-Type"])
  end
end

Private Instance Methods

camelize_response(response) click to toggle source
# File lib/camel_patrol/middleware.rb, line 33
def camelize_response(response)
  response.each do |body|
    new_response = safe_json_parse(body) or next
    new_response.deep_transform_keys! { |key| key.camelize(:lower) }
    body.replace(new_response.to_json)
  end
end
json?(content_type) click to toggle source
# File lib/camel_patrol/middleware.rb, line 47
def json?(content_type)
  # WARNING:
  # We"re using substring matching over Regexp intentionally - Middleware is a hot path and
  # this will be checked on every request
  content_type && content_type.include?("application/json")
end
safe_json_parse(body) click to toggle source
# File lib/camel_patrol/middleware.rb, line 41
def safe_json_parse(body)
  JSON.parse(body)
rescue JSON::ParserError
  nil
end
underscore_params(env) click to toggle source
# File lib/camel_patrol/middleware.rb, line 17
def underscore_params(env)
  if ::Rails::VERSION::MAJOR < 5
    env["action_dispatch.request.request_parameters"].deep_transform_keys!(&:underscore)
    return
  end

  if !(request_body = safe_json_parse(env["rack.input"].read))
    return
  end

  request_body.deep_transform_keys!(&:underscore)
  req = StringIO.new(request_body.to_json)
  env["rack.input"] = req
  env["CONTENT_LENGTH"] = req.length
end