[Catalyst-commits] r13837 - in
trunk/examples/CatalystAdvent/root/2010: . pen
dhoss at dev.catalyst.perl.org
dhoss at dev.catalyst.perl.org
Fri Dec 10 21:19:07 GMT 2010
Author: dhoss
Date: 2010-12-10 21:19:07 +0000 (Fri, 10 Dec 2010)
New Revision: 13837
Added:
trunk/examples/CatalystAdvent/root/2010/11.pod
Removed:
trunk/examples/CatalystAdvent/root/2010/pen/xsendfile-inflatecolumn_fs.pod
Log:
publishing davewood's article
Copied: trunk/examples/CatalystAdvent/root/2010/11.pod (from rev 13834, trunk/examples/CatalystAdvent/root/2010/pen/xsendfile-inflatecolumn_fs.pod)
===================================================================
--- trunk/examples/CatalystAdvent/root/2010/11.pod (rev 0)
+++ trunk/examples/CatalystAdvent/root/2010/11.pod 2010-12-10 21:19:07 UTC (rev 13837)
@@ -0,0 +1,144 @@
+=head1 DBIx::Class::InflateColumn::FS and X-Sendfile
+
+In this article I will explain how to elegantly store user submitted HTML code
+in the filesystem for later delivery with X-Sendfile.
+
+=head1 Storing pages
+
+We are using L<DBIx::Class::InflateColumn::FS> to store content in the filesystem.
+
+=head2 Setting up your schema result class
+
+Code:
+
+MyApp/Schema/Result/Pages.pm
+
+ __PACKAGE__->load_components(qw/InflateColumn::FS Core/);
+ __PACKAGE__->add_columns(
+ id => {
+ data_type => 'INT',
+ is_auto_increment => 1,
+ },
+ file => {
+ data_type => 'TEXT',
+ is_fs_column => 1,
+ fs_column_path => '/var/www/myapp/root/pages',
+ },
+ );
+
+=head2 Passing the content to the schema
+
+If you pass a filehandle to the C<file> column, filesystem management will be handled by
+DBIx::Class::InflateColumn::FS. So somewhere in your Controller you probably want code like this:
+
+Code:
+
+MyApp/Controller/Pages.pm
+
+ use IO::File;
+ use Carp;
+
+ sub create :Path('create') Args(0) {
+ my ($self, $c) = @_;
+
+ # user submitted html code in a forms textarea
+ # validate form with module of your choice
+ ...
+
+ my $validated_page_code = ...
+
+ # create a temp file
+ $fh = IO::File->new_tmpfile;
+ print {$fh} $validated_page_code
+ or croak 'Couldn't write to temporary file';
+ close $fh
+ or croak 'Couldn't close temporary file';
+
+ # store page
+ $c->model('DB::Pages')->create({ file => $fh });
+ }
+
+=head1 Delivering pages
+
+Now that the page is stored in our filesystem let's have a look how to
+deliver the file using X-Sendfile.
+
+X-Sendfile lets the webserver deal with delivery of static files.
+
+The X-Sendfile features is supported by Apache, Lighttpd and nginx
+(nginx is calling it X-Accel-Redirect though). Here is an Apache configuration.
+
+First, install mod_xsendfile. On Debian based systems use the package system.
+
+ aptitude install libapache2-mod-xsendfile
+
+then enable the module in your apache configuration
+
+ XSendfile On
+
+Now Apache looks for the presence of a X-Sendfile header and delivers the file
+referenced in the header.
+
+=head2 Setting the X-Sendfile header.
+
+You might want to put this code into a Role and let your Controller consume it.
+
+Code:
+
+ sub sendfile {
+ my ($self, $c, $file, $content_type) = @_;
+
+ my $engine = $ENV{CATALYST_ENGINE} || '';
+
+ # Catalyst development server
+ if ( $engine =~ /^HTTP/ ) {
+ if ( $file->stat && -f _ && -r _ ) {
+ $c->res->body( $file->openr );
+ }
+ }
+
+ # Deployment with FastCGI
+ elsif ( $engine eq 'FastCGI' ) {
+ $c->res->header('X-Sendfile', $file);
+ $c->res->body("foo"); # MASSIVE HACK: bypass RenderView
+ }
+
+ # unknown engine
+ else {
+ die "Unknown engine: " . $engine;
+ }
+
+ $c->res->content_type($content_type);
+ $c->res->content_length( $file->stat->size );
+ $c->res->status(200);
+ $c->detach;
+ }
+
+=head2 the 'send' action
+
+Also in your controller add a send action that
+sets the X-Sendfile header for the requested file.
+
+Code:
+
+ sub send : Path('send') Args(1) {
+ my ( $self, $c, $page_id ) = @_;
+
+ # get the requested page from your model
+ my $page = $c->model('DB::Pages')->find($page_id);
+
+ # display error page if requested page doesn't exist
+ $c->detach('/error404') unless $page;
+
+ # set X-Sendfile header
+ $self->sendfile($c, $page->file, 'text/html');
+ }
+
+=head1 Further Reading
+
+This article is based on the Catayst Cookbook entry
+L<Controller With Fileupload|http://wiki.catalystframework.org/wiki/wikicookbook/controllerwithfileupload>.
+
+=head1 AUTHOR
+
+davewood: David Schmidt <davewood at gmx.at>
Deleted: trunk/examples/CatalystAdvent/root/2010/pen/xsendfile-inflatecolumn_fs.pod
===================================================================
--- trunk/examples/CatalystAdvent/root/2010/pen/xsendfile-inflatecolumn_fs.pod 2010-12-10 18:16:41 UTC (rev 13836)
+++ trunk/examples/CatalystAdvent/root/2010/pen/xsendfile-inflatecolumn_fs.pod 2010-12-10 21:19:07 UTC (rev 13837)
@@ -1,144 +0,0 @@
-=head1 DBIx::Class::InflateColumn::FS and X-Sendfile
-
-In this article I will explain how to elegantly store user submitted HTML code
-in the filesystem for later delivery with X-Sendfile.
-
-=head1 Storing pages
-
-We are using L<DBIx::Class::InflateColumn::FS> to store content in the filesystem.
-
-=head2 Setting up your schema result class
-
-Code:
-
-MyApp/Schema/Result/Pages.pm
-
- __PACKAGE__->load_components(qw/InflateColumn::FS Core/);
- __PACKAGE__->add_columns(
- id => {
- data_type => 'INT',
- is_auto_increment => 1,
- },
- file => {
- data_type => 'TEXT',
- is_fs_column => 1,
- fs_column_path => '/var/www/myapp/root/pages',
- },
- );
-
-=head2 Passing the content to the schema
-
-If you pass a filehandle to the C<file> column, filesystem management will be handled by
-DBIx::Class::InflateColumn::FS. So somewhere in your Controller you probably want code like this:
-
-Code:
-
-MyApp/Controller/Pages.pm
-
- use IO::File;
- use Carp;
-
- sub create :Path('create') Args(0) {
- my ($self, $c) = @_;
-
- # user submitted html code in a forms textarea
- # validate form with module of your choice
- ...
-
- my $validated_page_code = ...
-
- # create a temp file
- $fh = IO::File->new_tmpfile;
- print {$fh} $validated_page_code
- or croak 'Couldn't write to temporary file';
- close $fh
- or croak 'Couldn't close temporary file';
-
- # store page
- $c->model('DB::Pages')->create({ file => $fh });
- }
-
-=head1 Delivering pages
-
-Now that the page is stored in our filesystem let's have a look how to
-deliver the file using X-Sendfile.
-
-X-Sendfile lets the webserver deal with delivery of static files.
-
-The X-Sendfile features is supported by Apache, Lighttpd and nginx
-(nginx is calling it X-Accel-Redirect though). Here is an Apache configuration.
-
-First, install mod_xsendfile. On Debian based systems use the package system.
-
- aptitude install libapache2-mod-xsendfile
-
-then enable the module in your apache configuration
-
- XSendfile On
-
-Now Apache looks for the presence of a X-Sendfile header and delivers the file
-referenced in the header.
-
-=head2 Setting the X-Sendfile header.
-
-You might want to put this code into a Role and let your Controller consume it.
-
-Code:
-
- sub sendfile {
- my ($self, $c, $file, $content_type) = @_;
-
- my $engine = $ENV{CATALYST_ENGINE} || '';
-
- # Catalyst development server
- if ( $engine =~ /^HTTP/ ) {
- if ( $file->stat && -f _ && -r _ ) {
- $c->res->body( $file->openr );
- }
- }
-
- # Deployment with FastCGI
- elsif ( $engine eq 'FastCGI' ) {
- $c->res->header('X-Sendfile', $file);
- $c->res->body("foo"); # MASSIVE HACK: bypass RenderView
- }
-
- # unknown engine
- else {
- die "Unknown engine: " . $engine;
- }
-
- $c->res->content_type($content_type);
- $c->res->content_length( $file->stat->size );
- $c->res->status(200);
- $c->detach;
- }
-
-=head2 the 'send' action
-
-Also in your controller add a send action that
-sets the X-Sendfile header for the requested file.
-
-Code:
-
- sub send : Path('send') Args(1) {
- my ( $self, $c, $page_id ) = @_;
-
- # get the requested page from your model
- my $page = $c->model('DB::Pages')->find($page_id);
-
- # display error page if requested page doesn't exist
- $c->detach('/error404') unless $page;
-
- # set X-Sendfile header
- $self->sendfile($c, $page->file, 'text/html');
- }
-
-=head1 Further Reading
-
-This article is based on the Catayst Cookbook entry
-L<Controller With Fileupload|http://wiki.catalystframework.org/wiki/wikicookbook/controllerwithfileupload>.
-
-=head1 AUTHOR
-
-davewood: David Schmidt <davewood at gmx.at>
More information about the Catalyst-commits
mailing list