mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
44 lines
1.0 KiB
Ruby
44 lines
1.0 KiB
Ruby
module Rack
|
|
class MethodOverride
|
|
HTTP_METHODS = %w(GET HEAD PUT POST DELETE OPTIONS PATCH LINK UNLINK)
|
|
|
|
METHOD_OVERRIDE_PARAM_KEY = "_method".freeze
|
|
HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE".freeze
|
|
ALLOWED_METHODS = ["POST"]
|
|
|
|
def initialize(app)
|
|
@app = app
|
|
end
|
|
|
|
def call(env)
|
|
if allowed_methods.include?(env[REQUEST_METHOD])
|
|
method = method_override(env)
|
|
if HTTP_METHODS.include?(method)
|
|
env["rack.methodoverride.original_method"] = env[REQUEST_METHOD]
|
|
env[REQUEST_METHOD] = method
|
|
end
|
|
end
|
|
|
|
@app.call(env)
|
|
end
|
|
|
|
def method_override(env)
|
|
req = Request.new(env)
|
|
method = method_override_param(req) ||
|
|
env[HTTP_METHOD_OVERRIDE_HEADER]
|
|
method.to_s.upcase
|
|
end
|
|
|
|
private
|
|
|
|
def allowed_methods
|
|
ALLOWED_METHODS
|
|
end
|
|
|
|
def method_override_param(req)
|
|
req.POST[METHOD_OVERRIDE_PARAM_KEY]
|
|
rescue Utils::InvalidParameterError, Utils::ParameterTypeError
|
|
end
|
|
end
|
|
end
|