1package HTTP::Engine::Middleware::MethodOverride;
2use HTTP::Engine::Middleware;
3
4has 'HTTP_METHODS' => (
5    is      => 'rw',
6    isa     => 'ArrayRef',
7    default => sub {
8        return [ 'GET', 'HEAD', 'PUT', 'POST', 'DELETE' ];
9    }
10);
11
12has 'METHOD_OVERRIDE_PARAM_KEY' => (
13    is      => 'rw',
14    isa     => 'Str',
15    default => '_method',
16);
17
18has 'HTTP_METHOD_OVERRIDE_HEADER' => (
19    is      => 'rw',
20    isa     => 'Str',
21    default => 'X-HTTP-Method-Override',
22);
23
24before_handle {
25    my ( $c, $self, $req ) = @_;
26    $self->override_request_method($req);
27    $req;
28};
29
30sub override_request_method {
31    my ( $self, $req ) = @_;
32
33    my $method = $req->method;
34    if ( $method && uc $method ne 'POST' ) {
35        return $req;
36    }
37
38    my $overload = $req->param( $self->METHOD_OVERRIDE_PARAM_KEY )
39        || $req->header( $self->HTTP_METHOD_OVERRIDE_HEADER );
40
41    if ($overload) {
42        if ( (grep { $_ eq $overload } @{ $self->HTTP_METHODS } ) != 0 ) {
43            $req->method( uc $overload );
44        }
45    }
46    $req;
47}
48
49__MIDDLEWARE__
50
51__END__
52
53=head1 NAME
54
55HTTP::Engine::Middleware::MethodOverride - simulate HTTP methods by query parameter
56
57=head1 SYNOPSIS
58
59    my $mw = HTTP::Engine::Middleware->new;
60    $mw->install(qw/ HTTP::Engine::Middleware::MethodOverride /);
61    HTTP::Engine->new(
62        interface => {
63            module => 'YourFavoriteInterfaceHere',
64            request_handler => $mw->handler( \&handler ),
65        }
66    )->run();
67
68=head1 DESCRIPTION
69
70This module simulates the some minor HTTP methods by the query parameter(ex. DELETE, PUT).
71
72=head1 AUTHORS
73
74dann
75
76=cut
77