diff -Nru libplack-perl-1.0029/Changes libplack-perl-1.0030/Changes --- libplack-perl-1.0029/Changes 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/Changes 2013-11-23 07:54:05.000000000 +0000 @@ -1,5 +1,17 @@ Go to http://github.com/plack/Plack/issues for the roadmap and known issues. +1.0030 2013-11-23 08:54:01 CET + [IMPROVEMENTS] + - Middleware::LogDispatch stringifies objects (oalders) #427 + - Encode wide character strings as UTF-8 in HTTP::Server::PSGI #429 + - Optimize Plack::Response->finalize performance (kazeburo) #433 + - Optimize mount() performance in Plack::App::URLMap + + [BUG FIXES] + - ErrorDocument: remove Content-Encoding and Transfer-Encoding (kazeburo) #430 + - Fix harakiri test hang on win32 (wchristian) #431 + - Handler::FCGI: Restore --keep-stderr option (mauzo) #432 + 1.0029 2013-08-22 14:05:44 PDT [NEW FEATURES] - Plack::Test now has a simpler object-oriented interface that doesn't diff -Nru libplack-perl-1.0029/META.json libplack-perl-1.0030/META.json --- libplack-perl-1.0029/META.json 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/META.json 2013-11-23 07:54:05.000000000 +0000 @@ -4,7 +4,7 @@ "Tatsuhiko Miyagawa" ], "dynamic_config" : 0, - "generated_by" : "Dist::Milla version v1.0.3, Dist::Zilla version 4.300035, CPAN::Meta::Converter version 2.132140", + "generated_by" : "Dist::Milla version v1.0.4, Dist::Zilla version 5.006, CPAN::Meta::Converter version 2.132830", "license" : [ "perl_5" ], @@ -95,7 +95,7 @@ "web" : "https://github.com/plack/Plack" } }, - "version" : "1.0029", + "version" : "1.0030", "x_authority" : "cpan:MIYAGAWA", "x_contributors" : [ "Aaron Trevena ", @@ -105,6 +105,7 @@ "Andy Wardley ", "Aristotle Pagaltzis ", "Ask Bj\u00f8rn Hansen ", + "Ben Morrow ", "Bernhard Graf ", "Chia-liang Kao ", "Christian Walde ", @@ -145,6 +146,7 @@ "Michael G. Schwern ", "Nick Wellnhofer ", "Nobuo Danjou ", + "Olaf Alders ", "Oliver Gorwits ", "Oliver Paukstadt ", "Olivier Mengu\u00e9 ", diff -Nru libplack-perl-1.0029/META.yml libplack-perl-1.0030/META.yml --- libplack-perl-1.0029/META.yml 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/META.yml 2013-11-23 07:54:05.000000000 +0000 @@ -9,7 +9,7 @@ ExtUtils::MakeMaker: 6.30 File::ShareDir::Install: 0.03 dynamic_config: 0 -generated_by: 'Dist::Milla version v1.0.3, Dist::Zilla version 4.300035, CPAN::Meta::Converter version 2.132140' +generated_by: 'Dist::Milla version v1.0.4, Dist::Zilla version 5.006, CPAN::Meta::Converter version 2.132830' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -44,7 +44,7 @@ bugtracker: https://github.com/plack/Plack/issues homepage: https://github.com/plack/Plack repository: https://github.com/plack/Plack.git -version: 1.0029 +version: 1.0030 x_authority: cpan:MIYAGAWA x_contributors: - 'Aaron Trevena ' @@ -54,6 +54,7 @@ - 'Andy Wardley ' - 'Aristotle Pagaltzis ' - 'Ask Bjørn Hansen ' + - 'Ben Morrow ' - 'Bernhard Graf ' - 'Chia-liang Kao ' - 'Christian Walde ' @@ -94,6 +95,7 @@ - 'Michael G. Schwern ' - 'Nick Wellnhofer ' - 'Nobuo Danjou ' + - 'Olaf Alders ' - 'Oliver Gorwits ' - 'Oliver Paukstadt ' - 'Olivier Mengué ' diff -Nru libplack-perl-1.0029/Makefile.PL libplack-perl-1.0030/Makefile.PL --- libplack-perl-1.0029/Makefile.PL 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/Makefile.PL 2013-11-23 07:54:05.000000000 +0000 @@ -45,37 +45,38 @@ "Test::More" => "0.88", "Test::Requires" => 0 }, - "VERSION" => "1.0029", + "VERSION" => "1.0030", "test" => { "TESTS" => "t/*.t t/HTTP-Message-PSGI/*.t t/HTTP-Server-PSGI/*.t t/Plack-Builder/*.t t/Plack-HTTPParser-PP/*.t t/Plack-Handler/*.t t/Plack-Loader/*.t t/Plack-MIME/*.t t/Plack-Middleware/*.t t/Plack-Middleware/cascade/*.t t/Plack-Middleware/recursive/*.t t/Plack-Middleware/stacktrace/*.t t/Plack-Request/*.t t/Plack-Response/*.t t/Plack-Runner/*.t t/Plack-TempBuffer/*.t t/Plack-Test/*.t t/Plack-Util/*.t" } ); -unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { - my $tr = delete $WriteMakefileArgs{TEST_REQUIRES}; - my $br = $WriteMakefileArgs{BUILD_REQUIRES}; - for my $mod ( keys %$tr ) { - if ( exists $br->{$mod} ) { - $br->{$mod} = $tr->{$mod} if $tr->{$mod} > $br->{$mod}; - } - else { - $br->{$mod} = $tr->{$mod}; - } - } -} +my %FallbackPrereqs = ( + "Apache::LogFormat::Compiler" => "0.12", + "Devel::StackTrace" => "1.23", + "Devel::StackTrace::AsHTML" => "0.11", + "File::ShareDir" => "1.00", + "Filesys::Notify::Simple" => 0, + "HTTP::Body" => "1.06", + "HTTP::Message" => "5.814", + "HTTP::Tiny" => "0.034", + "Hash::MultiValue" => "0.05", + "Pod::Usage" => "1.36", + "Stream::Buffered" => "0.02", + "Test::More" => "0.88", + "Test::Requires" => 0, + "Test::TCP" => "2.00", + "Try::Tiny" => 0, + "URI" => "1.59", + "parent" => 0 +); -unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) { - my $br = delete $WriteMakefileArgs{BUILD_REQUIRES}; - my $pp = $WriteMakefileArgs{PREREQ_PM}; - for my $mod ( keys %$br ) { - if ( exists $pp->{$mod} ) { - $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod}; - } - else { - $pp->{$mod} = $br->{$mod}; - } - } + +unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { + delete $WriteMakefileArgs{TEST_REQUIRES}; + delete $WriteMakefileArgs{BUILD_REQUIRES}; + $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} diff -Nru libplack-perl-1.0029/debian/changelog libplack-perl-1.0030/debian/changelog --- libplack-perl-1.0029/debian/changelog 2013-10-05 12:15:27.000000000 +0000 +++ libplack-perl-1.0030/debian/changelog 2013-12-25 20:08:42.000000000 +0000 @@ -1,3 +1,10 @@ +libplack-perl (1.0030-1) unstable; urgency=medium + + * New upstream release. + * Declare compliance with Debian Policy 3.9.5. + + -- gregor herrmann Wed, 25 Dec 2013 21:08:32 +0100 + libplack-perl (1.0029-1) unstable; urgency=low * New upstream release. diff -Nru libplack-perl-1.0029/debian/control libplack-perl-1.0030/debian/control --- libplack-perl-1.0029/debian/control 2013-10-05 12:15:27.000000000 +0000 +++ libplack-perl-1.0030/debian/control 2013-12-25 20:08:42.000000000 +0000 @@ -38,7 +38,7 @@ liburi-perl (>= 1.58), libwww-perl, python -Standards-Version: 3.9.4 +Standards-Version: 3.9.5 Vcs-Browser: http://anonscm.debian.org/gitweb/?p=pkg-perl/packages/libplack-perl.git Vcs-Git: git://anonscm.debian.org/pkg-perl/packages/libplack-perl.git Homepage: https://metacpan.org/release/Plack/ diff -Nru libplack-perl-1.0029/lib/HTTP/Server/PSGI.pm libplack-perl-1.0030/lib/HTTP/Server/PSGI.pm --- libplack-perl-1.0029/lib/HTTP/Server/PSGI.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/HTTP/Server/PSGI.pm 2013-11-23 07:54:05.000000000 +0000 @@ -280,6 +280,7 @@ sub write_all { my ($self, $sock, $buf, $timeout) = @_; return 0 unless defined $buf; + _encode($buf); my $off = 0; while (my $len = length($buf) - $off) { my $ret = $self->write_timeout($sock, $buf, $len, $off, $timeout) @@ -289,6 +290,14 @@ return length $buf; } +# syswrite() will crash when given wide characters +sub _encode { + if ($_[0] =~ /[^\x00-\xff]/) { + Carp::carp("Wide character outside byte range in response. Encoding data as UTF-8"); + utf8::encode($_[0]); + } +} + 1; __END__ diff -Nru libplack-perl-1.0029/lib/Plack/App/URLMap.pm libplack-perl-1.0030/lib/Plack/App/URLMap.pm --- libplack-perl-1.0029/lib/Plack/App/URLMap.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/Plack/App/URLMap.pm 2013-11-23 07:54:05.000000000 +0000 @@ -23,14 +23,14 @@ } $location =~ s!/$!!; - push @{$self->{_mapping}}, [ $host, $location, $app ]; + push @{$self->{_mapping}}, [ $host, $location, qr/^\Q$location\E/, $app ]; } sub prepare_app { my $self = shift; # sort by path length $self->{_sorted_mapping} = [ - map { [ @{$_}[2..4] ] } + map { [ @{$_}[2..5] ] } sort { $b->[0] <=> $a->[0] || $b->[1] <=> $a->[1] } map { [ ($_->[0] ? length $_->[0] : 0), length($_->[1]), @$_ ] } @{$self->{_mapping}}, ]; @@ -49,14 +49,14 @@ } for my $map (@{ $self->{_sorted_mapping} }) { - my($host, $location, $app) = @$map; + my($host, $location, $location_re, $app) = @$map; my $path = $path_info; # copy no warnings 'uninitialized'; DEBUG && warn "Matching request (Host=$http_host Path=$path) and the map (Host=$host Path=$location)\n"; next unless not defined $host or $http_host eq $host or $server_name eq $host; - next unless $location eq '' or $path =~ s!^\Q$location\E!!; + next unless $location eq '' or $path =~ s!$location_re!!; next unless $path eq '' or $path =~ m!^/!; DEBUG && warn "-> Matched!\n"; @@ -147,6 +147,16 @@ =back +=head1 PERFORMANCE + +If you C (or C with Plack::Builder) N applications, +Plack::App::URLMap will need to at most iterate through N paths to +match incoming requests. + +It is a good idea to use C only for a known, limited amount of +applications, since mounting hundreds of applications could affect +runtime request performance. + =head1 DEBUGGING You can set the environment variable C to see how diff -Nru libplack-perl-1.0029/lib/Plack/Handler/FCGI.pm libplack-perl-1.0030/lib/Plack/Handler/FCGI.pm --- libplack-perl-1.0029/lib/Plack/Handler/FCGI.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/Plack/Handler/FCGI.pm 2013-11-23 07:54:05.000000000 +0000 @@ -53,8 +53,8 @@ my %env; my $request = FCGI::Request( - $self->{stdin}, $self->{stdout}, - ($self->{keep_stderr} ? $self->{stdout} : $self->{stderr}), \%env, $sock, + $self->{stdin}, $self->{stdout}, $self->{stderr}, + \%env, $sock, ($self->{nointr} ? 0 : &FCGI::FAIL_ACCEPT_ON_INTR), ); @@ -98,8 +98,8 @@ 'psgi.version' => [1,1], 'psgi.url_scheme' => ($env{HTTPS}||'off') =~ /^(?:on|1)$/i ? 'https' : 'http', 'psgi.input' => $self->{stdin}, - 'psgi.errors' => $self->{stderr}, # FCGI.pm redirects STDERR in Accept() loop, so just print STDERR - # print to the correct error handle based on keep_stderr + 'psgi.errors' => + ($self->{keep_stderr} ? \*STDERR : $self->{stderr}), 'psgi.multithread' => Plack::Util::FALSE, 'psgi.multiprocess' => Plack::Util::TRUE, 'psgi.run_once' => Plack::Util::FALSE, @@ -282,7 +282,7 @@ =item keep-stderr -Send STDERR to STDOUT instead of the webserver +Send psgi.errors to STDERR instead of to the FCGI error stream. =item backlog diff -Nru libplack-perl-1.0029/lib/Plack/Middleware/ErrorDocument.pm libplack-perl-1.0030/lib/Plack/Middleware/ErrorDocument.pm --- libplack-perl-1.0029/lib/Plack/Middleware/ErrorDocument.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/Plack/Middleware/ErrorDocument.pm 2013-11-23 07:54:05.000000000 +0000 @@ -61,6 +61,8 @@ } else { my $h = Plack::Util::headers($r->[1]); $h->remove('Content-Length'); + $h->remove('Content-Encoding'); + $h->remove('Transfer-Encoding'); $h->set('Content-Type', Plack::MIME->mime_type($path)); open my $fh, "<", $path or die "$path: $!"; diff -Nru libplack-perl-1.0029/lib/Plack/Middleware/LogDispatch.pm libplack-perl-1.0030/lib/Plack/Middleware/LogDispatch.pm --- libplack-perl-1.0029/lib/Plack/Middleware/LogDispatch.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/Plack/Middleware/LogDispatch.pm 2013-11-23 07:54:05.000000000 +0000 @@ -17,6 +17,11 @@ $env->{'psgix.logger'} = sub { my $args = shift; $args->{level} = 'critical' if $args->{level} eq 'fatal'; + + if ( ref $args->{message} && ref $args->{message} ne 'CODE' ) { + $args->{message} .= q{}; + } + $self->logger->log(%$args); }; diff -Nru libplack-perl-1.0029/lib/Plack/Request.pm libplack-perl-1.0030/lib/Plack/Request.pm --- libplack-perl-1.0029/lib/Plack/Request.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/Plack/Request.pm 2013-11-23 07:54:05.000000000 +0000 @@ -2,8 +2,7 @@ use strict; use warnings; use 5.008_001; -our $VERSION = '1.0029'; -$VERSION = eval $VERSION; +our $VERSION = '1.0030'; use HTTP::Headers; use Carp (); diff -Nru libplack-perl-1.0029/lib/Plack/Response.pm libplack-perl-1.0030/lib/Plack/Response.pm --- libplack-perl-1.0029/lib/Plack/Response.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/Plack/Response.pm 2013-11-23 07:54:05.000000000 +0000 @@ -1,8 +1,7 @@ package Plack::Response; use strict; use warnings; -our $VERSION = '1.0029'; -$VERSION = eval $VERSION; +our $VERSION = '1.0030'; use Plack::Util::Accessor qw(body status); use Carp (); @@ -86,24 +85,20 @@ my $self = shift; Carp::croak "missing status" unless $self->status(); - my $headers = $self->headers->clone; - $self->_finalize_cookies($headers); + my $headers = $self->headers; + my @headers; + $headers->scan(sub{ + my ($k,$v) = @_; + $v =~ s/\015\012[\040|\011]+/chr(32)/ge; # replace LWS with a single SP + $v =~ s/\015|\012//g; # remove CR and LF since the char is invalid here + push @headers, $k, $v; + }); + + $self->_finalize_cookies(\@headers); return [ $self->status, - +[ - map { - my $k = $_; - map { - my $v = $_; - $v =~ s/\015\012[\040|\011]+/chr(32)/ge; # replace LWS with a single SP - $v =~ s/\015|\012//g; # remove CR and LF since the char is invalid here - - ( $k => $v ) - } $headers->header($_); - - } $headers->header_field_names - ], + \@headers, $self->_body, ]; } @@ -130,7 +125,7 @@ while (my($name, $val) = each %{$self->cookies}) { my $cookie = $self->_bake_cookie($name, $val); - $headers->push_header('Set-Cookie' => $cookie); + push @$headers, 'Set-Cookie' => $cookie; } } diff -Nru libplack-perl-1.0029/lib/Plack.pm libplack-perl-1.0030/lib/Plack.pm --- libplack-perl-1.0029/lib/Plack.pm 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/lib/Plack.pm 2013-11-23 07:54:05.000000000 +0000 @@ -3,8 +3,7 @@ use strict; use warnings; use 5.008_001; -our $VERSION = '1.0029'; -$VERSION = eval $VERSION; +our $VERSION = '1.0030'; 1; __END__ diff -Nru libplack-perl-1.0029/t/HTTP-Server-PSGI/harakiri.t libplack-perl-1.0030/t/HTTP-Server-PSGI/harakiri.t --- libplack-perl-1.0029/t/HTTP-Server-PSGI/harakiri.t 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/t/HTTP-Server-PSGI/harakiri.t 2013-11-23 07:54:05.000000000 +0000 @@ -6,6 +6,8 @@ use Test::TCP; use Test::Requires qw(LWP::UserAgent); +my $ua_timeout = 3; + test_tcp( server => sub { my $port = shift; @@ -24,11 +26,11 @@ ]; }, ); - sleep 5; # to block + sleep $ua_timeout + 2; # to block }, client => sub { my $port = shift; - my $ua = LWP::UserAgent->new; + my $ua = LWP::UserAgent->new( timeout => $ua_timeout ); my $res = $ua->get("http://127.0.0.1:$port/"); ok $res->is_success; is $res->code, 200; diff -Nru libplack-perl-1.0029/t/Plack-Middleware/log_dispatch.t libplack-perl-1.0030/t/Plack-Middleware/log_dispatch.t --- libplack-perl-1.0029/t/Plack-Middleware/log_dispatch.t 2013-08-22 21:05:49.000000000 +0000 +++ libplack-perl-1.0030/t/Plack-Middleware/log_dispatch.t 2013-11-23 07:54:05.000000000 +0000 @@ -8,6 +8,12 @@ use Log::Dispatch; use Log::Dispatch::Array; +package Stringify; +use overload q{""} => sub { 'stringified object' }; +sub new { bless {}, shift } + +package main; + my @logs; my $logger = Log::Dispatch->new; @@ -19,6 +25,9 @@ my $app = sub { my $env = shift; $env->{'psgix.logger'}->({ level => "debug", message => "This is debug" }); + $env->{'psgix.logger'}->({ level => "info", message => sub { 'code ref' } }); + $env->{'psgix.logger'}->({ level => "notice", message => Stringify->new() }); + return [ 200, [], [] ]; }; @@ -28,9 +37,15 @@ my $cb = shift; my $res = $cb->(GET "/"); - is @logs, 1; + is @logs, 3; is $logs[0]->{level}, 'debug'; is $logs[0]->{message}, 'This is debug'; + + is $logs[1]->{level}, 'info'; + is $logs[1]->{message}, 'code ref'; + + is $logs[2]->{level}, 'notice'; + is $logs[2]->{message}, 'stringified object'; }; done_testing;