tokumei v0.4.2 Tokumei.MethodOverride
Allows browser submitted forms to use HTTP verbs other than POST
.
Only the POST
method can be overridden,
It can be overridden to use any of these HTTP verbs.
PUT
PATCH
DELETE
Override target is read from query parameters
Examples
# override POST to PUT from query value
iex> post({"/", %{"_method" => "PUT"}})
...> |> override_method()
...> |> Map.get(:method)
:PUT
# override POST to PATCH from query value
iex> post({"/", %{"_method" => "PATCH"}})
...> |> override_method()
...> |> Map.get(:method)
:PATCH
# override POST to DELETE from query value
iex> post({"/", %{"_method" => "DELETE"}})
...> |> override_method()
...> |> Map.get(:method)
:DELETE
# overridding method removes the _method field from the query
iex> post({"/", %{"_method" => "PUT"}})
...> |> override_method()
...> |> Map.get(:query)
%{}
# override works with lowercase query value
iex> post({"/", %{"_method" => "delete"}})
...> |> override_method()
...> |> Map.get(:method)
:DELETE
# # at the moment breaks deleberatly due to unknown method
# # does not allow unknown methods
# iex> post({"/", %{"_method" => "PARTY"}})
# ...> |> override_method()
# ...> |> Map.get(:method)
# :POST
# leaves non-POST requests unmodified, e.g. GET
iex> get({"/", %{"_method" => "DELETE"}})
...> |> override_method()
...> |> Map.get(:method)
:GET
# leaves non-POST requests unmodified, e.g. PUT
# Not entirely sure of the logic here.
iex> put({"/", %{"_method" => "DELETE"}})
...> |> override_method()
...> |> Map.get(:method)
:PUT
# queries with out a _method field are a no-op
iex> post({"/", %{"other" => "PUT"}})
...> |> override_method()
...> |> Map.get(:method)
:POST
Extensions
- Should the field be customisable?
_method
as default.* - Should it ever error for bad requests.*