Data-Printer
view release on metacpan or search on metacpan
lib/Data/Printer/Filter/Web.pm view on Meta::CPAN
return _format_cookie({
expires => scalar $obj->expires,
domain => $obj->domain,
path => $obj->path,
secure => $obj->secure,
http_only => $obj->http_only,
name => $obj->name,
value => $obj->value,
class => 'Dancer::Cookie',
}, $ddp);
};
filter 'Dancer2::Core::Cookie' => sub {
my ($obj, $ddp) = @_;
return _format_cookie({
expires => scalar $obj->expires,
domain => $obj->domain,
path => $obj->path,
secure => $obj->secure,
http_only => $obj->http_only,
name => $obj->name,
value => $obj->value,
class => 'Dancer2::Core::Cookie',
}, $ddp);
};
sub _format_cookie {
my ($data, $ddp) = @_;
return $ddp->maybe_colorize(
$data->{name} . '='
. Data::Printer::Common::_process_string($ddp, $data->{value})
. '; expires=' . $data->{expires}
. '; domain=' . $data->{domain}
. '; path=' . $data->{path}
. ('; secure'x!!$data->{secure})
. ('; http-only'x!!$data->{http_only})
. ('; host-only'x!!$data->{host_only})
. (defined $data->{max_age} ? '; max-age=' . $data->{max_age} : '')
, 'filter_web_cookie', '#0b3e21'
) . ' (' . $ddp->maybe_colorize($data->{class}, 'class') . ')';
}
####################
### HTTP parsers
#############################################
filter 'HTTP::Request' => sub {
my ($obj, $ddp) = @_;
my $output = $ddp->maybe_colorize($obj->method, 'filter_web_method', '#fefe33')
. ' '
. $ddp->maybe_colorize($obj->uri, 'filter_web_uri', '#fefe88')
;
if ($ddp->extra_config->{filter_web}{show_class_name}) {
$output .= ' (' . $ddp->maybe_colorize(ref $obj, 'class') . ')';
}
my $expand_headers = !exists $ddp->extra_config->{filter_web}{expand_headers}
|| $ddp->extra_config->{filter_web}{expand_headers};
my $content = $obj->decoded_content;
if ($expand_headers || $content) {
$output .= ' {';
$ddp->indent;
if ($expand_headers) {
if ($obj->headers->can('flatten')) {
my %headers = $obj->headers->flatten;
$output .= $ddp->newline . 'headers: ' . $ddp->parse(\%headers);
}
}
if ($content) {
$output .= $ddp->newline . 'content: '
. Data::Printer::Common::_process_string($ddp, $content, 'string');
}
$ddp->outdent;
$output .= $ddp->newline . '}';
}
return $output;
};
filter 'HTTP::Response' => sub {
my ($obj, $ddp) = @_;
my $output = _maybe_show_request($obj, $ddp);
if (!exists $ddp->extra_config->{filter_web}{show_redirect}
|| $ddp->extra_config->{filter_web}{show_redirect}
) {
foreach my $redir ($obj->redirects) {
$output .= "\x{e2}\x{a4}\x{bf} "
. $redir->code . ' ' . $redir->message
. ' (' . $redir->header('location') . ')'
. $ddp->newline;
}
}
my %colors = (
1 => ['filter_web_response_info' , '#3333fe'],
2 => ['filter_web_response_success' , '#33fe33'],
3 => ['filter_web_response_redirect', '#fefe33'],
4 => ['filter_web_response_error' , '#fe3333'],
5 => ['filter_web_response_error' , '#fe3333'],
);
my $status_key = substr($obj->code, 0, 1);
$output .= $ddp->maybe_colorize(
$obj->status_line,
(exists $colors{$status_key} ? @{$colors{$status_key}} : @{$colors{1}})
);
if ($ddp->extra_config->{filter_web}{show_class_name}) {
$output .= ' (' . $ddp->maybe_colorize(ref $obj, 'class') . ')';
}
my $expand_headers = !exists $ddp->extra_config->{filter_web}{expand_headers}
|| $ddp->extra_config->{filter_web}{expand_headers};
my $content = $obj->decoded_content;
if ($expand_headers || $content) {
$output .= ' {';
$ddp->indent;
if ($expand_headers) {
if ($obj->headers->can('flatten')) {
my %headers = $obj->headers->flatten;
$output .= $ddp->newline . 'headers: ' . $ddp->parse(\%headers);
}
}
if ($content) {
$output .= $ddp->newline . 'content: '
. Data::Printer::Common::_process_string($ddp, $content, 'string');
}
$ddp->outdent;
$output .= $ddp->newline . '}';
}
return $output;
};
sub _maybe_show_request {
my ($obj, $ddp) = @_;
return '' unless $ddp->extra_config->{filter_web}{show_request_in_response};
my ($redir) = $obj->redirects;
my $output = 'Request: ';
my $request;
if ($redir) {
$request = $redir->request;
}
else {
$request = $obj->request;
}
return $output . ($request ? $ddp->parse($request) : '-');
}
1;
__END__
=head1 NAME
Data::Printer::Filter::Web - pretty-printing of HTTP/JSON/LWP/Plack/Dancer/Catalyst/Mojo...
=head1 SYNOPSIS
In your C<.dataprinter> file:
filters = Web
You may also customize the look and feel with the following options (defaults shown):
filter_web.show_class_name = 0
filter_web.expand_headers = 1
filter_web.show_redirect = 1
filter_web.show_request_in_response = 0
# you can even customize your themes:
colors.filter_web_json_true = #ccffcc
colors.filter_web_json_false = #ffcccc
colors.filter_web_cookie = #0b3e21
( run in 0.740 second using v1.01-cache-2.11-cpan-e1769b4cff6 )