X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FPlugin%2FStatic%2FSimple.pm;h=6993ff0975bf1887457a40e8feda5de85384e416;hb=4e8215c6d01ee56a71096f9aec4ae53ea743be54;hp=108494522b482a29a1dc8db3ce80115d3c83c9c7;hpb=b648683ee2877a46cbd7e33787012a135529dd2b;p=catagits%2FCatalyst-Plugin-Static-Simple.git diff --git a/lib/Catalyst/Plugin/Static/Simple.pm b/lib/Catalyst/Plugin/Static/Simple.pm index 1084945..6993ff0 100644 --- a/lib/Catalyst/Plugin/Static/Simple.pm +++ b/lib/Catalyst/Plugin/Static/Simple.pm @@ -7,8 +7,9 @@ use File::stat; use File::Spec (); use IO::File (); use MIME::Types (); +use MRO::Compat; -our $VERSION = '0.19'; +our $VERSION = '0.21'; __PACKAGE__->mk_accessors( qw/_static_file _static_debug_message/ ); @@ -22,7 +23,11 @@ sub prepare_action { # is the URI in a static-defined path? foreach my $dir ( @{ $config->{dirs} } ) { my $dir_re = quotemeta $dir; - my $re = ( $dir =~ m{^qr/}xms ) ? eval $dir : qr/^${dir_re}/; + + # 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': $@" ); } @@ -34,6 +39,7 @@ sub prepare_action { $c->_debug_msg( "404: file not found: $path" ) if $config->{debug}; $c->res->status( 404 ); + $c->res->content_type( 'text/html' ); } } } @@ -44,7 +50,7 @@ sub prepare_action { $c->_locate_static_file( $path ); } - return $c->NEXT::ACTUAL::prepare_action(@_); + return $c->next::method(@_); } sub dispatch { @@ -59,7 +65,7 @@ sub dispatch { return $c->_serve_static; } else { - return $c->NEXT::ACTUAL::dispatch(@_); + return $c->next::method(@_); } } @@ -71,13 +77,13 @@ sub finalize { $c->log->debug( 'Static::Simple: ' . join q{ }, @{$c->_debug_msg} ); } - return $c->NEXT::ACTUAL::finalize(@_); + return $c->next::method(@_); } sub setup { my $c = shift; - $c->NEXT::setup(@_); + $c->maybe::next::method(@_); if ( Catalyst->VERSION le '5.33' ) { require File::Slurp; @@ -209,6 +215,7 @@ sub serve_static_file { $c->_debug_msg( "404: file not found: $full_path" ) if $config->{debug}; $c->res->status( 404 ); + $c->res->content_type( 'text/html' ); return; } @@ -265,14 +272,15 @@ Catalyst::Plugin::Static::Simple - Make serving static pages painless. =head1 SYNOPSIS - use Catalyst; - MyApp->setup( qw/Static::Simple/ ); + package MyApp; + use Catalyst qw/ Static::Simple /; + MyApp->setup; # that's it; static content is automatically served by Catalyst # from the application's root directory, though you can configure # things or bypass Catalyst entirely in a production environment # # one caveat: the files must be served from an absolute path - # (ie. /images/foo.png) + # (i.e. /images/foo.png) =head1 DESCRIPTION @@ -290,6 +298,18 @@ through Catalyst. Note that actions mapped to paths using periods (.) will still operate 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 +C<404> error if your applicaton can not process the request: + + # handled by static::simple, not dispatched to your application + /images/exists.png + + # static::simple will not find the file and let your application + # handle the request. You are responsible for generating a file + # or returning a 404 error + /images/does_not_exist.png + Though Static::Simple is designed to work out-of-the-box, you can tweak the operation by adding various configuration options. In a production environment, you will probably want to use your webserver to deliver @@ -434,13 +454,14 @@ is automatically enabled when running Catalyst in -Debug mode. =head1 USING WITH APACHE -While Static::Simple will work just fine serving files through Catalyst in -mod_perl, for increased performance, you may wish to have Apache handle the -serving of your static files. To do this, simply use a dedicated directory -for your static files and configure an Apache Location block for that -directory. This approach is recommended for production installations. +While Static::Simple will work just fine serving files through Catalyst +in mod_perl, for increased performance you may wish to have Apache +handle the serving of your static files directly. To do this, simply use +a dedicated directory for your static files and configure an Apache +Location block for that directory This approach is recommended for +production installations. - + SetHandler default-handler @@ -449,6 +470,29 @@ through Catalyst. You can leave Static::Simple as part of your application, and it will continue to function on a development server, or using Catalyst's built-in server. +In practice, your Catalyst application is probably (i.e. should be) +structured in the recommended way (i.e., that generated by bootstrapping +the application with the C script, with a main directory +under which is a C directory for module files and a C +directory for templates and static files). Thus, unless you break up +this structure when deploying your app by moving the static files to a +different location in your filesystem, you will need to use an Alias +directive in Apache to point to the right place. You will then need to +add a Directory block to give permission for Apache to serve these +files. The final configuration will look something like this: + + Alias /myapp/static /filesystem/path/to/MyApp/root/static + + allow from all + + + SetHandler default-handler + + +If you are running in a VirtualHost, you can just set the DocumentRoot +location to the location of your root directory; see +L. + =head1 PUBLIC METHODS =head2 serve_static_file $file_path