use IO::File ();
use MIME::Types ();
-our $VERSION = '0.15';
+our $VERSION = '0.19';
__PACKAGE__->mk_accessors( qw/_static_file _static_debug_message/ );
# is the URI in a static-defined path?
foreach my $dir ( @{ $config->{dirs} } ) {
- my $re = ( $dir =~ m{^qr/}xms ) ? eval $dir : qr/^${dir}/;
+ my $dir_re = quotemeta $dir;
+ my $re = ( $dir =~ m{^qr/}xms ) ? eval $dir : qr/^${dir_re}/;
if ($@) {
$c->error( "Error compiling static dir regex '$dir': $@" );
}
if ( $path =~ $re ) {
- if ( $c->_locate_static_file( $path ) ) {
+ if ( $c->_locate_static_file( $path, 1 ) ) {
$c->_debug_msg( 'from static directory' )
if $config->{debug};
} else {
$c->log->debug( 'Static::Simple: ' . join q{ }, @{$c->_debug_msg} );
}
- if ( $c->res->status =~ /^(1\d\d|[23]04)$/xms ) {
- $c->res->headers->remove_content_headers;
- return $c->finalize_headers;
- }
-
return $c->NEXT::ACTUAL::finalize(@_);
}
$config->{ignore_dirs} ||= [];
$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
# Search through all included directories for the static file
# Based on Template Toolkit INCLUDE_PATH code
sub _locate_static_file {
- my ( $c, $path ) = @_;
+ my ( $c, $path, $in_static_dir ) = @_;
$path = File::Spec->catdir(
File::Spec->no_upwards( File::Spec->splitdir( $path ) )
$dir =~ s/(\/|\\)$//xms;
if ( -d $dir && -f $dir . '/' . $path ) {
- # do we need to ignore the file?
- for my $ignore ( @{ $config->{ignore_dirs} } ) {
- $ignore =~ s{(/|\\)$}{};
- if ( $path =~ /^$ignore(\/|\\)/ ) {
- $c->_debug_msg( "Ignoring directory `$ignore`" )
- if $config->{debug};
- next DIR_CHECK;
+ # Don't ignore any files in static dirs defined with 'dirs'
+ unless ( $in_static_dir ) {
+ # do we need to ignore the file?
+ for my $ignore ( @{ $config->{ignore_dirs} } ) {
+ $ignore =~ s{(/|\\)$}{};
+ if ( $path =~ /^$ignore(\/|\\)/ ) {
+ $c->_debug_msg( "Ignoring directory `$ignore`" )
+ if $config->{debug};
+ next DIR_CHECK;
+ }
}
- }
- # do we need to ignore based on extension?
- for my $ignore_ext ( @{ $config->{ignore_extensions} } ) {
- if ( $path =~ /.*\.${ignore_ext}$/ixms ) {
- $c->_debug_msg( "Ignoring extension `$ignore_ext`" )
- if $config->{debug};
- next DIR_CHECK;
+ # do we need to ignore based on extension?
+ for my $ignore_ext ( @{ $config->{ignore_extensions} } ) {
+ if ( $path =~ /.*\.${ignore_ext}$/ixms ) {
+ $c->_debug_msg( "Ignoring extension `$ignore_ext`" )
+ if $config->{debug};
+ next DIR_CHECK;
+ }
}
}
sub _serve_static {
my $c = shift;
- my $full_path = $c->_static_file;
+ my $full_path = shift || $c->_static_file;
my $type = $c->_ext_to_type( $full_path );
my $stat = stat $full_path;
return 1;
}
+sub serve_static_file {
+ my ( $c, $full_path ) = @_;
+
+ my $config = $c->config->{static} ||= {};
+
+ if ( -e $full_path ) {
+ $c->_debug_msg( "Serving static file: $full_path" )
+ if $config->{debug};
+ }
+ else {
+ $c->_debug_msg( "404: file not found: $full_path" )
+ if $config->{debug};
+ $c->res->status( 404 );
+ return;
+ }
+
+ $c->_serve_static( $full_path );
+}
+
# looks up the correct MIME type for the current file extension
sub _ext_to_type {
my ( $c, $full_path ) = @_;
default; static requests tend to clutter the log output and rarely
reveal anything useful. However, if you want to enable logging of static
requests, you can do so by setting
-C<MyApp-E<gt>config-E<gt>{static}-E<gt>{no_logs}> to 0.
+C<MyApp-E<gt>config-E<gt>{static}-E<gt>{logging}> to 1.
=head2 Forcing directories into static mode
application, and it will continue to function on a development server,
or using Catalyst's built-in server.
+=head1 PUBLIC METHODS
+
+=head2 serve_static_file $file_path
+
+Will serve the file located in $file_path statically. This is useful when
+you need to autogenerate them if they don't exist, or they are stored in a model.
+
+ package MyApp::Controller::User;
+
+ sub curr_user_thumb : PathPart("my_thumbnail.png") {
+ my ( $self, $c ) = @_;
+ my $file_path = $c->user->picture_thumbnail_path;
+ $c->serve_static_file($file_path);
+ }
+
=head1 INTERNAL EXTENDED METHODS
Static::Simple extends the following steps in the Catalyst process.
=head1 CONTRIBUTORS
Marcus Ramberg, <mramberg@cpan.org>
+
Jesse Sheidlower, <jester@panix.com>
+Guillermo Roditi, <groditi@cpan.org>
+
=head1 THANKS
The authors of Catalyst::Plugin::Static: