class SnakyCamel::Middleware

Public Class Methods

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

Public Instance Methods

call(env) click to toggle source
# File lib/snaky_camel/middleware.rb, line 9
def call(env)
  # Transforming request
  request = Rack::Request.new(env)

  request.GET.deep_transform_keys!{ |k| k.is_a?(String) ? k.underscore : k }
  request.POST.deep_transform_keys!{ |k| k.is_a?(String) ? k.underscore : k }

  # Transforming response
  @app.call(env).tap do |status, headers, response|
    if headers['Content-Type'] =~ /application\/json/
      response.each do |res|
        begin
          new_response = JSON.parse(res)
        rescue JSON::ParserError => e
          message = e.to_s.gsub(/^\d+:\s/, '') # trim numeric code at the beginning of string
          raise Exception::BadResponseFormat.new(message)
        end
        if new_response.is_a?(Array)
          new_response.map!{ |h| h.deep_transform_keys! { |k| k.camelize(:lower) } }
        else
          new_response.deep_transform_keys! { |k| k.camelize(:lower) }
        end
        res.replace(new_response.to_json)
      end
    end
  end
end