[Catalyst-commits] r6392 - in tags/Catalyst-Plugin-Static-Simple: . 0.17 0.17/lib/Catalyst/Plugin/Static 0.17/t 0.17/t/lib

andyg at dev.catalyst.perl.org andyg at dev.catalyst.perl.org
Fri May 11 16:28:18 GMT 2007


Author: andyg
Date: 2007-05-11 16:28:18 +0100 (Fri, 11 May 2007)
New Revision: 6392

Added:
   tags/Catalyst-Plugin-Static-Simple/0.17/
   tags/Catalyst-Plugin-Static-Simple/0.17/Changes
   tags/Catalyst-Plugin-Static-Simple/0.17/MANIFEST.SKIP
   tags/Catalyst-Plugin-Static-Simple/0.17/README
   tags/Catalyst-Plugin-Static-Simple/0.17/lib/Catalyst/Plugin/Static/Simple.pm
   tags/Catalyst-Plugin-Static-Simple/0.17/t/11serve_static.t
   tags/Catalyst-Plugin-Static-Simple/0.17/t/lib/TestApp.pm
Removed:
   tags/Catalyst-Plugin-Static-Simple/0.17/Changes
   tags/Catalyst-Plugin-Static-Simple/0.17/MANIFEST.SKIP
   tags/Catalyst-Plugin-Static-Simple/0.17/README
   tags/Catalyst-Plugin-Static-Simple/0.17/lib/Catalyst/Plugin/Static/Simple.pm
   tags/Catalyst-Plugin-Static-Simple/0.17/t/lib/TestApp.pm
Log:
Static::Simple 0.17

Copied: tags/Catalyst-Plugin-Static-Simple/0.17 (from rev 6352, trunk/Catalyst-Plugin-Static-Simple)

Deleted: tags/Catalyst-Plugin-Static-Simple/0.17/Changes
===================================================================
--- trunk/Catalyst-Plugin-Static-Simple/Changes	2007-04-30 19:16:42 UTC (rev 6352)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/Changes	2007-05-11 15:28:18 UTC (rev 6392)
@@ -1,98 +0,0 @@
-Revision history for Perl extension Catalyst::Plugin::Static::Simple
-
-0.16    
-        - Allow all files in directories defined by the config option 'dirs'
-          to be served as static even if the file matches ignore_dirs or
-          ignore_extensions.
-        - Fixed bug where 204 or 304 status codes would result in a 500 error
-          under mod_perl.
-        - Switch to Module::Install
-
-0.15    2006-12-08 22:30:00
-        - Quote metacharacters used in $c->config->{dirs} (Vlad Dan Dascalescu)
-        - store Mime::Types object in config hash instead of as classdata
-        - cleanup code a bit
-
-0.14    2006-03-24 11:15:00
-        - Unescape the URI path before looking for the file.  This fixes
-		  issues with files that have spaces.
-
-0.13    2005-12-15 10:00:00
-        - Fixed bug in ignore_dirs under win32.
-        - Doc rewriting
-
-0.12    (released only with Catalyst)
-        - Made prepare_action play nice with other plugins by not short-
-          circuiting.
-        - Added tmpl to the ignored extensions.
-        - Fixed security problem if req->path contained '..'.
-
-0.11    2005-11-13 16:25:00
-        - Removed the code that set the 304 Not Modified header.  This caused
-          problems with IE under Apache.
-        - Changed 5.50 writing method to pass an IO::File object directly to
-          $c->res->body.
-        - This version is included with Catalyst 5.50.
-
-0.10    2005-10-19 17:20:00
-        - Added tt2 to the list of ignored extensions.
-        - For Catalyst 5.5+, replaced File::Slurp with a buffered read/write
-          process.  This will improve memory usage and performance on larger
-          static files.
-        - Removed Apache integration feature.  It is slower than serving
-          through Catalyst and as far as I know no one is using it.  If you
-          need the best performance, use a separate Location block for static
-          content.
-
-0.09    2005-10-07 13:40:00
-        - Added new configuration options to improve security:
-          ignore_extensions - keep certain extensions from being static
-          - This option defaults to tt, html, and xhtml to prevent
-            template files from being accessible.
-          ignore_dirs - keep certain dirs from being static
-        - include_path is no longer experimental.
-        - Added support for hiding log output, depends on Cat 5.50. 
-          (Marcus Ramberg)
-
-0.08    2005-09-07 18:50:00
-        - Added tests for everything except Apache support.
-
-0.07    2005-09-05 21:05:00
-        - POD fixes. (Thomas L. Shinnick)
-
-0.06    2005-09-05 15:40:00
-        - Moved initial file check into prepare_action so processing can
-          bypass other plugins.
-        - Added error-checking to static dir regexes.
-        - Cleaned up various code as per Best Practices.
-
-0.05    2005-08-26 12:00:00
-        - Added use_apache option to enable the Apache DECLINED
-          support.  Default is disabled as it appears Catalyst is
-          faster at serving the files!
-        - Added a check that Apache's DocumentRoot matches Catalyst's
-          root before serving DECLINED.
-        - Preload MIME::Types index during setup() so it's not built on
-          the first request.
-        - Added a note on performance of Apache vs. Catalyst.
-
-0.04    2005-08-22 12:00:00
-        - Fixed bug where static files were searched for on every request
-          even without a file extension.
-        - Fixed bug where files without extensions in defined static dirs
-          were not served with text/plain.
-        - Consolidated the debug log messages.
-
-0.03    2005-08-21 23:50:00
-        - Added config option for include_path to allow for multiple 
-          directories with static files.  This option should be
-          considered experimental!
-        - Documentation cleanups.
-
-0.02    2005-08-16 18:00:00
-        - Return DECLINED when running under mod_perl to allow Apache to
-          serve the static file.  This is not done when any custom MIME
-          types have been specified, however.
-
-0.01    2005-08-11 22:00:00
-        - Initial release.

Copied: tags/Catalyst-Plugin-Static-Simple/0.17/Changes (from rev 6391, trunk/Catalyst-Plugin-Static-Simple/Changes)
===================================================================
--- tags/Catalyst-Plugin-Static-Simple/0.17/Changes	                        (rev 0)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/Changes	2007-05-11 15:28:18 UTC (rev 6392)
@@ -0,0 +1,100 @@
+Revision history for Perl extension Catalyst::Plugin::Static::Simple
+0.17    2007-05-11 11:00:00
+        - 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'
+          to be served as static even if the file matches ignore_dirs or
+          ignore_extensions.
+        - Fixed bug where 204 or 304 status codes would result in a 500 error
+          under mod_perl.
+        - Switch to Module::Install.
+
+0.15    2006-12-08 22:30:00
+        - Quote metacharacters used in $c->config->{dirs} (Vlad Dan Dascalescu)
+        - store Mime::Types object in config hash instead of as classdata
+        - cleanup code a bit
+
+0.14    2006-03-24 11:15:00
+        - Unescape the URI path before looking for the file.  This fixes
+		  issues with files that have spaces.
+
+0.13    2005-12-15 10:00:00
+        - Fixed bug in ignore_dirs under win32.
+        - Doc rewriting
+
+0.12    (released only with Catalyst)
+        - Made prepare_action play nice with other plugins by not short-
+          circuiting.
+        - Added tmpl to the ignored extensions.
+        - Fixed security problem if req->path contained '..'.
+
+0.11    2005-11-13 16:25:00
+        - Removed the code that set the 304 Not Modified header.  This caused
+          problems with IE under Apache.
+        - Changed 5.50 writing method to pass an IO::File object directly to
+          $c->res->body.
+        - This version is included with Catalyst 5.50.
+
+0.10    2005-10-19 17:20:00
+        - Added tt2 to the list of ignored extensions.
+        - For Catalyst 5.5+, replaced File::Slurp with a buffered read/write
+          process.  This will improve memory usage and performance on larger
+          static files.
+        - Removed Apache integration feature.  It is slower than serving
+          through Catalyst and as far as I know no one is using it.  If you
+          need the best performance, use a separate Location block for static
+          content.
+
+0.09    2005-10-07 13:40:00
+        - Added new configuration options to improve security:
+          ignore_extensions - keep certain extensions from being static
+          - This option defaults to tt, html, and xhtml to prevent
+            template files from being accessible.
+          ignore_dirs - keep certain dirs from being static
+        - include_path is no longer experimental.
+        - Added support for hiding log output, depends on Cat 5.50. 
+          (Marcus Ramberg)
+
+0.08    2005-09-07 18:50:00
+        - Added tests for everything except Apache support.
+
+0.07    2005-09-05 21:05:00
+        - POD fixes. (Thomas L. Shinnick)
+
+0.06    2005-09-05 15:40:00
+        - Moved initial file check into prepare_action so processing can
+          bypass other plugins.
+        - Added error-checking to static dir regexes.
+        - Cleaned up various code as per Best Practices.
+
+0.05    2005-08-26 12:00:00
+        - Added use_apache option to enable the Apache DECLINED
+          support.  Default is disabled as it appears Catalyst is
+          faster at serving the files!
+        - Added a check that Apache's DocumentRoot matches Catalyst's
+          root before serving DECLINED.
+        - Preload MIME::Types index during setup() so it's not built on
+          the first request.
+        - Added a note on performance of Apache vs. Catalyst.
+
+0.04    2005-08-22 12:00:00
+        - Fixed bug where static files were searched for on every request
+          even without a file extension.
+        - Fixed bug where files without extensions in defined static dirs
+          were not served with text/plain.
+        - Consolidated the debug log messages.
+
+0.03    2005-08-21 23:50:00
+        - Added config option for include_path to allow for multiple 
+          directories with static files.  This option should be
+          considered experimental!
+        - Documentation cleanups.
+
+0.02    2005-08-16 18:00:00
+        - Return DECLINED when running under mod_perl to allow Apache to
+          serve the static file.  This is not done when any custom MIME
+          types have been specified, however.
+
+0.01    2005-08-11 22:00:00
+        - Initial release.

Deleted: tags/Catalyst-Plugin-Static-Simple/0.17/MANIFEST.SKIP
===================================================================
--- trunk/Catalyst-Plugin-Static-Simple/MANIFEST.SKIP	2007-04-30 19:16:42 UTC (rev 6352)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/MANIFEST.SKIP	2007-05-11 15:28:18 UTC (rev 6392)
@@ -1,31 +0,0 @@
-# Avoid version control files.
-\bRCS\b
-\bCVS\b
-,v$
-\B\.svn\b
-
-# Avoid Makemaker generated and utility files.
-\bMakefile$
-\bblib
-\bMakeMaker-\d
-\bpm_to_blib$
-\bblibdirs$
-^MANIFEST\.SKIP$
-
-# Avoid Module::Build generated and utility files.
-\bBuild$
-\b_build
-
-# Avoid temp and backup files.
-~$
-\.tmp$
-\.old$
-\.bak$
-\#$
-\b\.#
-
-# Don't ship the test db
-^t/var
-
-# Module::Build can't handle files with spaces
-t/lib/TestApp/root/files/space file.txt

Copied: tags/Catalyst-Plugin-Static-Simple/0.17/MANIFEST.SKIP (from rev 6353, trunk/Catalyst-Plugin-Static-Simple/MANIFEST.SKIP)
===================================================================
--- tags/Catalyst-Plugin-Static-Simple/0.17/MANIFEST.SKIP	                        (rev 0)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/MANIFEST.SKIP	2007-05-11 15:28:18 UTC (rev 6392)
@@ -0,0 +1,31 @@
+# Avoid version control files.
+\bRCS\b
+\bCVS\b
+,v$
+\B\.svn\b
+
+# Avoid Makemaker generated and utility files.
+\bMakefile$
+\bblib
+\bMakeMaker-\d
+\bpm_to_blib$
+\bblibdirs$
+^MANIFEST\.SKIP$
+
+# Avoid Module::Build generated and utility files.
+\bBuild$
+\b_build
+
+# Avoid temp and backup files.
+~$
+\.tmp$
+\.old$
+\.bak$
+\#$
+\b\.#
+
+# Don't ship the test db
+^t/var
+
+# Module::Install can't handle files with spaces
+t/lib/TestApp/root/files/space file.txt

Deleted: tags/Catalyst-Plugin-Static-Simple/0.17/README
===================================================================
--- trunk/Catalyst-Plugin-Static-Simple/README	2007-04-30 19:16:42 UTC (rev 6352)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/README	2007-05-11 15:28:18 UTC (rev 6392)
@@ -1,218 +0,0 @@
-NAME
-    Catalyst::Plugin::Static::Simple - Make serving static pages painless.
-
-SYNOPSIS
-        use Catalyst;
-        MyApp->setup( qw/Static::Simple/ );
-        # that's it; static content is automatically served by
-        # Catalyst, though you can configure things or bypass
-        # Catalyst entirely in a production environment
-
-DESCRIPTION
-    The Static::Simple plugin is designed to make serving static content in
-    your application during development quick and easy, without requiring a
-    single line of code from you.
-
-    This plugin detects static files by looking at the file extension in the
-    URL (such as .css or .png or .js). The plugin uses the lightweight
-    MIME::Types module to map file extensions to IANA-registered MIME types,
-    and will serve your static files with the correct MIME type directly to
-    the browser, without being processed through Catalyst.
-
-    Note that actions mapped to paths using periods (.) will still operate
-    properly.
-
-    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
-    static content; for an example see "USING WITH APACHE", below.
-
-DEFAULT BEHAVIOR
-    By default, Static::Simple will deliver all files having extensions
-    (that is, bits of text following a period (".")), *except* files having
-    the extensions "tmpl", "tt", "tt2", "html", and "xhtml". These files,
-    and all files without extensions, will be processed through Catalyst. If
-    MIME::Types doesn't recognize an extension, it will be served as
-    "text/plain".
-
-    To restate: files having the extensions "tmpl", "tt", "tt2", "html", and
-    "xhtml" *will not* be served statically by default, they will be
-    processed by Catalyst. Thus if you want to use ".html" files from within
-    a Catalyst app as static files, you need to change the configuration of
-    Static::Simple. Note also that files having any other extension *will*
-    be served statically, so if you're using any other extension for
-    template files, you should also change the configuration.
-
-    Logging of static files is turned off by default.
-
-ADVANCED CONFIGURATION
-    Configuration is completely optional and is specified within
-    "MyApp->config->{static}". If you use any of these options, this module
-    will probably feel less "simple" to you!
-
-  Enabling request logging
-    Since Catalyst 5.50, logging of static requests is turned off by
-    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 "MyApp->config->{static}->{no_logs}"
-    to 0.
-
-  Forcing directories into static mode
-    Define a list of top-level directories beneath your 'root' directory
-    that should always be served in static mode. Regular expressions may be
-    specified using "qr//".
-
-        MyApp->config->{static}->{dirs} = [
-            'static',
-            qr/^(images|css)/,
-        ];
-
-  Including additional directories
-    You may specify a list of directories in which to search for your static
-    files. The directories will be searched in order and will return the
-    first file found. Note that your root directory is not automatically
-    added to the search path when you specify an "include_path". You should
-    use "MyApp->config->{root}" to add it.
-
-        MyApp->config->{static}->{include_path} = [
-            '/path/to/overlay',
-            \&incpath_generator,
-            MyApp->config->{root}
-        ];
-    
-    With the above setting, a request for the file "/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
-    object as a parameter and should return a reference to a list of
-    directories. Errors can be reported using "die()". This method will be
-    called every time a file is requested that appears to be a static file
-    (i.e. it has an extension).
-
-    For example:
-
-        sub incpath_generator {
-            my $c = shift;
-        
-            if ( $c->session->{customer_dir} ) {
-                return [ $c->session->{customer_dir} ];
-            } else {
-                die "No customer dir defined.";
-            }
-        }
-    
-  Ignoring certain types of files
-    There are some file types you may not wish to serve as static files.
-    Most important in this category are your raw template files. By default,
-    files with the extensions "tmpl", "tt", "tt2", "html", and "xhtml" will
-    be ignored by Static::Simple in the interest of security. If you wish to
-    define your own extensions to ignore, use the "ignore_extensions"
-    option:
-
-        MyApp->config->{static}->{ignore_extensions} 
-            = [ qw/html asp php/ ];
-    
-  Ignoring entire directories
-    To prevent an entire directory from being served statically, you can use
-    the "ignore_dirs" option. This option contains a list of relative
-    directory paths to ignore. If using "include_path", the path will be
-    checked against every included path.
-
-        MyApp->config->{static}->{ignore_dirs} = [ qw/tmpl css/ ];
-    
-    For example, if combined with the above "include_path" setting, this
-    "ignore_dirs" value will ignore the following directories if they exist:
-
-        /path/to/overlay/tmpl
-        /path/to/overlay/css
-        /dynamic/path/tmpl
-        /dynamic/path/css
-        /your/app/home/root/tmpl
-        /your/app/home/root/css    
-
-  Custom MIME types
-    To override or add to the default MIME types set by the MIME::Types
-    module, you may enter your own extension to MIME type mapping.
-
-        MyApp->config->{static}->{mime_types} = {
-            jpg => 'image/jpg',
-            png => 'image/png',
-        };
-
-  Compatibility with other plugins
-    Since version 0.12, Static::Simple plays nice with other plugins. It no
-    longer short-circuits the "prepare_action" stage as it was causing too
-    many compatibility issues with other plugins.
-
-  Debugging information
-    Enable additional debugging information printed in the Catalyst log.
-    This is automatically enabled when running Catalyst in -Debug mode.
-
-        MyApp->config->{static}->{debug} = 1;
-    
-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.
-
-        <Location /static>
-            SetHandler default-handler
-        </Location>
-
-    Using this approach Apache will bypass any handling of these directories
-    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.
-
-INTERNAL EXTENDED METHODS
-    Static::Simple extends the following steps in the Catalyst process.
-
-  prepare_action
-    "prepare_action" is used to first check if the request path is a static
-    file. If so, we skip all other "prepare_action" steps to improve
-    performance.
-
-  dispatch
-    "dispatch" takes the file found during "prepare_action" and writes it to
-    the output.
-
-  finalize
-    "finalize" serves up final header information and displays any log
-    messages.
-
-  setup
-    "setup" initializes all default values.
-
-SEE ALSO
-    Catalyst, Catalyst::Plugin::Static,
-    <http://www.iana.org/assignments/media-types/>
-
-AUTHOR
-    Andy Grundman, <andy at hybridized.org>
-
-CONTRIBUTORS
-    Marcus Ramberg, <mramberg at cpan.org> Jesse Sheidlower, <jester at panix.com>
-
-THANKS
-    The authors of Catalyst::Plugin::Static:
-
-        Sebastian Riedel
-        Christian Hansen
-        Marcus Ramberg
-
-    For the include_path code from Template Toolkit:
-
-        Andy Wardley
-
-COPYRIGHT
-    This program is free software, you can redistribute it and/or modify it
-    under the same terms as Perl itself.
-

Copied: tags/Catalyst-Plugin-Static-Simple/0.17/README (from rev 6391, trunk/Catalyst-Plugin-Static-Simple/README)
===================================================================
--- tags/Catalyst-Plugin-Static-Simple/0.17/README	                        (rev 0)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/README	2007-05-11 15:28:18 UTC (rev 6392)
@@ -0,0 +1,236 @@
+NAME
+    Catalyst::Plugin::Static::Simple - Make serving static pages painless.
+
+SYNOPSIS
+        use Catalyst;
+        MyApp->setup( qw/Static::Simple/ );
+        # that's it; static content is automatically served by
+        # Catalyst, though you can configure things or bypass
+        # Catalyst entirely in a production environment
+
+DESCRIPTION
+    The Static::Simple plugin is designed to make serving static content in
+    your application during development quick and easy, without requiring a
+    single line of code from you.
+
+    This plugin detects static files by looking at the file extension in the
+    URL (such as .css or .png or .js). The plugin uses the lightweight
+    MIME::Types module to map file extensions to IANA-registered MIME types,
+    and will serve your static files with the correct MIME type directly to
+    the browser, without being processed through Catalyst.
+
+    Note that actions mapped to paths using periods (.) will still operate
+    properly.
+
+    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
+    static content; for an example see "USING WITH APACHE", below.
+
+DEFAULT BEHAVIOR
+    By default, Static::Simple will deliver all files having extensions
+    (that is, bits of text following a period (".")), *except* files having
+    the extensions "tmpl", "tt", "tt2", "html", and "xhtml". These files,
+    and all files without extensions, will be processed through Catalyst. If
+    MIME::Types doesn't recognize an extension, it will be served as
+    "text/plain".
+
+    To restate: files having the extensions "tmpl", "tt", "tt2", "html", and
+    "xhtml" *will not* be served statically by default, they will be
+    processed by Catalyst. Thus if you want to use ".html" files from within
+    a Catalyst app as static files, you need to change the configuration of
+    Static::Simple. Note also that files having any other extension *will*
+    be served statically, so if you're using any other extension for
+    template files, you should also change the configuration.
+
+    Logging of static files is turned off by default.
+
+ADVANCED CONFIGURATION
+    Configuration is completely optional and is specified within
+    "MyApp->config->{static}". If you use any of these options, this module
+    will probably feel less "simple" to you!
+
+  Enabling request logging
+    Since Catalyst 5.50, logging of static requests is turned off by
+    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 "MyApp->config->{static}->{no_logs}"
+    to 0.
+
+  Forcing directories into static mode
+    Define a list of top-level directories beneath your 'root' directory
+    that should always be served in static mode. Regular expressions may be
+    specified using "qr//".
+
+        MyApp->config->{static}->{dirs} = [
+            'static',
+            qr/^(images|css)/,
+        ];
+
+  Including additional directories
+    You may specify a list of directories in which to search for your static
+    files. The directories will be searched in order and will return the
+    first file found. Note that your root directory is not automatically
+    added to the search path when you specify an "include_path". You should
+    use "MyApp->config->{root}" to add it.
+
+        MyApp->config->{static}->{include_path} = [
+            '/path/to/overlay',
+            \&incpath_generator,
+            MyApp->config->{root}
+        ];
+    
+    With the above setting, a request for the file "/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
+    object as a parameter and should return a reference to a list of
+    directories. Errors can be reported using "die()". This method will be
+    called every time a file is requested that appears to be a static file
+    (i.e. it has an extension).
+
+    For example:
+
+        sub incpath_generator {
+            my $c = shift;
+        
+            if ( $c->session->{customer_dir} ) {
+                return [ $c->session->{customer_dir} ];
+            } else {
+                die "No customer dir defined.";
+            }
+        }
+    
+  Ignoring certain types of files
+    There are some file types you may not wish to serve as static files.
+    Most important in this category are your raw template files. By default,
+    files with the extensions "tmpl", "tt", "tt2", "html", and "xhtml" will
+    be ignored by Static::Simple in the interest of security. If you wish to
+    define your own extensions to ignore, use the "ignore_extensions"
+    option:
+
+        MyApp->config->{static}->{ignore_extensions} 
+            = [ qw/html asp php/ ];
+    
+  Ignoring entire directories
+    To prevent an entire directory from being served statically, you can use
+    the "ignore_dirs" option. This option contains a list of relative
+    directory paths to ignore. If using "include_path", the path will be
+    checked against every included path.
+
+        MyApp->config->{static}->{ignore_dirs} = [ qw/tmpl css/ ];
+    
+    For example, if combined with the above "include_path" setting, this
+    "ignore_dirs" value will ignore the following directories if they exist:
+
+        /path/to/overlay/tmpl
+        /path/to/overlay/css
+        /dynamic/path/tmpl
+        /dynamic/path/css
+        /your/app/home/root/tmpl
+        /your/app/home/root/css    
+
+  Custom MIME types
+    To override or add to the default MIME types set by the MIME::Types
+    module, you may enter your own extension to MIME type mapping.
+
+        MyApp->config->{static}->{mime_types} = {
+            jpg => 'image/jpg',
+            png => 'image/png',
+        };
+
+  Compatibility with other plugins
+    Since version 0.12, Static::Simple plays nice with other plugins. It no
+    longer short-circuits the "prepare_action" stage as it was causing too
+    many compatibility issues with other plugins.
+
+  Debugging information
+    Enable additional debugging information printed in the Catalyst log.
+    This is automatically enabled when running Catalyst in -Debug mode.
+
+        MyApp->config->{static}->{debug} = 1;
+    
+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.
+
+        <Location /static>
+            SetHandler default-handler
+        </Location>
+
+    Using this approach Apache will bypass any handling of these directories
+    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.
+
+PUBLIC METHODS
+  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);
+        }
+
+INTERNAL EXTENDED METHODS
+    Static::Simple extends the following steps in the Catalyst process.
+
+  prepare_action
+    "prepare_action" is used to first check if the request path is a static
+    file. If so, we skip all other "prepare_action" steps to improve
+    performance.
+
+  dispatch
+    "dispatch" takes the file found during "prepare_action" and writes it to
+    the output.
+
+  finalize
+    "finalize" serves up final header information and displays any log
+    messages.
+
+  setup
+    "setup" initializes all default values.
+
+SEE ALSO
+    Catalyst, Catalyst::Plugin::Static,
+    <http://www.iana.org/assignments/media-types/>
+
+AUTHOR
+    Andy Grundman, <andy at hybridized.org>
+
+CONTRIBUTORS
+    Marcus Ramberg, <mramberg at cpan.org>
+
+    Jesse Sheidlower, <jester at panix.com>
+
+    Guillermo Roditi, <groditi at cpan.org>
+
+THANKS
+    The authors of Catalyst::Plugin::Static:
+
+        Sebastian Riedel
+        Christian Hansen
+        Marcus Ramberg
+
+    For the include_path code from Template Toolkit:
+
+        Andy Wardley
+
+COPYRIGHT
+    This program is free software, you can redistribute it and/or modify it
+    under the same terms as Perl itself.
+

Deleted: tags/Catalyst-Plugin-Static-Simple/0.17/lib/Catalyst/Plugin/Static/Simple.pm
===================================================================
--- trunk/Catalyst-Plugin-Static-Simple/lib/Catalyst/Plugin/Static/Simple.pm	2007-04-30 19:16:42 UTC (rev 6352)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/lib/Catalyst/Plugin/Static/Simple.pm	2007-05-11 15:28:18 UTC (rev 6392)
@@ -1,484 +0,0 @@
-package Catalyst::Plugin::Static::Simple;
-
-use strict;
-use warnings;
-use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
-use File::stat;
-use File::Spec ();
-use IO::File ();
-use MIME::Types ();
-
-our $VERSION = '0.16';
-
-__PACKAGE__->mk_accessors( qw/_static_file _static_debug_message/ );
-
-sub prepare_action {
-    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;
-        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, 1 ) ) {
-                $c->_debug_msg( 'from static directory' )
-                    if $config->{debug};
-            } else {
-                $c->_debug_msg( "404: file not found: $path" )
-                    if $config->{debug};
-                $c->res->status( 404 );
-            }
-        }
-    }
-    
-    # Does the path have an extension?
-    if ( $path =~ /.*\.(\S{1,})$/xms ) {
-        # and does it exist?
-        $c->_locate_static_file( $path );
-    }
-    
-    return $c->NEXT::ACTUAL::prepare_action(@_);
-}
-
-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 );
-        }
-        return $c->_serve_static;
-    }
-    else {
-        return $c->NEXT::ACTUAL::dispatch(@_);
-    }
-}
-
-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::ACTUAL::finalize(@_);
-}
-
-sub setup {
-    my $c = shift;
-    
-    $c->NEXT::setup(@_);
-    
-    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} ||= {};
-    $config->{ignore_extensions} ||= [ qw/tmpl tt tt2 html xhtml/ ];
-    $config->{ignore_dirs} ||= [];
-    $config->{debug} ||= $c->debug;
-    $config->{no_logs} = 1 unless defined $config->{no_logs};
-    
-    # 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;
-}
-
-# Search through all included directories for the static file
-# 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 ) ) 
-    );
-    
-    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 ($@) {
-                $c->log->error( 'Static::Simple: include_path error: ' . $@ );
-            } else {
-                unshift @ipaths, @$dpaths;
-                next DIR_CHECK;
-            }
-        } 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?
-                    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;
-                        }
-                    }
-                }
-                
-                $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 = $c->_static_file;
-    my $type      = $c->_ext_to_type( $full_path );
-    my $stat      = stat $full_path;
-
-    $c->res->headers->content_type( $type );
-    $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 );
-    }
-    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" );
-        }
-    }
-    
-    return 1;
-}
-
-# 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} 
-            || $config->{mime_types_obj}->mimeTypeOf( $ext );
-        if ( $type ) {
-            $c->_debug_msg( "as $type" ) if $config->{debug};
-            return ( ref $type ) ? $type->type : $type;
-        }
-        else {
-            $c->_debug_msg( "as text/plain (unknown extension $ext)" )
-                if $config->{debug};
-            return 'text/plain';
-        }
-    }
-    else {
-        $c->_debug_msg( 'as text/plain (no extension)' )
-            if $config->{debug};
-        return 'text/plain';
-    }
-}
-
-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;
-}
-
-1;
-__END__
-
-=head1 NAME
-
-Catalyst::Plugin::Static::Simple - Make serving static pages painless.
-
-=head1 SYNOPSIS
-
-    use Catalyst;
-    MyApp->setup( qw/Static::Simple/ );
-    # that's it; static content is automatically served by
-    # Catalyst, though you can configure things or bypass
-    # Catalyst entirely in a production environment
-
-=head1 DESCRIPTION
-
-The Static::Simple plugin is designed to make serving static content in
-your application during development quick and easy, without requiring a
-single line of code from you.
-
-This plugin detects static files by looking at the file extension in the
-URL (such as B<.css> or B<.png> or B<.js>). The plugin uses the
-lightweight L<MIME::Types> module to map file extensions to
-IANA-registered MIME types, and will serve your static files with the
-correct MIME type directly to the browser, without being processed
-through Catalyst.
-
-Note that actions mapped to paths using periods (.) will still operate
-properly.
-
-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
-static content; for an example see L<USING WITH APACHE>, below.
-
-=head1 DEFAULT BEHAVIOR
-
-By default, Static::Simple will deliver all files having extensions
-(that is, bits of text following a period (C<.>)), I<except> files
-having the extensions C<tmpl>, C<tt>, C<tt2>, C<html>, and
-C<xhtml>. These files, and all files without extensions, will be
-processed through Catalyst. If L<MIME::Types> doesn't recognize an
-extension, it will be served as C<text/plain>.
-
-To restate: files having the extensions C<tmpl>, C<tt>, C<tt2>, C<html>,
-and C<xhtml> I<will not> be served statically by default, they will be
-processed by Catalyst. Thus if you want to use C<.html> files from
-within a Catalyst app as static files, you need to change the
-configuration of Static::Simple. Note also that files having any other
-extension I<will> be served statically, so if you're using any other
-extension for template files, you should also change the configuration.
-
-Logging of static files is turned off by default.
-
-=head1 ADVANCED CONFIGURATION
-
-Configuration is completely optional and is specified within
-C<MyApp-E<gt>config-E<gt>{static}>.  If you use any of these options,
-this module will probably feel less "simple" to you!
-
-=head2 Enabling request logging
-
-Since Catalyst 5.50, logging of static requests is turned off by
-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.
-
-=head2 Forcing directories into static mode
-
-Define a list of top-level directories beneath your 'root' directory
-that should always be served in static mode.  Regular expressions may be
-specified using C<qr//>.
-
-    MyApp->config->{static}->{dirs} = [
-        'static',
-        qr/^(images|css)/,
-    ];
-
-=head2 Including additional directories
-
-You may specify a list of directories in which to search for your static
-files. The directories will be searched in order and will return the
-first file found. Note that your root directory is B<not> automatically
-added to the search path when you specify an C<include_path>. You should
-use C<MyApp-E<gt>config-E<gt>{root}> to add it.
-
-    MyApp->config->{static}->{include_path} = [
-        '/path/to/overlay',
-        \&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
-be reported using C<die()>.  This method will be called every time a file is
-requested that appears to be a static file (i.e. it has an extension).
-
-For example:
-
-    sub incpath_generator {
-        my $c = shift;
-        
-        if ( $c->session->{customer_dir} ) {
-            return [ $c->session->{customer_dir} ];
-        } else {
-            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.
-Most important in this category are your raw template files.  By
-default, files with the extensions C<tmpl>, C<tt>, C<tt2>, C<html>, and
-C<xhtml> will be ignored by Static::Simple in the interest of security.
-If you wish to define your own extensions to ignore, use the
-C<ignore_extensions> option:
-
-    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
-the C<ignore_dirs> option.  This option contains a list of relative
-directory paths to ignore.  If using C<include_path>, the path will be
-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:
-
-    /path/to/overlay/tmpl
-    /path/to/overlay/css
-    /dynamic/path/tmpl
-    /dynamic/path/css
-    /your/app/home/root/tmpl
-    /your/app/home/root/css    
-
-=head2 Custom MIME types
-
-To override or add to the default MIME types set by the L<MIME::Types>
-module, you may enter your own extension to MIME type mapping.
-
-    MyApp->config->{static}->{mime_types} = {
-        jpg => 'image/jpg',
-        png => 'image/png',
-    };
-
-=head2 Compatibility with other plugins
-
-Since version 0.12, Static::Simple plays nice with other plugins.  It no
-longer short-circuits the C<prepare_action> stage as it was causing too
-many compatibility issues with other plugins.
-
-=head2 Debugging information
-
-Enable additional debugging information printed in the Catalyst log.  This
-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 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.
-
-    <Location /static>
-        SetHandler default-handler
-    </Location>
-
-Using this approach Apache will bypass any handling of these directories
-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 INTERNAL EXTENDED METHODS
-
-Static::Simple extends the following steps in the Catalyst process.
-
-=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
-performance.
-
-=head2 dispatch
-
-C<dispatch> takes the file found during C<prepare_action> and writes it
-to the output.
-
-=head2 finalize
-
-C<finalize> serves up final header information and displays any log
-messages.
-
-=head2 setup
-
-C<setup> initializes all default values.
-
-=head1 SEE ALSO
-
-L<Catalyst>, L<Catalyst::Plugin::Static>, 
-L<http://www.iana.org/assignments/media-types/>
-
-=head1 AUTHOR
-
-Andy Grundman, <andy at hybridized.org>
-
-=head1 CONTRIBUTORS
-
-Marcus Ramberg, <mramberg at cpan.org>
-Jesse Sheidlower, <jester at panix.com>
-
-=head1 THANKS
-
-The authors of Catalyst::Plugin::Static:
-
-    Sebastian Riedel
-    Christian Hansen
-    Marcus Ramberg
-
-For the include_path code from Template Toolkit:
-
-    Andy Wardley
-
-=head1 COPYRIGHT
-
-This program is free software, you can redistribute it and/or modify it under
-the same terms as Perl itself.
-
-=cut

Copied: tags/Catalyst-Plugin-Static-Simple/0.17/lib/Catalyst/Plugin/Static/Simple.pm (from rev 6390, trunk/Catalyst-Plugin-Static-Simple/lib/Catalyst/Plugin/Static/Simple.pm)
===================================================================
--- tags/Catalyst-Plugin-Static-Simple/0.17/lib/Catalyst/Plugin/Static/Simple.pm	                        (rev 0)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/lib/Catalyst/Plugin/Static/Simple.pm	2007-05-11 15:28:18 UTC (rev 6392)
@@ -0,0 +1,521 @@
+package Catalyst::Plugin::Static::Simple;
+
+use strict;
+use warnings;
+use base qw/Class::Accessor::Fast Class::Data::Inheritable/;
+use File::stat;
+use File::Spec ();
+use IO::File ();
+use MIME::Types ();
+
+our $VERSION = '0.17';
+
+__PACKAGE__->mk_accessors( qw/_static_file _static_debug_message/ );
+
+sub prepare_action {
+    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;
+        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, 1 ) ) {
+                $c->_debug_msg( 'from static directory' )
+                    if $config->{debug};
+            } else {
+                $c->_debug_msg( "404: file not found: $path" )
+                    if $config->{debug};
+                $c->res->status( 404 );
+            }
+        }
+    }
+    
+    # Does the path have an extension?
+    if ( $path =~ /.*\.(\S{1,})$/xms ) {
+        # and does it exist?
+        $c->_locate_static_file( $path );
+    }
+    
+    return $c->NEXT::ACTUAL::prepare_action(@_);
+}
+
+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 );
+        }
+        return $c->_serve_static;
+    }
+    else {
+        return $c->NEXT::ACTUAL::dispatch(@_);
+    }
+}
+
+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::ACTUAL::finalize(@_);
+}
+
+sub setup {
+    my $c = shift;
+    
+    $c->NEXT::setup(@_);
+    
+    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} ||= {};
+    $config->{ignore_extensions} ||= [ qw/tmpl tt tt2 html xhtml/ ];
+    $config->{ignore_dirs} ||= [];
+    $config->{debug} ||= $c->debug;
+    $config->{no_logs} = 1 unless defined $config->{no_logs};
+    
+    # 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;
+}
+
+# Search through all included directories for the static file
+# 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 ) ) 
+    );
+    
+    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 ($@) {
+                $c->log->error( 'Static::Simple: include_path error: ' . $@ );
+            } else {
+                unshift @ipaths, @$dpaths;
+                next DIR_CHECK;
+            }
+        } 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?
+                    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;
+                        }
+                    }
+                }
+                
+                $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;
+
+    $c->res->headers->content_type( $type );
+    $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 );
+    }
+    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" );
+        }
+    }
+    
+    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 ) = @_;
+    
+    my $config = $c->config->{static};
+    
+    if ( $full_path =~ /.*\.(\S{1,})$/xms ) {
+        my $ext = $1;
+        my $type = $config->{mime_types}{$ext} 
+            || $config->{mime_types_obj}->mimeTypeOf( $ext );
+        if ( $type ) {
+            $c->_debug_msg( "as $type" ) if $config->{debug};
+            return ( ref $type ) ? $type->type : $type;
+        }
+        else {
+            $c->_debug_msg( "as text/plain (unknown extension $ext)" )
+                if $config->{debug};
+            return 'text/plain';
+        }
+    }
+    else {
+        $c->_debug_msg( 'as text/plain (no extension)' )
+            if $config->{debug};
+        return 'text/plain';
+    }
+}
+
+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;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Catalyst::Plugin::Static::Simple - Make serving static pages painless.
+
+=head1 SYNOPSIS
+
+    use Catalyst;
+    MyApp->setup( qw/Static::Simple/ );
+    # that's it; static content is automatically served by
+    # Catalyst, though you can configure things or bypass
+    # Catalyst entirely in a production environment
+
+=head1 DESCRIPTION
+
+The Static::Simple plugin is designed to make serving static content in
+your application during development quick and easy, without requiring a
+single line of code from you.
+
+This plugin detects static files by looking at the file extension in the
+URL (such as B<.css> or B<.png> or B<.js>). The plugin uses the
+lightweight L<MIME::Types> module to map file extensions to
+IANA-registered MIME types, and will serve your static files with the
+correct MIME type directly to the browser, without being processed
+through Catalyst.
+
+Note that actions mapped to paths using periods (.) will still operate
+properly.
+
+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
+static content; for an example see L<USING WITH APACHE>, below.
+
+=head1 DEFAULT BEHAVIOR
+
+By default, Static::Simple will deliver all files having extensions
+(that is, bits of text following a period (C<.>)), I<except> files
+having the extensions C<tmpl>, C<tt>, C<tt2>, C<html>, and
+C<xhtml>. These files, and all files without extensions, will be
+processed through Catalyst. If L<MIME::Types> doesn't recognize an
+extension, it will be served as C<text/plain>.
+
+To restate: files having the extensions C<tmpl>, C<tt>, C<tt2>, C<html>,
+and C<xhtml> I<will not> be served statically by default, they will be
+processed by Catalyst. Thus if you want to use C<.html> files from
+within a Catalyst app as static files, you need to change the
+configuration of Static::Simple. Note also that files having any other
+extension I<will> be served statically, so if you're using any other
+extension for template files, you should also change the configuration.
+
+Logging of static files is turned off by default.
+
+=head1 ADVANCED CONFIGURATION
+
+Configuration is completely optional and is specified within
+C<MyApp-E<gt>config-E<gt>{static}>.  If you use any of these options,
+this module will probably feel less "simple" to you!
+
+=head2 Enabling request logging
+
+Since Catalyst 5.50, logging of static requests is turned off by
+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.
+
+=head2 Forcing directories into static mode
+
+Define a list of top-level directories beneath your 'root' directory
+that should always be served in static mode.  Regular expressions may be
+specified using C<qr//>.
+
+    MyApp->config->{static}->{dirs} = [
+        'static',
+        qr/^(images|css)/,
+    ];
+
+=head2 Including additional directories
+
+You may specify a list of directories in which to search for your static
+files. The directories will be searched in order and will return the
+first file found. Note that your root directory is B<not> automatically
+added to the search path when you specify an C<include_path>. You should
+use C<MyApp-E<gt>config-E<gt>{root}> to add it.
+
+    MyApp->config->{static}->{include_path} = [
+        '/path/to/overlay',
+        \&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
+be reported using C<die()>.  This method will be called every time a file is
+requested that appears to be a static file (i.e. it has an extension).
+
+For example:
+
+    sub incpath_generator {
+        my $c = shift;
+        
+        if ( $c->session->{customer_dir} ) {
+            return [ $c->session->{customer_dir} ];
+        } else {
+            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.
+Most important in this category are your raw template files.  By
+default, files with the extensions C<tmpl>, C<tt>, C<tt2>, C<html>, and
+C<xhtml> will be ignored by Static::Simple in the interest of security.
+If you wish to define your own extensions to ignore, use the
+C<ignore_extensions> option:
+
+    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
+the C<ignore_dirs> option.  This option contains a list of relative
+directory paths to ignore.  If using C<include_path>, the path will be
+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:
+
+    /path/to/overlay/tmpl
+    /path/to/overlay/css
+    /dynamic/path/tmpl
+    /dynamic/path/css
+    /your/app/home/root/tmpl
+    /your/app/home/root/css    
+
+=head2 Custom MIME types
+
+To override or add to the default MIME types set by the L<MIME::Types>
+module, you may enter your own extension to MIME type mapping.
+
+    MyApp->config->{static}->{mime_types} = {
+        jpg => 'image/jpg',
+        png => 'image/png',
+    };
+
+=head2 Compatibility with other plugins
+
+Since version 0.12, Static::Simple plays nice with other plugins.  It no
+longer short-circuits the C<prepare_action> stage as it was causing too
+many compatibility issues with other plugins.
+
+=head2 Debugging information
+
+Enable additional debugging information printed in the Catalyst log.  This
+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 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.
+
+    <Location /static>
+        SetHandler default-handler
+    </Location>
+
+Using this approach Apache will bypass any handling of these directories
+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.
+
+=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
+performance.
+
+=head2 dispatch
+
+C<dispatch> takes the file found during C<prepare_action> and writes it
+to the output.
+
+=head2 finalize
+
+C<finalize> serves up final header information and displays any log
+messages.
+
+=head2 setup
+
+C<setup> initializes all default values.
+
+=head1 SEE ALSO
+
+L<Catalyst>, L<Catalyst::Plugin::Static>, 
+L<http://www.iana.org/assignments/media-types/>
+
+=head1 AUTHOR
+
+Andy Grundman, <andy at hybridized.org>
+
+=head1 CONTRIBUTORS
+
+Marcus Ramberg, <mramberg at cpan.org>
+
+Jesse Sheidlower, <jester at panix.com>
+
+Guillermo Roditi, <groditi at cpan.org>
+
+=head1 THANKS
+
+The authors of Catalyst::Plugin::Static:
+
+    Sebastian Riedel
+    Christian Hansen
+    Marcus Ramberg
+
+For the include_path code from Template Toolkit:
+
+    Andy Wardley
+
+=head1 COPYRIGHT
+
+This program is free software, you can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut

Copied: tags/Catalyst-Plugin-Static-Simple/0.17/t/11serve_static.t (from rev 6390, trunk/Catalyst-Plugin-Static-Simple/t/11serve_static.t)
===================================================================
--- tags/Catalyst-Plugin-Static-Simple/0.17/t/11serve_static.t	                        (rev 0)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/t/11serve_static.t	2007-05-11 15:28:18 UTC (rev 6392)
@@ -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

Deleted: tags/Catalyst-Plugin-Static-Simple/0.17/t/lib/TestApp.pm
===================================================================
--- trunk/Catalyst-Plugin-Static-Simple/t/lib/TestApp.pm	2007-04-30 19:16:42 UTC (rev 6352)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/t/lib/TestApp.pm	2007-05-11 15:28:18 UTC (rev 6392)
@@ -1,47 +0,0 @@
-package TestApp;
-
-use strict;
-use Catalyst;
-
-our $VERSION = '0.01';
-
-TestApp->config(
-    name => 'TestApp',
-);
-
-my @plugins = qw/Static::Simple/;
-
-# load the SubRequest plugin if available
-eval { 
-    require Catalyst::Plugin::SubRequest; 
-    die unless Catalyst::Plugin::SubRequest->VERSION ge '0.08';
-};
-push @plugins, 'SubRequest' unless ($@);
-
-TestApp->setup( @plugins );
-
-sub incpath_generator {
-    my $c = shift;
-    
-    return [ $c->config->{root} . '/incpath' ];
-}
-
-sub default : Private {
-    my ( $self, $c ) = @_;
-    
-    $c->res->output( 'default' );
-}
-
-sub subtest : Local {
-    my ( $self, $c ) = @_;
-
-    $c->res->output( $c->subreq('/subtest2') );
-}
-
-sub subtest2 : Local {
-    my ( $self, $c ) = @_;
-    
-    $c->res->output( 'subtest2 ok' );
-}
-
-1;

Copied: tags/Catalyst-Plugin-Static-Simple/0.17/t/lib/TestApp.pm (from rev 6390, trunk/Catalyst-Plugin-Static-Simple/t/lib/TestApp.pm)
===================================================================
--- tags/Catalyst-Plugin-Static-Simple/0.17/t/lib/TestApp.pm	                        (rev 0)
+++ tags/Catalyst-Plugin-Static-Simple/0.17/t/lib/TestApp.pm	2007-05-11 15:28:18 UTC (rev 6392)
@@ -0,0 +1,66 @@
+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/;
+
+# load the SubRequest plugin if available
+eval { 
+    require Catalyst::Plugin::SubRequest; 
+    die unless Catalyst::Plugin::SubRequest->VERSION ge '0.08';
+};
+push @plugins, 'SubRequest' unless ($@);
+
+TestApp->setup( @plugins );
+
+sub incpath_generator {
+    my $c = shift;
+    
+    return [ $c->config->{root} . '/incpath' ];
+}
+
+sub default : Private {
+    my ( $self, $c ) = @_;
+    
+    $c->res->output( 'default' );
+}
+
+sub subtest : Local {
+    my ( $self, $c ) = @_;
+
+    $c->res->output( $c->subreq('/subtest2') );
+}
+
+sub subtest2 : Local {
+    my ( $self, $c ) = @_;
+    
+    $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;




More information about the Catalyst-commits mailing list