package Apache2::ASP::Server;
use strict;
use warnings 'all';
use Mail::Sendmail;
use encoding 'utf8';
#==============================================================================
sub new
{
my ($class, %args) = @_;
my $s = bless {LastError => undef}, $class;
return $s;
}# end new()
#==============================================================================
sub GetLastError
{
$_[0]->{LastError};
}# end GetLastError()
#==============================================================================
sub context
{
$Apache2::ASP::HTTPContext::ClassName->current;
}# end context()
#==============================================================================
# Shamelessly ripped off from Apache::ASP::Server, by Joshua Chamas,
# who shamelessly ripped it off from CGI.pm, by Lincoln D. Stein.
# :)
sub URLEncode
{
my $toencode = $_[1];
no warnings 'uninitialized';
$toencode =~ s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/esg;
$toencode;
}# end URLEncode()
#==============================================================================
sub URLDecode
{
my ($s, $todecode) = @_;
return unless defined($todecode);
$todecode =~ tr/+/ /; # pluses become spaces
$todecode =~ s/%(?:([0-9a-fA-F]{2})|u([0-9a-fA-F]{4}))/
defined($1)? chr hex($1) : _utf8_chr(hex($2))/ge;
return $todecode;
}# end URLDecode()
#==============================================================================
sub HTMLEncode
{
my ($s, $str) = @_;
no warnings 'uninitialized';
$str =~ s/&/&/g;
$str =~ s/</g;
$str =~ s/>/>/g;
$str =~ s/"/"/g;
$str =~ s/'/'/g;
return $str;
}# end HTMLEncode()
#==============================================================================
sub HTMLDecode
{
my ($s, $str) = @_;
no warnings 'uninitialized';
$str =~ s/<//g;
$str =~ s/"/"/g;
$str =~ s/&/&/g;
return $str;
}# end HTMLEncode()
#==============================================================================
sub MapPath
{
my ($s, $path) = @_;
return unless defined($path);
$s->context->config->web->www_root . $path;
}# end MapPath()
#==============================================================================
sub Mail
{
my ($s, %args) = @_;
# XXX: Base64-encode the content, and update the content-type to reflect that
# if content-type === 'text/html'.
# XXX: Consider updating this so that we can send attachments as well.
Mail::Sendmail::sendmail( %args );
}# end Mail()
#==============================================================================
sub RegisterCleanup
{
my ($s, $sub, @args) = @_;
# This works both in "testing" mode and within a live mod_perl environment.
$s->context->get_prop('r')->pool->cleanup_register( $sub, \@args );
}# end RegisterCleanup()
#==============================================================================
sub _utf8_chr
{
my ($c) = @_;
require utf8;
my $u = chr($c);
utf8::encode($u); # drop utf8 flag
return $u;
}# end _utf8_chr()
#==============================================================================
sub DESTROY
{
my $s = shift;
undef(%$s);
}# end DESTROY()
1;# return true:
=pod
=head1 NAME
Apache2::ASP::Server - Utility methods for Apache2::ASP
=head1 SYNOPSIS
my $full_path = $Server->MapPath('/index.asp');
$Server->URLEncode( 'user@email.com' );
$Server->URLDecode( 'user%40email.com' );
$Server->HTMLEncode( '
' );
$Server->HTMLDecode( '<br />' );
$Server->Mail(
To => 'user@email.com',
From => '"Friendly Name" ',
Subject => 'Hello World',
Message => "E Pluribus Unum.\n"x777
);
$Server->RegisterCleanup( sub {
my @args = @_;
...
}, @args
);
=head1 DESCRIPTION
The ASP Server object is historically a wrapper for a few utility functions that
don't belong anywhere else.
Keeping with that tradition, the Apache2::ASP Server object is a collection of
functions that don't belong anywhere else.
=head1 PUBLIC METHODS
=head2 URLEncode( $str )
Converts a string into its url-encoded equivalent. This approximates to
JavaScript's C function or L's C function.
Example:
<%= $Server->URLEncode( 'user@email.com' ) %>
Returns
user%40email.com
=head2 URLDecode( $str )
Converts a url-encoded string into its non-url-encoded equivalent. This works
the same way as JavaScript's and L's C function.
Example:
<%= $Server->URLDecode( 'user%40email.com' ) %>
Returns
user@email.com
=head2 HTMLEncode( $str )
Safely converts <, > and & into C<<>, C<>> and C<&>, respectively.
=head2 HTMLDecode( $str )
Converts C<<>, C<>> and C<&> into <, > and &, respectively.
=head2 MapPath( $relative_path )
Given a relative path, C will return the absolute path for it, under the
document root of the current website.
For example, C might return C
=head2 Mail( %args )
Sends an email message. The following arguments are required:
=over 4
=item To
The email address the message should be sent to.
=item From
The email address the message should be sent from.
=item Subject
The subject of the email.
=item Message
The content of the body.
=back
Other arguments are passed through to L.
=head2 RegisterCleanup( \&code[, @args ] )
A wrapper around L's C function. Pass in a coderef
and (optionally) arguments to be passed to that coderef, and it is executed during
the cleanup phase of the current request.
If we were doing vanilla mod_perl, you could achieve the same effect with this:
$r->pool->cleanup_register( sub { ... }, \@args );
=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
=head1 COPYRIGHT
Copyright 2008 John Drago. All rights reserved.
=head1 LICENSE
This software is Free software and is licensed under the same terms as perl itself.
=cut