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/ );
# 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': $@" );
}
$c->_debug_msg( "404: file not found: $path" )
if $config->{debug};
$c->res->status( 404 );
+ $c->res->content_type( 'text/html' );
}
}
}
$c->_locate_static_file( $path );
}
- return $c->NEXT::ACTUAL::prepare_action(@_);
+ return $c->next::method(@_);
}
sub dispatch {
return $c->_serve_static;
}
else {
- return $c->NEXT::ACTUAL::dispatch(@_);
+ return $c->next::method(@_);
}
}
$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;
$c->_debug_msg( "404: file not found: $full_path" )
if $config->{debug};
$c->res->status( 404 );
+ $c->res->content_type( 'text/html' );
return;
}
=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
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
=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.
- <Location /static>
+ <Location /myapp/static>
SetHandler default-handler
</Location>
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<catalyst.pl> script, with a main directory
+under which is a C<lib/> directory for module files and a C<root/>
+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
+ <Directory /filesystem/path/to/MyApp/root/static>
+ allow from all
+ </Directory>
+ <Location /myapp/static>
+ SetHandler default-handler
+ </Location>
+
+If you are running in a VirtualHost, you can just set the DocumentRoot
+location to the location of your root directory; see
+L<Catalyst::Engine::Apache2::MP20>.
+
=head1 PUBLIC METHODS
=head2 serve_static_file $file_path