Apache-Voodoo
view release on metacpan or search on metacpan
lib/Apache/Voodoo/Debug/Handler.pm view on Meta::CPAN
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);
};
use Data::Dumper;
warn Dumper $@;
if ($@) {
return $self->display_host_error("$@");
}
if (ref($return) eq "HASH") {
$self->{mp}->content_type("application/json");
$self->{mp}->print($self->{json}->to_json($return));
}
else {
$self->{mp}->content_type("text/plain");
$self->{mp}->print($return);
}
$self->{mp}->flush();
return $self->{mp}->ok;
}
# not a request we handle
return $self->{mp}->declined;
( run in 1.691 second using v1.01-cache-2.11-cpan-39bf76dae61 )