package CGI::Lazy::Utility::Debug;
use strict;
use warnings;
use Data::Dumper;
#-------------------------------------------------------------------------------------------------------------------------------
sub cookie {
my $self = shift;
my $q = $self->q;
print $q->header,
$q->start_html({-title => 'CGI Test Page'}),
$q->h1('Cookies'),
$q->table($q->th('Param'), $q->th('Value'),
map {
$q->TR($q->th({-style => "text-align:center"}, $_), $q->td({-style => "text-align:center"}, $q->cookie($_)))
} $q->cookie()
);
}
#-------------------------------------------------------------------------------------------------------------------------------
sub config {
my $self = shift;
return $self->q->config;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub dump {
my $self = shift;
my $fulloutput = "
\n";
foreach my $thing (@_) {
if (ref $thing) {
my $output = Dumper($thing);
$output =~ s/\n/
/g;
$output =~ s/ / /g;
$output =~ s/\t/   /g;
$fulloutput .= $output;
} else {
$fulloutput .= $thing;
}
}
$fulloutput .= "\n
";
return $fulloutput;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub edump {
my $self = shift;
my $filename = $self->config->debugfile;
$filename = 'CGILazy.log' unless $filename;
open OF, ">> /tmp/$filename" or $self->q->errorHandler->couldntOpenDebugFile($filename, $!);
local $\=$/;
print OF '-'x20 . $self->timestamp() . '-'x20;
foreach my $thing (@_) {
if (ref $thing) {
print OF Dumper($thing);
} else {
print OF $thing;
}
}
print OF '-'x40;
print OF "\n\n";
close OF;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub edumpreplace {
my $self = shift;
my $filename = $self->config->debugfile;
$filename = 'CGILazy.log' unless $filename;
open OF, ">> /tmp/$filename" or $self->q->errorHandler->couldntOpenDebugFile($filename, $!);
local $\=$/;
print OF '-'x20 . $self->timestamp() . '-'x20;
foreach my $thing (@_) {
if (ref $thing) {
print OF Dumper($thing);
} else {
print OF $thing;
}
}
print OF '-'x40;
print OF "\n\n";
close OF;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub eparam {
my $self = shift;
my $q = $self->q;
my @list = $q->param();
my %param;
foreach (@list) {
my @values = $q->param($_);
$param{$_} = \@values;
}
my $filename = $self->config->debugfile;
$filename = 'CGILazy.log' unless $filename;
open OF, ">> /tmp/$filename" or $self->q->errorHandler->couldntOpenDebugFile($filename, $!);
local $\=$/;
print OF '-'x20 . $self->timestamp() . '-'x20;
foreach my $key (keys %param) {
foreach (@{$param{$key}}) {
print OF "$key \t => \t $_";
}
}
foreach my $thing (@_) {
if (ref $thing) {
print OF Dumper($thing);
} else {
print OF $thing;
}
}
print OF '-'x40;
print OF "\n\n";
close OF;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub param {
my $self = shift;
my $q = $self->q;
my @list = $q->param();
my %param;
foreach (@list) {
my @values = $q->param($_);
$param{$_} = \@values;
}
my $fulloutput;
$fulloutput .= $q->div({-id => 'debug'},
$q->start_html({-title => 'CGI Test Page'}),
$q->h1('CGI Parameters'),
$q->table({-border => 1}, $q->th('Param'), $q->th('Value'),
map { my $name = $_;
map { $q->TR($q->th({-style => "text-align:center"}, $name), $q->td({-style => "text-align:center"}, $_))} @{$param{$name}};
} keys %param
)
);
foreach my $thing (@_) {
if (ref $thing) {
my $output = Dumper($thing);
$output =~ s/\n/
/g;
$output =~ s/ / /g;
$output =~ s/\t/   /g;
$fulloutput .= $output;
} else {
$fulloutput .= $thing;
}
}
return $fulloutput;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub env {
my $self = shift;
my $q = $self->q;
my %env_info = (
SERVER_SOFTWARE => "the server software",
SERVER_NAME => "the server hostname or IP address",
GATEWAY_INTERFACE => "the CGI specification revision",
SERVER_PROTOCOL => "the server protocol name",
SERVER_PORT => "the port number for the server",
REQUEST_METHOD => "the HTTP request method",
PATH_INFO => "the extra path info",
PATH_TRANSLATED => "the extra path info translated",
DOCUMENT_ROOT => "the server document root directory",
SCRIPT_NAME => "the script name",
QUERY_STRING => "the query string",
REMOTE_HOST => "the hostname of the client",
REMOTE_ADDR => "the IP address of the client",
AUTH_TYPE => "the authentication method",
REMOTE_USER => "the authenticated username",
REMOTE_IDENT => "the remote user is (RFC 931): ",
CONTENT_TYPE => "the media type of the data",
CONTENT_LENGTH => "the length of the request body",
HTTP_ACCEPT => "the media types the client acccepts",
HTTP_USER_AGENT => "the browser the client is using",
HTTP_REFERER => "the URL of the feferring page",
HTTP_COOKIE => "The cookie(s) the client sent"
);
# Add additional variables defined by web server or browser
foreach my $name (keys %ENV) {
$env_info{$name} = "an extra variable provided by this server"
unless exists $env_info{$name};
}
my $fulloutput;
$fulloutput .= $q->div({-id => 'debug'}, $q->start_html({-title => 'A List of Envirornment Variables'}),
$q->h1('CGI Enviornment Variables'),
$q->table({-border => 1},
$q->Tr($q->th('Variable Name'), $q->th('Description'), $q->th('Value')),
map { $q->Tr($q->td($q->b($_)),$q->td($env_info{$_}), $q->i($q->td(($ENV{$_} || 'Not Defined')))) }
sort keys %env_info,
)
);
return $fulloutput;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub q {
my $self = shift;
return $self->{_q};
}
#-------------------------------------------------------------------------------------------------------------------------------
sub new {
my $class = shift;
my $q = shift;
my $self = {_q => $q};
return bless $self, $class;
}
#-------------------------------------------------------------------------------------------------------------------------------
sub timestamp {
my ($sec, $min, $hour, $mday, $mon, $year) = (localtime(time))[0..5];
$year += 1900;
my $seconds = sprintf("%02d", $sec);
my $minutes = sprintf("%02d", $min);
my $hours = sprintf("%02d", $hour);
my $day = sprintf("%02d", $mday);
my %monthname = (
0=>'Jan',
1=>'Feb',
2=>'Mar',
3=>'Apr',
4=>'May',
5=>'Jun',
6=>'Jul',
7=>'Aug',
8=>'Sep',
9=>'Oct',
10=>'Nov',
11=>'Dec',
);
my $monthname = $monthname{$mon};
return "$year-$monthname-$day-$hours:$minutes:$seconds";
}
1
__END__
=head1 LEGAL
#===========================================================================
Copyright (C) 2008 by Nik Ogura. All rights reserved.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
Bug reports and comments to nik.ogura@gmail.com.
#===========================================================================
=head1 NAME
CGI::Lazy::Utility::Debug
=head1 DESCRIPTION
CGI::Lazy::Utility::Debug is a bunch of useful CGI debugging functions that I got tired of writing by hand when I needed to figure out what wierdness is happening in a script
=head1 SYNOPSIS
use CGI::Lazy;
my $q = CGI::Lazy->new('/path/to/config/file');
my $t = $q->utility->debug;
$t->param(); #dumps html formatted CGI parameters to browser.
$t->env(); #dumps html formatted %ENV to browser.
$t->dump($ref, "some string"); #dumps html formatted output from Data::Dumper (if ref) or string (if scalar) to browser.
$t->cookie(); #dumps info regarding cookies to browser.
$t->edump($ref, "some string"); #dumps to external file, appending at each subsequent call.
$t->edumpreplace($ref); #dumps to external file, overwriting at each call
=head1 METHODS
=head2 cookie
prints an html formatted page listing all cookies.
=head2 dump ( output )
Outputs either a value, or a dump of a reference to the browser.
=head3 ref
String consisiting of message to dump, or reference
=head2 edump ( ref, message, filename )
Outputs either a value, or a dump of a reference to file specified by the 'debugfile' key in the CGI::Lazy config file. If that file isn't specified, dumps to /tmp/CGILazy.log. Appends to dump file.
=head3 output
string or reference to dump into external log file
=head3 message
a message to dump with the dump, if you like
=head2 edumpreplace ( output, message )
Outputs either a value, or a dump of a reference to file specified by the 'debugfile' key in the CGI::Lazy config file. If that file isn't specified, dumps to /tmp/CGILazy.log. Replaces dump file
=head3 output
string or reference to dump into external log file
=head3 message
a message to dump with the dump, if you like
=head2 eparam ( args )
Dumps cgi parameters to filename. Will also print any arguments passed, or dumps of args, if the args are references.
=head3 args
list of additional stuff to be printed out
=head2 param (args)
Writes cgi parameters to browser
=head3 args
list of addional stuff to be printed. If references are passed, prints html formatted dumps of ref contents.
=head2 env
writes ENV variables to browser
=head2 new
constructor
=head2 timestamp
creates a formatted timestamp string for the log
=cut