Mischa POSLAWSKY

NAME

PLP::HowTo - Some examples of common web things in PLP.

HOW TO...

Additional Perl functionality is often available in modules. All of the modules used in this document are available (for free) at CPAN: http://search.cpan.org/

 <: 
     BEGIN {
         use CGI::Cookie;
         AddCookie(
             CGI::Cookie->new(
                 -name => 'ID',
                 -value => 123456,
                 -domain => 'foo.com',
                 -path => '/'
             )->as_string
         );
     }
 :>
 Your user ID is <:= $cookie{ID} :>

set a header

 <:
     BEGIN {
         $header{Content_Type} = 'text/plain';
     }
 :>

use a database

Use DBI, and alternatively, one of the many simplifying modules. Drivers for DBI are in the DBD:: namespace. DBI loads the driver automatically, but it has to be available. If you need a fast full-featured file-base database, use DBD::SQLite, it's the instant database :).

 <:
     use DBIx::Simple; # and read its documentation for examples.
 :>

allow a user to upload a file

Use CGI.pm, which can be used with CGI::Upload to make things easier

 <:
     use CGI;         # and don't use %post in your PLP document.
     use CGI::Upload; # and read its documentation for examples.
     my $cgi = CGI->new;
     my $upload = CGI::Upload->new($cgi);
     ...
 :>

download a file into a variable

 <:
     use LWP::Simple;
     my $page = get 'http://foo.com/bar.html';
 :>

implement basic authentication

This only works with PLP under mod_perl. For CGI installations, it's useless.

 <:
     use MIME::Base64;

     BEGIN {
         my $r = Apache->request;

         my ($type, $login) = split / /, $r->header_in('Authorization');
         my ($user, $pass) = split /:/, decode_base64 $login, 2;

         unless ($user eq 'foo' and $pass eq 'bar') {
             $header{Status} = '401 Authorization Required';
             $header{WWW_Authenticate} = 'Basic realm="Top secret :)"';
             print '<h1>Authorization Required</h1>';
             exit;
         }
     }
 :>

(It is possible to use something similar with CGI, but it's not easy. Headers are communicated to your script via %ENV, and having credentials in there would be insecure, so Apache removes them. To get $ENV{HTTP_AUTHORIZATION}, you need to recompile Apache with -DSECURITY_HOLE_PASS_AUTHORIZATION, or use mod_rewrite to set the environment variable. Short answer: just use mod_perl.)

FEEDBACK

If you have good, simple examples of how to do common things with PLP, please send them! <perl@shiar.org>