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 )