X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController%2FCGIBin.pm;h=f05db5b7eb5fc2405d8e593bc57a9119e2ddd44b;hb=bef5bffc1e2bbd5e907e3e8010aed6de0c3054be;hp=b0173bebcd027c6e64f29f3b789cbc647b96a7b6;hpb=d9280b8f48ca21a28645888ca9ffb311a7dbdc86;p=catagits%2FCatalyst-Controller-WrapCGI.git diff --git a/lib/Catalyst/Controller/CGIBin.pm b/lib/Catalyst/Controller/CGIBin.pm index b0173be..f05db5b 100644 --- a/lib/Catalyst/Controller/CGIBin.pm +++ b/lib/Catalyst/Controller/CGIBin.pm @@ -6,7 +6,6 @@ use mro 'c3'; extends 'Catalyst::Controller::WrapCGI'; use File::Find::Rule (); -use Catalyst::Exception (); use File::Spec::Functions qw/splitdir abs2rel/; use IPC::Open3; use Symbol 'gensym'; @@ -22,13 +21,9 @@ use namespace::clean -except => 'meta'; Catalyst::Controller::CGIBin - Serve CGIs from root/cgi-bin -=head1 VERSION - -Version 0.026 - =cut -our $VERSION = '0.026'; +our $VERSION = '0.030'; =head1 SYNOPSIS @@ -41,8 +36,12 @@ In your controller: In your .conf: - cgi_root_path cgi-bin - cgi_dir cgi-bin + cgi_root_path cgi-bin + cgi_dir cgi-bin + cgi_chain_root /optional/private/path/to/Chained/root + cgi_file_pattern *.cgi + # or regex + cgi_file_pattern /\.pl\z/ username_field username # used for REMOTE_USER env var pass_env PERL5LIB @@ -69,15 +68,38 @@ module for other configuration information. The global URI path prefix for CGIs, defaults to C. +=head2 cgi_chain_root + +By default L actions are created for CGIs, +but if you specify this option, the actions will be created as +L end-points, chaining off the +specified private path. + +If this option is used, the L option is ignored. The root path +will be determined by your chain. + +The L of the action will be +the path to the CGI file. + =head2 cgi_dir Path from which to read CGI files. Can be relative to C<$MYAPP_HOME/root> or absolute. Defaults to C<$MYAPP_HOME/root/cgi-bin>. +=head2 cgi_file_pattern + +By default all files in L will be loaded as CGIs, however, with this +option you can specify either a glob or a regex to match the names of files you +want to be loaded. + +Can be an array of globs/regexes as well. + =cut -has cgi_root_path => (is => 'ro', isa => 'Str', default => 'cgi-bin'); -has cgi_dir => (is => 'ro', isa => 'Str', default => 'cgi-bin'); +has cgi_root_path => (is => 'ro', isa => 'Str', default => 'cgi-bin'); +has cgi_chain_root => (is => 'ro', isa => 'Str'); +has cgi_dir => (is => 'ro', isa => 'Str', default => 'cgi-bin'); +has cgi_file_pattern => (is => 'rw', default => sub { ['*'] }); sub register_actions { my ($self, $app) = @_; @@ -90,7 +112,16 @@ sub register_actions { my $class = ref $self || $self; - for my $file (File::Find::Rule->file->in($cgi_bin)) { + my $patterns = $self->cgi_file_pattern; + $patterns = [ $patterns ] if not ref $patterns; + for my $pat (@$patterns) { + if ($pat =~ m{^/(.*)/\z}) { + $pat = qr/$1/; + } + } + $self->cgi_file_pattern($patterns); + + for my $file (File::Find::Rule->file->name(@$patterns)->in($cgi_bin)) { my $cgi_path = abs2rel($file, $cgi_bin); next if any { $_ eq '.svn' } splitdir $cgi_path; @@ -98,9 +129,16 @@ sub register_actions { my $path = join '/' => splitdir($cgi_path); my $action_name = $self->cgi_action($path); - my $public_path = $self->cgi_path($path); my $reverse = $namespace ? "$namespace/$action_name" : $action_name; - my $attrs = { Path => [ $public_path ] }; + + my $attrs = do { + if (my $chain_root = $self->cgi_chain_root) { + { Chained => [ $chain_root ], PathPart => [ $path ], Args => [] }; + } + else { + { Path => [ $self->cgi_path($path) ] }; + } + }; my ($cgi, $type); @@ -343,5 +381,4 @@ under the same terms as Perl itself. =cut 1; # End of Catalyst::Controller::CGIBin - -# vim: expandtab shiftwidth=4 ts=4 tw=80: +# vim:et sw=4 sts=4 tw=0: