[Catalyst-commits] r11140 - in Catalyst-Plugin-Static-Simple/trunk:
. lib/Catalyst/Plugin/Static
rafl at dev.catalyst.perl.org
rafl at dev.catalyst.perl.org
Sun Aug 16 09:27:42 GMT 2009
Author: rafl
Date: 2009-08-16 09:27:41 +0000 (Sun, 16 Aug 2009)
New Revision: 11140
Modified:
Catalyst-Plugin-Static-Simple/trunk/Makefile.PL
Catalyst-Plugin-Static-Simple/trunk/lib/Catalyst/Plugin/Static/Simple.pm
Log:
Require the soon-to-be-release version 5.80008 of -Runtime.
It has a bugfix that makes serving empty files not blow up horribly.
Also remove useless trailing whitespace and add myself to the list of
contributors.
Modified: Catalyst-Plugin-Static-Simple/trunk/Makefile.PL
===================================================================
--- Catalyst-Plugin-Static-Simple/trunk/Makefile.PL 2009-08-16 09:19:58 UTC (rev 11139)
+++ Catalyst-Plugin-Static-Simple/trunk/Makefile.PL 2009-08-16 09:27:41 UTC (rev 11140)
@@ -3,15 +3,11 @@
name 'Catalyst-Plugin-Static-Simple';
all_from 'lib/Catalyst/Plugin/Static/Simple.pm';
-requires 'Catalyst::Runtime' => '5.30';
+requires 'Catalyst::Runtime' => '5.80008';
requires 'MIME::Types' => '1.25';
requires 'Test::More';
requires 'MRO::Compat';
-unless( can_use 'Catalyst' => '5.33' ) {
- requires 'File::Slurp';
-}
-
if( can_use 'Catalyst::Plugin::SubRequest' ) {
unless( can_use 'Catalyst::Plugin::SubRequest' => '0.08' ) {
print "** WARNING **\n"
Modified: Catalyst-Plugin-Static-Simple/trunk/lib/Catalyst/Plugin/Static/Simple.pm
===================================================================
--- Catalyst-Plugin-Static-Simple/trunk/lib/Catalyst/Plugin/Static/Simple.pm 2009-08-16 09:19:58 UTC (rev 11139)
+++ Catalyst-Plugin-Static-Simple/trunk/lib/Catalyst/Plugin/Static/Simple.pm 2009-08-16 09:27:41 UTC (rev 11140)
@@ -17,16 +17,16 @@
my $c = shift;
my $path = $c->req->path;
my $config = $c->config->{static};
-
+
$path =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
# is the URI in a static-defined path?
foreach my $dir ( @{ $config->{dirs} } ) {
my $dir_re = quotemeta $dir;
-
+
# strip trailing slashes, they'll be added in our regex
$dir_re =~ s{/$}{};
-
+
my $re = ( $dir =~ m{^qr/}xms ) ? eval $dir : qr{^${dir_re}/};
if ($@) {
$c->error( "Error compiling static dir regex '$dir': $@" );
@@ -43,21 +43,21 @@
}
}
}
-
+
# Does the path have an extension?
if ( $path =~ /.*\.(\S{1,})$/xms ) {
# and does it exist?
$c->_locate_static_file( $path );
}
-
+
return $c->next::method(@_);
}
sub dispatch {
my $c = shift;
-
+
return if ( $c->res->status != 200 );
-
+
if ( $c->_static_file ) {
if ( $c->config->{static}{no_logs} && $c->log->can('abort') ) {
$c->log->abort( 1 );
@@ -71,26 +71,22 @@
sub finalize {
my $c = shift;
-
+
# display all log messages
if ( $c->config->{static}{debug} && scalar @{$c->_debug_msg} ) {
$c->log->debug( 'Static::Simple: ' . join q{ }, @{$c->_debug_msg} );
}
-
+
return $c->next::method(@_);
}
sub setup {
my $c = shift;
-
+
$c->maybe::next::method(@_);
-
- if ( Catalyst->VERSION le '5.33' ) {
- require File::Slurp;
- }
-
+
my $config = $c->config->{static} ||= {};
-
+
$config->{dirs} ||= [];
$config->{include_path} ||= [ $c->config->{root} ];
$config->{mime_types} ||= {};
@@ -99,11 +95,11 @@
$config->{debug} ||= $c->debug;
$config->{no_logs} = 1 unless defined $config->{no_logs};
$config->{no_logs} = 0 if $config->{logging};
-
+
# load up a MIME::Types object, only loading types with
# at least 1 file extension
$config->{mime_types_obj} = MIME::Types->new( only_complete => 1 );
-
+
# preload the type index hash so it's not built on the first request
$config->{mime_types_obj}->create_type_index;
}
@@ -112,20 +108,20 @@
# Based on Template Toolkit INCLUDE_PATH code
sub _locate_static_file {
my ( $c, $path, $in_static_dir ) = @_;
-
+
$path = File::Spec->catdir(
- File::Spec->no_upwards( File::Spec->splitdir( $path ) )
+ File::Spec->no_upwards( File::Spec->splitdir( $path ) )
);
-
+
my $config = $c->config->{static};
my @ipaths = @{ $config->{include_path} };
my $dpaths;
my $count = 64; # maximum number of directories to search
-
+
DIR_CHECK:
while ( @ipaths && --$count) {
my $dir = shift @ipaths || next DIR_CHECK;
-
+
if ( ref $dir eq 'CODE' ) {
eval { $dpaths = &$dir( $c ) };
if ($@) {
@@ -137,7 +133,7 @@
} else {
$dir =~ s/(\/|\\)$//xms;
if ( -d $dir && -f $dir . '/' . $path ) {
-
+
# Don't ignore any files in static dirs defined with 'dirs'
unless ( $in_static_dir ) {
# do we need to ignore the file?
@@ -149,7 +145,7 @@
next DIR_CHECK;
}
}
-
+
# do we need to ignore based on extension?
for my $ignore_ext ( @{ $config->{ignore_extensions} } ) {
if ( $path =~ /.*\.${ignore_ext}$/ixms ) {
@@ -159,20 +155,20 @@
}
}
}
-
+
$c->_debug_msg( 'Serving ' . $dir . '/' . $path )
if $config->{debug};
return $c->_static_file( $dir . '/' . $path );
}
}
}
-
+
return;
}
sub _serve_static {
my $c = shift;
-
+
my $full_path = shift || $c->_static_file;
my $type = $c->_ext_to_type( $full_path );
my $stat = stat $full_path;
@@ -181,24 +177,16 @@
$c->res->headers->content_length( $stat->size );
$c->res->headers->last_modified( $stat->mtime );
- if ( Catalyst->VERSION le '5.33' ) {
- # old File::Slurp method
- my $content = File::Slurp::read_file( $full_path );
- $c->res->body( $content );
+ my $fh = IO::File->new( $full_path, 'r' );
+ if ( defined $fh ) {
+ binmode $fh;
+ $c->res->body( $fh );
}
else {
- # new method, pass an IO::File object to body
- my $fh = IO::File->new( $full_path, 'r' );
- if ( defined $fh ) {
- binmode $fh;
- $c->res->body( $fh );
- }
- else {
- Catalyst::Exception->throw(
- message => "Unable to open $full_path for reading" );
- }
+ Catalyst::Exception->throw(
+ message => "Unable to open $full_path for reading" );
}
-
+
return 1;
}
@@ -206,7 +194,7 @@
my ( $c, $full_path ) = @_;
my $config = $c->config->{static} ||= {};
-
+
if ( -e $full_path ) {
$c->_debug_msg( "Serving static file: $full_path" )
if $config->{debug};
@@ -225,12 +213,12 @@
# looks up the correct MIME type for the current file extension
sub _ext_to_type {
my ( $c, $full_path ) = @_;
-
+
my $config = $c->config->{static};
-
+
if ( $full_path =~ /.*\.(\S{1,})$/xms ) {
my $ext = $1;
- my $type = $config->{mime_types}{$ext}
+ my $type = $config->{mime_types}{$ext}
|| $config->{mime_types_obj}->mimeTypeOf( $ext );
if ( $type ) {
$c->_debug_msg( "as $type" ) if $config->{debug};
@@ -251,15 +239,15 @@
sub _debug_msg {
my ( $c, $msg ) = @_;
-
+
if ( !defined $c->_static_debug_message ) {
$c->_static_debug_message( [] );
}
-
+
if ( $msg ) {
push @{ $c->_static_debug_message }, $msg;
}
-
+
return $c->_static_debug_message;
}
@@ -299,7 +287,7 @@
properly.
If the plugin can not find the file, the request is dispatched to your
-application instead. This means you are responsible for generating a
+application instead. This means you are responsible for generating a
C<404> error if your applicaton can not process the request:
# handled by static::simple, not dispatched to your application
@@ -372,14 +360,14 @@
\&incpath_generator,
MyApp->config->{root}
];
-
+
With the above setting, a request for the file C</images/logo.jpg> will search
for the following files, returning the first one found:
/path/to/overlay/images/logo.jpg
/dynamic/path/images/logo.jpg
/your/app/home/root/images/logo.jpg
-
+
The include path can contain a subroutine reference to dynamically return a
list of available directories. This method will receive the C<$c> object as a
parameter and should return a reference to a list of directories. Errors can
@@ -397,7 +385,7 @@
die "No customer dir defined.";
}
}
-
+
=head2 Ignoring certain types of files
There are some file types you may not wish to serve as static files.
@@ -407,9 +395,9 @@
If you wish to define your own extensions to ignore, use the
C<ignore_extensions> option:
- MyApp->config->{static}->{ignore_extensions}
+ MyApp->config->{static}->{ignore_extensions}
= [ qw/html asp php/ ];
-
+
=head2 Ignoring entire directories
To prevent an entire directory from being served statically, you can use
@@ -418,7 +406,7 @@
checked against every included path.
MyApp->config->{static}->{ignore_dirs} = [ qw/tmpl css/ ];
-
+
For example, if combined with the above C<include_path> setting, this
C<ignore_dirs> value will ignore the following directories if they exist:
@@ -427,7 +415,7 @@
/dynamic/path/tmpl
/dynamic/path/css
/your/app/home/root/tmpl
- /your/app/home/root/css
+ /your/app/home/root/css
=head2 Custom MIME types
@@ -451,7 +439,7 @@
is automatically enabled when running Catalyst in -Debug mode.
MyApp->config->{static}->{debug} = 1;
-
+
=head1 USING WITH APACHE
While Static::Simple will work just fine serving files through Catalyst
@@ -490,7 +478,7 @@
</Location>
If you are running in a VirtualHost, you can just set the DocumentRoot
-location to the location of your root directory; see
+location to the location of your root directory; see
L<Catalyst::Engine::Apache2::MP20>.
=head1 PUBLIC METHODS
@@ -512,7 +500,7 @@
Static::Simple extends the following steps in the Catalyst process.
-=head2 prepare_action
+=head2 prepare_action
C<prepare_action> is used to first check if the request path is a static
file. If so, we skip all other C<prepare_action> steps to improve
@@ -534,7 +522,7 @@
=head1 SEE ALSO
-L<Catalyst>, L<Catalyst::Plugin::Static>,
+L<Catalyst>, L<Catalyst::Plugin::Static>,
L<http://www.iana.org/assignments/media-types/>
=head1 AUTHOR
@@ -549,6 +537,8 @@
Guillermo Roditi, <groditi at cpan.org>
+Florian Ragwitz <rafl at debian.org>
+
=head1 THANKS
The authors of Catalyst::Plugin::Static:
More information about the Catalyst-commits
mailing list