blob: 80c87de81b97196b0ae1859e3d53b06ffa52734c [file] [log] [blame]
package Apache::Debug;
use Cwd 'fastcwd';
use vars qw($VERSION);
$VERSION = "1.61";
sub import {
local $^W = 0;
shift;
my(%args) = @_;
return unless exists $args{level};
print STDERR "Apache::Debug: [@_]\n";
$Apache::Registry::Debug = $args{level};
$^M = 'a' x (1<<16);
require Carp;
$SIG{__DIE__} = \&Carp::confess;
}
#from HTTP::Status
my %StatusCode = (
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Moved Temporarily',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Large',
415 => 'Unsupported Media Type',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
);
sub dump {
my($r, $status) = (shift,shift);
my $srv = $r->server;
my $conn = $r->connection;
my %headers = $r->headers_in;
my $host = $r->get_remote_host;
my $cwd = fastcwd;
$r->status($status);
$r->content_type("text/html");
$r->content_language("en");
$r->no_cache(1);
$r->header_out("X-Debug-Version" => q$Id$);
$r->send_http_header;
return 0 if $r->header_only; # should not generate a body
my $title = "$status $StatusCode{$status}";
$r->write_client(join("\n", "<html>",
"<head><title>$title</title></head>",
"<body>", "<h3>$title</h3>", @_,
"<pre>", ($@ ? "$@\n" : ""), "cwd=$cwd\n"));
for (
qw(
method uri protocol path_info filename
allow_options
)
)
{
$r->print(sprintf "<b>\$r->%-17s</b> : %s\n", $_, $r->$_() );
}
for (
qw(
server_admin
server_hostname
port
)
)
{
$r->print(sprintf "<b>\$s->%-17s</b> : %s\n", $_, $srv->$_() );
}
for (
qw(
remote_host
remote_ip
remote_logname
user
auth_type
)
)
{
$r->print(sprintf "<b>\$c->%-17s</b> : %s\n", $_, $conn->$_() );
}
my $args = $r->args;
my %args = $r->args;
my %in = $r->content;
$r->print(
"\n<b>scalar \$r->args :</b> $args\n",
"\n<b>\$r->args:</b>\n",
(map { " $_ = $args{$_}\n" } sort keys %args),
"\n<b>\$r->content:</b>\n",
(map { " $_ = $in{$_}\n" } sort keys %in),
"\n<b>\$r->headers_in:</b>\n",
(map { sprintf " %-12s = %s\n", $_, $headers{$_} } sort keys %headers),
);
$r->print("</pre>\n</body></html>\n");
return 0; #need to give a return status
}
1;
__END__
=head1 NAME
Apache::Debug - Utilities for debugging embedded perl code
=head1 SYNOPSIS
use Apache::Debug ();
Apache::Debug::dump($r, SERVER_ERROR, "Uh Oh!");
=head1 DESCRIPTION
This module sends what may be helpful debugging info to the client
rather that the error log.