Skip to content
Tunnel REST methods to Plack apps via POST
Find file
Latest commit 1478889 @theory Add v0.16 to Changes.
Failed to load latest commit information.
lib/Plack/Middleware Document PATCH.
t Add PATCH method
.gitignore Add .gitignore.
Changes Add v0.16 to Changes.
README.pod Increment to v0.16.
weaver.ini Whitespace.



Plack::Middleware::MethodOverride - Override REST methods to Plack apps via POST


version 0.16

CPAN release Build Status Coverage Status


In your Plack app:

  use Plack::Builder;
  builder {
      enable MethodOverride;

PUT via a query parameter in your POST forms:

  <form method="POST" action="/foo?x-tunneled-method=PUT">
    <!-- ... -->

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'


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

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.


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';


Specifies the HTTP header name which specifies the overriding HTTP method.

Defaults to X-HTTP-Method-Override, as used by Google for its APIs.


Specifies the query parameter name to specify the overriding HTTP method.

Defaults to x-tunneled-method.


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.


  • Tatsuhiko Miyagawa <>
  • David E. Wheeler <>
  • Aristotle Pagaltzis <>

Copyright and License

This software is copyright (c) 2015 by Tatsuhiko Miyagawa, David E. Wheeler, Aristotle Pagaltzis.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

Something went wrong with that request. Please try again.