---
name: "Plack::Middleware::MethodOverride"
section: "3pm"
platform: "linux"
package: "libplack-middleware-methodoverride-perl"
version: "0.20-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Plack::Middleware::MethodOverride"
---

# Plack::Middleware::MethodOverride(3pm)

Override REST methods to Plack apps via POST

## Name

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

## Version

version 0.20

## 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 REST \<http://en.wikipedia.org/wiki/Representational\_State\_Transfer\>ful 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"`.

## 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 \<http://plasmasturm.org/\> for the shove in this direction, to Matt S Trout \<http://www.trout.me.uk/\> for suggesting that it be implemented as middleware, and to Hans Dieter Pearcey \<http://www.weftsoar.net/\> for convincing me not to parse body parameters.

## Authors

- •

  Tatsuhiko Miyagawa \<miyagawa@bulknews.net\>

- •

  David E. Wheeler \<david@justatheory.com\>

- •

  Aristotle Pagaltzis \<pagaltzis@gmx.de\>

## 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.
