Perl Scripts Seem to be Caching?
- by Ben Liyanage
I'm running a perl script via mod_perl with Apache. I am trying to parse parameters in a restful fashion (aka GET www.domain.com/rest.pl/Object/ID).
If I specify the ID like this: GET www.domain.com/rest.pl/Object/1234 I will get object 1234 back as a result as expected.
However, if I specify an incorrect hacked url like this GET www.domain.com/rest.pl/Object/123 I will also get back object 1234.
I am pretty sure that the issue in this question is happening so I packaged up my method and invoked it from my core script out of the package. Even after that I am still seeing the threads returning seemingly cached data.
One of the recommendations in the aforementioned article is to replace my with our. My impression from reading up on our vs my was that our is global and my is local. My assumption is the the local variable gets reinitialized each time. That said, like in my code example below I am resetting the variables each time with new values.
Apache Perl Configuration is set up like this:
PerlModule ModPerl::Registry
<Directory /var/www/html/perl/>
SetHandler perl-script
PerlHandler ModPerl::Registry
Options +ExecCGI
</Directory>
Here is the perl script getting invoked directly:
#!/usr/bin/perl -w
use strict;
use warnings;
use Rest;
Rest::init();
Here is my package Rest. This file contains various functions for handling the rest requests.
#!/usr/bin/perl -w
package Rest;
use strict;
# Other useful packages declared here.
our @EXPORT = qw( init );
our $q = CGI->new;
sub GET($$) {
my ($path, $code) = @_;
return unless $q->request_method eq 'GET' or $q->request_method eq 'HEAD';
return unless $q->path_info =~ $path;
$code->();
exit;
}
sub init()
{
eval {
GET qr{^/ZonesByCustomer/(.+)$} => sub {
Rest::Zone->ZonesByCustomer($1);
}
}
}
# packages must return 1
1;
As a side note, I don't completely understand how this eval statement works, or what string is getting parsed by the qr command. This script was largely taken from this example for setting up a rest based web service with perl. I suspect it is getting pulled from that magical $_ variable, but I'm not sure if it is, or what it is getting populated with (clearly the query string or url, but it only seems to be part of it?).
Here is my package Rest::Zone, which will contain the meat of the functional actions. I'm leaving out the specifics of how I'm manipulating the data because it is working and leaving this as an abstract stub.
#!/usr/bin/perl -w
package Rest::Zone;
sub ZonesByCustomer($)
{
my ($className, $ObjectID) = @_;
my $q = CGI->new;
print $q->header(-status=>200, -type=>'text/xml',expires => 'now', -Cache_control => 'no-cache', -Pragma => 'no-cache');
my $objectXML = "<xml><object>" . $ObjectID . "</object></xml>";
print $objectXML;
}
# packages must return 1
1;
What is going on here? Why do I keep getting stale or cached values?