package Apache2::ASP::ModPerl;
use strict;
use warnings 'all';
use APR::Table ();
use APR::Socket ();
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Connection ();
use Apache2::RequestUtil ();
use Apache2::ASP::HTTPContext ();
use CGI();
use Apache2::ASP::UploadHook;
local $Apache2::ASP::HTTPContext::ClassName = 'Apache2::ASP::HTTPContext';
#==============================================================================
sub handler : method
{
my ($class, $r) = @_;
my $context = Apache2::ASP::HTTPContext->new();
if( uc($ENV{REQUEST_METHOD}) eq 'POST' && lc($ENV{CONTENT_TYPE}) =~ m@multipart/form-data@ )
{
$context->_load_class( $context->config->web->handler_resolver );
my $handler_class = $context->config->web->handler_resolver->new()->resolve_request_handler( $r->uri );
$context->_load_class( $handler_class );
unless( $ENV{QUERY_STRING} =~ m/mode\=[a-z0-9_]+/ )
{
die "All UploadHandlers require a querystring parameter 'mode' to be specified when uploading!";
}# end unless()
eval {
my $cgi = CGI->new( $r );
my %args = map { my ($k,$v) = split /\=/, $_; ( $k => $v ) } split /&/, $ENV{QUERY_STRING};
map { $cgi->param($_ => $args{$_}) } keys %args;
$context->setup_request( $r, $cgi);
$handler_class->init_asp_objects( $context );
my $called_upload_end = 0;
foreach my $field ( $cgi->param )
{
my $ifh = $cgi->param($field);
next unless my $info = $cgi->uploadInfo( $ifh );
my ($filename) = $info->{'Content-Disposition'} =~ m/filename\="?(.*?)"?$/;
$info->{filename_only} = $filename;
my $tmpfile = '/tmp/' . rand();
open my $ofh, '>', $tmpfile
or die "Cannot open '$tmpfile' for writing: $!";
my $buffer;
while( my $bytesread = read( $ifh , $buffer , 1024 ) )
{
print $ofh $buffer;
}# end while()
close($ofh);
$ENV{filename} = $tmpfile;
$ENV{download_file} = $filename;
my $Upload = Apache2::ASP::UploadHookArgs->new(
upload => $info,
percent_complete => 100,
elapsed_time => 1,
total_expected_time => 1,
time_remaining => 0,
length_received => $ENV{CONTENT_LENGTH},
data => undef,
%$info,
);
my $start_result = $handler_class->upload_start( $context, $Upload )
or last;
$handler_class->upload_end( $context, $Upload );
$called_upload_end++;
}# end foreach()
$handler_class->upload_end( $context, { } )
unless $called_upload_end;
$context->execute;
};
warn $@ if $@;
return $r->status =~ m/^2/ ? 0 : $r->status;
}
else
{
eval {
my $cgi = CGI->new( $r );
$context->setup_request( $r, $cgi );
$context->execute;
};
warn $@ if $@;
return 500 if $@;
return $r->status =~ m/^2/ ? 0 : $r->status;
}# end if()
}# end handler()
1;# return true:
=pod
=head1 NAME
Apache2::ASP::ModPerl - mod_perl2 PerlResponseHandler for Apache2::ASP
=head1 SYNOPSIS
In your httpd.conf
# Needed for file uploads to work properly:
LoadModule apreq_module modules/mod_apreq2.so
# Load up some important modules:
PerlModule DBI
PerlModule DBD::mysql
PerlModule Apache2::ASP::ModPerl
# Admin website:
ServerName mysite.com
ServerAlias www.mysite.com
DocumentRoot /usr/local/projects/mysite.com/htdocs
# Set the directory index:
DirectoryIndex index.asp
# All *.asp files are handled by Apache2::ASP::ModPerl
SetHandler perl-script
PerlResponseHandler Apache2::ASP::ModPerl
# !IMPORTANT! Prevent anyone from viewing your GlobalASA.pm
Order allow,deny
Deny from all
# All requests to /handlers/* will be handled by their respective handler:
SetHandler perl-script
PerlResponseHandler Apache2::ASP::ModPerl
=head1 DESCRIPTION
C provides a mod_perl2 PerlResponseHandler interface to
L.
Under normal circumstances, all you have to do is configure it and forget about it.
=head1 BUGS
It's possible that some bugs have found their way into this release.
Use RT L to submit bug reports.
=head1 HOMEPAGE
Please visit the Apache2::ASP homepage at L to see examples
of Apache2::ASP in action.
=head1 AUTHOR
John Drago L
=head1 COPYRIGHT AND LICENSE
Copyright 2007 John Drago, All rights reserved.
This software is free software. It may be used and distributed under the
same terms as Perl itself.
=cut