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.

