Hi, I was hoping to get a bit of help on how to send the proper HTTP headers using Mod_Perl. We create Perl scripts and then ship them out to our clients for them to run on their servers. The script should work on regular CGI and Mod_Perl if they have it. Things have worked fine so far. But now Mod_Perl 2.0 is starting to be installed on servers throughout the world and I need to modify my script so that it will work with it also. I only use Mod_Perl to speed up regular CGI using “registry”.
I have a main.pl file that “requires” a helper.pl file. In the helper.pl I have the code that produces the HTTP header. It is in the helper.pl because both main.pl and main2.pl need it.
My current code looks something like this:
sub PrintHeader { my $strOut = ""; my $blnModPerl = 0; my $intModPerlVersion = 0; my $strDefaultContentType = "";
$strDefaultContentType .= "Content-type: text/html\r\n\r\n";
if (exists($ENV{'MOD_PERL'}) && defined($ENV{'MOD_PERL'})) { $blnModPerl = 1;
$intModPerlVersion = $ENV{'MOD_PERL'};
# Change mod_perl/1.XX to 1.X $intModPerlVersion =~ s/mod_perl\/(\d\.\d)(.*?)$/$1/i; }
if ($ENV{'PERL_SEND_HEADER'} || ($blnModPerl == 0)) { $strOut = $strDefaultContentType; } else { my $r = Apache->request;
$r->content_type('text/html');
#Only call send_http_header for mod_perl versions prior to (1.9) in the 1.26 series #Remember to update this in admin.pl too if ($intModPerlVersion < 1.9) { $r->send_http_header; } }
$authlib::blnPrintedHeaders = 1;
return $strOut; }
I find that this breaks under some versions of Mod_Perl 2.0. I’m working with two older versions: 1.99_07-dev and 1.99_12 both on Linux machines.
My confusion is how to send the proper 2.0 header. In my in-house version Apache->request; does not seem to work. The 2.0 documentation says use Apache2::RequestUtil but that does not work either. My clients version however works with Apache->request and I’m confused as to why.
The bottom line is I want to have a function like the one above that will work for CGI, mod_perl 1.0 and mod_perl 2.0. I’d like this function to be in a common library (helper.pl) so that main1.pl and main2.pl can use it.
From reading the documentation I realize that there is a function called “handler()” and that you can get a hold of $r somehow. So I tried it out and came up with something like this:
use strict;
my $ModPerlObj = @_[0];
main::main();
package main;
sub main { authlib::Initialize($ModPerlObj); }
This seems to work because as I understand it Mod_Perl wraps up the contents of main.pl and places it inside a function called “handler( )”. “handler( )” then receives an Apache Object. So I’m getting it using @_[0] and then passing it into my function.
Is this bad practice? Any “cons” to doing it this way?
I just want a simple way to create the header.
Please help.
Thanks,
Justin
|
- Mod_Perl 2.0 Header question Justin Luster
- Re: Mod_Perl 2.0 Header question Philip M. Gollucci
- RE: Mod_Perl 2.0 Header question Justin Luster