Apache-XPP
view release on metacpan or search on metacpan
lib/Apache/XPP.pm view on Meta::CPAN
} # END method returnrun
=item C<load> ( $filename )
Returns the code specified by $filename. If $filename begins with a url specifier
(e.g. http://), LWP::UserAgent will be used to retrieve the file. If $filename
begins with a '/', it will be treated as a rooted filename. Otherwise the filename
will be as a file relative to XPPIncludeDir
=cut
sub load {
my $self = shift;
my $filename = shift;
my $counter = shift; # don't recurse
warn "xpp: loading source ($filename)" . ($debuglines ? '' : "\n") if ($debug);
if ((substr($filename,0,1) eq '/') or ((substr($filename,0,2) eq './') and ($counter))) {
my $fh = new FileHandle;
warn "xpp:\tattempting to load $filename" . ($debuglines ? '' : "\n") if ($debug);
# if (($filename =~ m{^(/[/\-\w\.]+)$}) && ($fh->open($1))) {
if ($fh->open($filename)) {
local($/) = undef;
return <$fh>;
} else {
warn "xpp:\tfailed to load file $filename ($!)" . ($debuglines ? '' : "\n");
return undef;
}
} elsif ($filename =~ m{^(?:.+)?://(?:.+)$}) {
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( 'GET', $filename );
my $res = $ua->request( $req );
warn "xpp:\tattempting to load $filename from LWP::UserAgent" . ($debuglines ? '' : "\n") if ($debug);
if ($res->is_success) {
return $res->content;
} else {
warn "xpp:\tfailed to load file $filename ($!)" . ($debuglines ? '' : "\n");
return undef;
}
} else {
my $qualified = $self->qualify( $filename );
warn "xpp:\tqualifying filename, and attempting to load '${qualified}'" . ($debuglines ? '' : "\n") if ($debug);
return $self->load( $qualified, 1 ) unless ($counter);
return undef;
}
} # END method load
sub mtime {
my $self = shift;
my $filename = ref($self) ? $self->filename : shift;
my $counter = shift;
warn "xpp: checking mtime of file ($filename)" . ($debuglines ? '' : "\n") if ($debug);
if (substr($filename,0,1) eq '/') {
my $mtime = undef;
unless (-f $filename) {
return undef;
}
my $st = stat($filename); # using File::stat
if (ref($st) && $st->can('mtime')) {
return $st->mtime;
} else {
warn "xpp:\tcannot stat file ($filename): $!" . ($debuglines ? '' : "\n") if ($debug);
return undef;
}
} elsif ($filename =~ m{^((?:.+)?://(?:.+))$}) {
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( 'GET', $filename );
my $res = $ua->request( $req );
if (my $headers = $res->headers) {
return $headers->last_modified;
} else {
warn "xpp:\tfailed to get mtime for url ($!)" . ($debuglines ? '' : "\n") if ($debug);
return undef;
}
} else {
warn "xpp:\tattempting to qualify filename, and mtime again '${filename}'" . ($debuglines ? '' : "\n") if ($debug);
return $self->mtime( $self->qualify( $filename ), 1 ) unless ($counter);
return undef;
}
} # END method mtime
=item C<qualify> ( $filename )
Qualifies the passed name to a fully rooted filename by using either C<incdir> or C<docroot>.
=cut
sub qualify {
my $self = shift;
my $filename = shift;
carp "xpp: qualifying filename ($filename)" . ($debuglines ? '' : "\n") if ($debug);
if (substr($filename,0,1) eq '/') {
warn "xpp:\tqualifying document rooted file" . ($debuglines ? '' : "\n") if ($debug >= 2);
if ($filename =~ m{^(/[/\-\w\.]+)$}) {
return join('', $self->docroot, $1);
}
} elsif ($filename =~ m{^((?:.+)?://(?:.+))$}) {
warn "xpp:\tassuming URL is already qualified" . ($debuglines ? '' : "\n") if ($debug >= 2);
return $1;
} else {
warn "xpp:\tqualifying include rooted file" . ($debuglines ? '' : "\n") if ($debug >= 2);
warn "xpp:\tfilename: $filename" . ($debuglines ? '' : "\n") if ($debug >= 2);;
if ($filename =~ m{^([/\-\w\.]+)$}) {
my $r = $self->r();
my $incdir = $self->incdir($r);
return ($incdir) ? join('/', $incdir, $1) : $1;
}
}
warn "xpp: qualify failed on filename '$filename'!" . ($debuglines ? '' : "\n") if ($debug);
return undef;
} # END method qualify
=item C<incdir> ( )
Returns the include directory from which C<include> and C<xinclude> will retrieve source
( run in 1.305 second using v1.01-cache-2.11-cpan-5a3173703d6 )