On Nov 21, 2006, at 9:44 PM, Garrett Goebel wrote:
On Nov 21, 2006, at 9:16 AM, Matt S Trout wrote:
Garrett Goebel wrote:
I tunneled PUT and DELETE inside a POST via a "_method" body parameter, which was automatically unravelled before dispatch within an overridden Catalyst::prepare_body_parameters method.

Clever. Would you be willing to separate that out as a plugin with a configurable parameter name? I think that might be well-received (and actually something that *should* be a plugin for once :)

I'll see what I can do. I'll be off the grid over the Thanksgiving holidays. But I'll take my laptop with me. There's a good chance I'll have the time, but with 4 kids under the age of 10, I can't make any promises ;)

On the ride home from the holidays, I managed to throw together my first catalyst plugin module. That was, the easy part. Now I need to write the tests and package it up for CPAN consumption.


I'd like to invite criticism and comments now, before changes get more painful.

For starters:

Is there a better package name?

Should I be inheriting from Catalyst::Base or Catalyst::Component? The documentation says to use the former, but from scanning the code, it looks like I only need the latter. On this one, I've stuck with the documentation.

Should I be using Class::C3 for ->next::method instead of - >NEXT::method? There are quite a few caveats in the Class::C3 documentation about not playing well with SUPER, but no mention of how well it plays with NEXT.

Should I be using $c->config->{'Catalyst::Plugin::Request::Method'}? The documentation seems to indicate this, but the existing plugin modules seem to prefer shorter keys. Here I went with the preference for shorter keys that seemed evident in the plugin modules I scanned. Easy enough to reverse.


package Catalyst::Plugin::Request::Method;
use 5.008;
use strict;
use warnings;
use version; our $VERSION = qv('0.0.1');
use base qw(Catalyst::Base);
use NEXT;

sub setup {
    my $c = shift @_;

    $c->NEXT::setup(@_);

    my $cfg = ( $c->config->{'request_method'} ||= {} );
    $cfg->{tunnel_param} ||= '_method';

    return $cfg;
}

sub prepare_body_parameters {
    my $c   = shift @_;
    my $req = $c->request;

    $c->NEXT::prepare_body_parameters(@_);

my $tunnel_param = $c->config->{'request_method'}-> {'tunnel_param'};

# Allow POST to masquerade as other request method via body_parameter if ($req->method eq 'POST' && exists $req->parameters-> {$tunnel_param}) {
        my $request_method = $req->parameters->{$tunnel_param};
        $req->method($request_method);
        delete $req->parameters->{$tunnel_param};
    }

    1;
}

1;

__END__



_______________________________________________
List: [email protected]
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to