NAME
Plack::Middleware::MethodOverride - Override REST methods to Plack apps via POST
SYNOPSIS
In your Plack app:
use Plack::Builder;
builder {
enable MethodOverride;
$app;
};
PUT via a query parameter in your POST forms:
<form method="POST" action="/foo?x-tunneled-method=PUT">
<!-- ... -->
</form>
Or override it via the X-HTTP-Method-Override
header in a request:
my $req = HTTP::Request->new(POST => '/foo', [
'X-HTTP-Method-Override' => 'PUT'
]);
DESCRIPTION
Writing RESTful apps is a good thing, but if you're also trying to support web browsers, it would be nice not to be reduced to GET
and POST
for everything.
This middleware allows for POST
requests that pretend to be something else: by adding either a header named X-HTTP-Method-Override
to the request, or a query parameter named x-tunneled-method
to the URI, the client can say what method it actually meant. That is, as long as it meant one of these:
GET
POST
HEAD
PUT
DELETE
OPTIONS
TRACE
CONNECT
PATCH
If so, then the REQUEST_METHOD
in the PSGI environment will be replaced with the client's desired value. The original request method is always stored under the plack.original_request_method
key.
Configuration
These are the named arguments you can pass to new
. Or, more likely, on the enable
line in your builder
block, as in
enable 'MethodOverride', header => 'X-HTTP-Method', param => 'my_method';
header
Specifies the HTTP header name which specifies the overriding HTTP method.
Defaults to X-HTTP-Method-Override
, as used by Google for its APIs.
param
Specifies the query parameter name to specify the overriding HTTP method.
Defaults to x-tunneled-method
.
AUTHOR
Tatsuhiko Miyagawa
David E. Wheeler
Aristotle Pagaltzis
COPYRIGHT
2015- Tatsuhiko Miyagawa, David E. Wheeler, Aristotle Pagaltzis
LICENSE
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Acknowledgements
This module gleefully steals from Catalyst::TraitFor::Request::REST::ForBrowsers by Dave Rolsky and the original version by Tatsuhiko Miyagawa (which in turn stole from HTTP::Engine::Middleware::MethodOverride). Thanks to Aristotle Pagaltzis for the shove in this direction, to Matt S Trout for suggesting that it be implemented as middleware, and to Hans Dieter Pearcey for convincing me not to parse body parameters.