From: Andy Grundman Date: Fri, 11 May 2007 15:18:49 +0000 (+0000) Subject: Static::Simple: Added serve_static_file patch from groditi, plus tests X-Git-Tag: v0.17~1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Plugin-Static-Simple.git;a=commitdiff_plain;h=ab02ca0d1f663f389eef9d4b000c05392304c06a Static::Simple: Added serve_static_file patch from groditi, plus tests --- diff --git a/Changes b/Changes index 79d8095..2a6424a 100644 --- a/Changes +++ b/Changes @@ -1,4 +1,6 @@ Revision history for Perl extension Catalyst::Plugin::Static::Simple +0.17 + - Added serve_static_file, to serve a given file as static. (groditi) 0.16 2007-04-30 15:00:00 - Allow all files in directories defined by the config option 'dirs' diff --git a/lib/Catalyst/Plugin/Static/Simple.pm b/lib/Catalyst/Plugin/Static/Simple.pm index f4f56bc..aa0c732 100644 --- a/lib/Catalyst/Plugin/Static/Simple.pm +++ b/lib/Catalyst/Plugin/Static/Simple.pm @@ -8,7 +8,7 @@ use File::Spec (); use IO::File (); use MIME::Types (); -our $VERSION = '0.16'; +our $VERSION = '0.17'; __PACKAGE__->mk_accessors( qw/_static_file _static_debug_message/ ); @@ -166,7 +166,7 @@ sub _locate_static_file { 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; @@ -195,6 +195,25 @@ sub _serve_static { 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 ) = @_; @@ -426,6 +445,21 @@ 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. +=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. @@ -462,8 +496,11 @@ Andy Grundman, =head1 CONTRIBUTORS Marcus Ramberg, + Jesse Sheidlower, +Guillermo Roditi, + =head1 THANKS The authors of Catalyst::Plugin::Static: diff --git a/t/11serve_static.t b/t/11serve_static.t new file mode 100644 index 0000000..da17d5a --- /dev/null +++ b/t/11serve_static.t @@ -0,0 +1,20 @@ +#!perl + +use strict; +use warnings; + +use FindBin; +use lib "$FindBin::Bin/lib"; + +use Test::More tests => 6; +use Catalyst::Test 'TestApp'; + +# test getting a file via serve_static_file +ok( my $res = request('http://localhost/serve_static'), 'request ok' ); +is( $res->code, 200, '200 ok' ); +is( $res->content_type, 'application/x-pagemaker', 'content-type ok' ); +like( $res->content, qr/serve_static/, 'content of serve_static ok' ); + +# test getting a non-existant file via serve_static_file +ok( $res = request('http://localhost/serve_static_404'), 'request ok' ); +is( $res->code, 404, '404 ok' ); \ No newline at end of file diff --git a/t/lib/TestApp.pm b/t/lib/TestApp.pm index d118a55..001fb01 100644 --- a/t/lib/TestApp.pm +++ b/t/lib/TestApp.pm @@ -2,11 +2,14 @@ package TestApp; use strict; use Catalyst; +use File::Spec::Functions; +use FindBin; our $VERSION = '0.01'; TestApp->config( name => 'TestApp', + debug => 1, ); my @plugins = qw/Static::Simple/; @@ -44,4 +47,20 @@ sub subtest2 : Local { $c->res->output( 'subtest2 ok' ); } +sub serve_static : Local { + my ( $self, $c ) = @_; + + my $file = catfile( $FindBin::Bin, 'lib', 'TestApp.pm' ); + + $c->serve_static_file( $file ); +} + +sub serve_static_404 : Local { + my ( $self, $c ) = @_; + + my $file = catfile( $FindBin::Bin, 'lib', 'foo.pm' ); + + $c->serve_static_file( $file ); +} + 1;