NAME
PAGI::Middleware::MethodOverride - Override HTTP method from request data
SYNOPSIS
use PAGI::Middleware::Builder;
my $app = builder {
enable 'MethodOverride',
param => '_method',
allowed_methods => [qw(PUT PATCH DELETE)];
$my_app;
};
DESCRIPTION
PAGI::Middleware::MethodOverride allows overriding the HTTP method using a form field, query parameter, or header. This enables HTML forms (which only support GET and POST) to submit PUT, PATCH, and DELETE requests.
CONFIGURATION
param (default: '_method')
Form field or query parameter name for method override.
header (default: 'X-HTTP-Method-Override')
HTTP header name for method override.
allowed_methods (default: [PUT, PATCH, DELETE])
Methods that can be overridden to. GET and POST are not allowed for security reasons.
check_header (default: 1)
Check the X-HTTP-Method-Override header.
check_param (default: 1)
Check the _method query/form parameter.
HOW IT WORKS
When a POST request is received:
- 1. Check X-HTTP-Method-Override header (if enabled)
- 2. Check _method query parameter (if enabled)
- 3. If found and method is allowed, override scope->{method}
- 4. Original method preserved in scope->{original_method}
SECURITY NOTES
Only POST requests can be overridden
GET requests cannot be overridden as they should be safe and idempotent.
Only specific methods allowed
By default only PUT, PATCH, DELETE are allowed. GET and POST are never allowed as override targets.
Header takes precedence
The X-HTTP-Method-Override header is checked before query parameters, as it's harder to inject via CSRF attacks.
HTML FORM USAGE
<form method="POST" action="/resource/123">
<input type="hidden" name="_method" value="DELETE">
<button type="submit">Delete</button>
</form>
AJAX USAGE
fetch('/resource/123', {
method: 'POST',
headers: {
'X-HTTP-Method-Override': 'DELETE'
}
});
SEE ALSO
PAGI::Middleware - Base class for middleware