Container-Builder
view release on metacpan or search on metacpan
examples/fatpacked.plackup view on Meta::CPAN
if ( $Config::config{d_setlocale} ) {
$old_locale = POSIX::setlocale(&POSIX::LC_ALL);
POSIX::setlocale(&POSIX::LC_ALL, 'C');
}
my $out = POSIX::strftime(@_);
if ( $Config::config{d_setlocale} ) {
POSIX::setlocale(&POSIX::LC_ALL, $old_locale);
};
return $out;
}
sub format_message {
my($self, $level, $message) = @_;
my $time = format_time("%Y-%m-%dT%H:%M:%S", localtime);
sprintf "%s [%s #%d] %s: %s\n", uc substr($level, 0, 1), $time, $$, uc $level, $message;
}
1;
__END__
=head1 NAME
Plack::Middleware::SimpleLogger - Simple logger that prints to psgi.errors
=head1 SYNOPSIS
enable "SimpleLogger", level => "warn";
=head1 DESCRIPTION
SimpleLogger is a middleware component that formats the log message
with information such as the time and PID and prints them to
I<psgi.errors> stream, which is mostly STDERR or server log output.
=head1 SEE ALSO
L<Plack::Middleware::LogErrors>, essentially the opposite of this module
=head1 AUTHOR
Tatsuhiko Miyagawa
=cut
PLACK_MIDDLEWARE_SIMPLELOGGER
$fatpacked{"Plack/Middleware/StackTrace.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PLACK_MIDDLEWARE_STACKTRACE';
package Plack::Middleware::StackTrace;
use strict;
use warnings;
use parent qw/Plack::Middleware/;
use Devel::StackTrace;
use Devel::StackTrace::AsHTML;
use Scalar::Util qw( refaddr );
use Try::Tiny;
use Plack::Util::Accessor qw( force no_print_errors );
our $StackTraceClass = "Devel::StackTrace";
# Optional since it needs PadWalker
if (try { require Devel::StackTrace::WithLexicals; Devel::StackTrace::WithLexicals->VERSION(0.08); 1 }) {
$StackTraceClass = "Devel::StackTrace::WithLexicals";
}
sub call {
my($self, $env) = @_;
my ($trace, %string_traces, %ref_traces);
local $SIG{__DIE__} = sub {
$trace = $StackTraceClass->new(
indent => 1, message => munge_error($_[0], [ caller ]),
ignore_package => __PACKAGE__, no_refs => 1,
);
if (ref $_[0]) {
$ref_traces{refaddr($_[0])} ||= $trace;
}
else {
$string_traces{$_[0]} ||= $trace;
}
die @_;
};
my $caught;
my $res = try {
$self->app->($env);
} catch {
$caught = $_;
[ 500, [ "Content-Type", "text/plain; charset=utf-8" ], [ no_trace_error(utf8_safe($caught)) ] ];
};
if ($caught) {
# Try to find the correct trace for the caught exception
my $caught_trace;
if (ref $caught) {
$caught_trace = $ref_traces{refaddr($caught)};
}
else {
# This is not guaranteed to work if multiple exceptions with
# the same message are thrown.
$caught_trace = $string_traces{$caught};
}
$trace = $caught_trace if $caught_trace;
}
# Use ref $trace to avoid overloaded as_string() for bool evaluation
if (ref $trace && ($caught || ($self->force && ref $res eq 'ARRAY' && $res->[0] == 500)) ) {
my $text = $trace->as_string;
my $html = $trace->as_html;
$env->{'plack.stacktrace.text'} = $text;
$env->{'plack.stacktrace.html'} = $html;
$env->{'psgi.errors'}->print($text) unless $self->no_print_errors;
if (($env->{HTTP_ACCEPT} || '*/*') =~ /html/) {
$res = [500, ['Content-Type' => 'text/html; charset=utf-8'], [ utf8_safe($html) ]];
} else {
$res = [500, ['Content-Type' => 'text/plain; charset=utf-8'], [ utf8_safe($text) ]];
}
}
# break $trace here since $SIG{__DIE__} holds the ref to it, and
# $trace has refs to Standalone.pm's args ($conn etc.) and
( run in 1.364 second using v1.01-cache-2.11-cpan-e1769b4cff6 )