Perl Scripts Seem to be Caching?
Posted
by
Ben Liyanage
on Stack Overflow
See other posts from Stack Overflow
or by Ben Liyanage
Published on 2012-06-15T20:37:48Z
Indexed on
2012/06/19
15:16 UTC
Read the original article
Hit count: 924
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?
© Stack Overflow or respective owner