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