Apache-Voodoo
view release on metacpan or search on metacpan
lib/Apache/Voodoo/Debug/Handler.pm view on Meta::CPAN
################################################################################
#
# Apache::Voodoo::Debug::Handler
#
# Handles servicing debugging information requests
#
################################################################################
package Apache::Voodoo::Debug::Handler;
$VERSION = "3.0200";
use strict;
use warnings;
use DBI;
use Time::HiRes;
use JSON::DWIW;
use Apache::Voodoo::MP;
use Apache::Voodoo::Constants;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
$self->{mp} = Apache::Voodoo::MP->new();
$self->{constants} = Apache::Voodoo::Constants->new();
$self->{debug_root} = $self->{constants}->debug_path();
warn "Voodoo Debugging Handler Starting...\n";
$self->{template_dir} = $INC{"Apache/Voodoo/Debug/Handler.pm"};
$self->{template_dir} =~ s/Handler.pm$/html/;
$self->{handlers} = {
map { $_ => 'handle_'.$_ }
('profile','debug','return_data','session','template_conf','parameters','request')
};
$self->{static_files} = {
"debug.css" => "text/css",
"debug.js" => "application/x-javascript",
"debug.png" => "image/png",
"error.png" => "image/png",
"exception.png" => "image/png",
"info.png" => "image/png",
"minus.png" => "image/png",
"plus.png" => "image/png",
"spinner.gif" => "image/gif",
"table.png" => "image/png",
"trace.png" => "image/png",
"warn.png" => "image/png"
};
$self->{json} = JSON::DWIW->new({bad_char_policy => 'convert', pretty => 1});;
return $self;
}
sub handler {
my $self = shift;
my $r = shift;
$self->{mp}->set_request($r);
# holds all vars associated with this page processing request
my $uri = $self->{mp}->uri();
$uri =~ s/^$self->{debug_root}//;
$uri =~ s/^\///;
if (defined($self->{static_files}->{$uri})) {
# request for one of the static files.
my $file = File::Spec->catfile($self->{template_dir},$uri);
my $mtime = (stat($file))[9];
# Handle "if not modified since" requests.
$r->update_mtime($mtime);
$r->set_last_modified;
$r->meets_conditions;
my $rc = $self->{mp}->if_modified_since($mtime);
return $rc unless $rc == $self->{mp}->ok;
# set the content type
$self->{mp}->content_type($self->{static_files}->{$uri});
# tell apache to send the underlying file
$r->sendfile($file);
return $self->{mp}->ok;
}
elsif (defined($self->{handlers}->{$uri})) {
# request for an operation
my $method = $self->{handlers}->{$uri};
# parse the params
my $params = $self->{mp}->parse_params(1);
unless (ref($params)) {
# something went boom
return $self->display_host_error($params);
}
# connect to the debugging database
my $dbh = DBI->connect_cached(@{$self->{constants}->debug_dbd()});
unless ($dbh) {
return $self->display_host_error("Can't connect to debugging database: ".DBI->errstr);
}
my $return;
eval {
$return = $self->$method($dbh,$params);
( run in 0.741 second using v1.01-cache-2.11-cpan-df04353d9ac )