Sha256: 1fbeed451b79e63279268bb16d8f10684521020b7b518cd297e002077fff1515

Contents?: true

Size: 1.29 KB

Versions: 5

Compression:

Stored size: 1.29 KB

Contents

class Rack::App::FrontEnd::Middlewares::MethodOverride

  ALLOWED_METHODS = %w[GET POST].freeze
  METHOD_OVERRIDE_PARAM_KEY = "_method".freeze
  HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE".freeze

  def initialize(app)
    @app = app
  end

  def call(env)
    if affected_request?(env)
      try_override(env)
    end

    @app.call(env)
  end

  protected

  def try_override(env)
    method = method_override(env)
    if valid_https_method?(method)
      set_request_method(method, env)
    end
  end

  def set_request_method(method, env)
    env[Rack::App::Constants::ENV::METHODOVERRIDE_ORIGINAL_METHOD] = env[Rack::REQUEST_METHOD]
    env[Rack::REQUEST_METHOD] = method
  end

  def valid_https_method?(method)
    Rack::App::Constants::HTTP::METHODS.include?(method)
  end

  def affected_request?(env)
    ALLOWED_METHODS.include?(env[Rack::REQUEST_METHOD])
  end

  def method_override(env)
    req = Rack::Request.new(env)
    method = env[HTTP_METHOD_OVERRIDE_HEADER] ||
              method_override_param(req,:POST) ||
                method_override_param(req,:GET)

    method.to_s.upcase
  end

  def method_override_param(req, http_method)
    req.__send__(http_method)[METHOD_OVERRIDE_PARAM_KEY]
  rescue Rack::Utils::InvalidParameterError, Rack::Utils::ParameterTypeError
  end

end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
rack-app-front_end-0.22.2 lib/rack/app/front_end/middlewares/method_override.rb
rack-app-front_end-0.22.1 lib/rack/app/front_end/middlewares/method_override.rb
rack-app-front_end-0.22.0 lib/rack/app/front_end/middlewares/method_override.rb
rack-app-front_end-0.21.0 lib/rack/app/front_end/middlewares/method_override.rb
rack-app-front_end-0.20.0 lib/rack/app/front_end/middlewares/method_override.rb