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