Add Kemal::OverrideMethodHandler
This commit is contained in:
parent
b389022b35
commit
3f7c8b4577
2 changed files with 53 additions and 0 deletions
29
spec/override_method_handler_spec.cr
Normal file
29
spec/override_method_handler_spec.cr
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
require "./spec_helper"
|
||||||
|
|
||||||
|
describe "Kemal::OverrideMethodHandler" do
|
||||||
|
it "does not override method without _method for POST requests" do
|
||||||
|
request = HTTP::Request.new(
|
||||||
|
"POST",
|
||||||
|
"/",
|
||||||
|
body: "_not_method=PATCH",
|
||||||
|
headers: HTTP::Headers{"Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8"}
|
||||||
|
)
|
||||||
|
|
||||||
|
context = create_request_and_return_io_and_context(Kemal::OverrideMethodHandler::INSTANCE, request)[1]
|
||||||
|
|
||||||
|
context.request.method.should eq "POST"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "overrides method with _method for POST requests" do
|
||||||
|
request = HTTP::Request.new(
|
||||||
|
"POST",
|
||||||
|
"/",
|
||||||
|
body: "_method=PATCH",
|
||||||
|
headers: HTTP::Headers{"Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8"}
|
||||||
|
)
|
||||||
|
|
||||||
|
context = create_request_and_return_io_and_context(Kemal::OverrideMethodHandler::INSTANCE, request)[1]
|
||||||
|
|
||||||
|
context.request.method.should eq "PATCH"
|
||||||
|
end
|
||||||
|
end
|
24
src/kemal/override_method_handler.cr
Normal file
24
src/kemal/override_method_handler.cr
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
module Kemal
|
||||||
|
class OverrideMethodHandler
|
||||||
|
include HTTP::Handler
|
||||||
|
INSTANCE = new
|
||||||
|
|
||||||
|
ALLOWED_METHODS = ["PUT", "PATCH", "DELETE"]
|
||||||
|
OVERRIDE_METHOD = "POST"
|
||||||
|
OVERRIDE_METHOD_PARAM_KEY = "_method"
|
||||||
|
|
||||||
|
def call(context)
|
||||||
|
request = context.request
|
||||||
|
if request.method == OVERRIDE_METHOD
|
||||||
|
if context.params.body.has_key?(OVERRIDE_METHOD_PARAM_KEY) && override_method_valid?(context.params.body["_method"])
|
||||||
|
request.method = context.params.body["_method"].upcase
|
||||||
|
end
|
||||||
|
end
|
||||||
|
call_next(context)
|
||||||
|
end
|
||||||
|
|
||||||
|
def override_method_valid?(override_method : String)
|
||||||
|
ALLOWED_METHODS.includes?(override_method.upcase)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue