Hello community, here is the log from the commit of package perl-Plack for openSUSE:Factory checked in at 2015-04-15 16:23:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-Plack (Old) and /work/SRC/openSUSE:Factory/.perl-Plack.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Plack" Changes: -------- --- /work/SRC/openSUSE:Factory/perl-Plack/perl-Plack.changes 2014-09-17 17:26:34.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.perl-Plack.new/perl-Plack.changes 2015-04-15 16:23:23.000000000 +0200 @@ -1,0 +2,28 @@ +Mon Apr 13 18:36:02 UTC 2015 - [email protected] + +- updated to 1.0034 + see /usr/share/doc/packages/perl-Plack/Changes + + 1.0034 2015-02-02 21:42:42 CET + [SECURITY] + - Fixed a possible directory traversal with Plack::App::File on Win32 (sri) + + [IMPROVEMENTS] + - Documentation improvements (timbunce, oalders, autarch, frioux) + - Avoid warnings in Plack::App::WrapCGI (frioux) + + 1.0033 2014-10-23 12:33:18 PDT + [BUG FIXES] + - Lint: Fix error messages (fgabolde) #473 + - ErrorDocument: Reverse the $done filtering (nwellnhof) #474 + + [IMPROVEMENTS] + - StackTrace: Improve the accuracy of thrown exceptions in case where an excpetion + is thrown in destructors (nwellnhof) #476 + + 1.0032 2014-10-04 11:13:24 PDT + [IMPROVEMENTS] + - Support Server::Starter in FCGI handler (yuryu) #435 + - Various documentation fixes + +------------------------------------------------------------------- Old: ---- Plack-1.0031.tar.gz New: ---- Plack-1.0034.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-Plack.spec ++++++ --- /var/tmp/diff_new_pack.qgf5g6/_old 2015-04-15 16:23:24.000000000 +0200 +++ /var/tmp/diff_new_pack.qgf5g6/_new 2015-04-15 16:23:24.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package perl-Plack # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: perl-Plack -Version: 1.0031 +Version: 1.0034 Release: 0 %define cpan_name Plack Summary: Perl Superglue for Web frameworks and Web Servers (PSGI toolkit) @@ -90,6 +90,6 @@ %files -f %{name}.files %defattr(-,root,root,755) -%doc Changes cpanfile LICENSE README +%doc Changes LICENSE README %changelog ++++++ Plack-1.0031.tar.gz -> Plack-1.0034.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/Changes new/Plack-1.0034/Changes --- old/Plack-1.0031/Changes 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/Changes 2015-02-02 21:42:46.000000000 +0100 @@ -1,5 +1,27 @@ Go to http://github.com/plack/Plack/issues for the roadmap and known issues. +1.0034 2015-02-02 21:42:42 CET + [SECURITY] + - Fixed a possible directory traversal with Plack::App::File on Win32 (sri) + + [IMPROVEMENTS] + - Documentation improvements (timbunce, oalders, autarch, frioux) + - Avoid warnings in Plack::App::WrapCGI (frioux) + +1.0033 2014-10-23 12:33:18 PDT + [BUG FIXES] + - Lint: Fix error messages (fgabolde) #473 + - ErrorDocument: Reverse the $done filtering (nwellnhof) #474 + + [IMPROVEMENTS] + - StackTrace: Improve the accuracy of thrown exceptions in case where an excpetion + is thrown in destructors (nwellnhof) #476 + +1.0032 2014-10-04 11:13:24 PDT + [IMPROVEMENTS] + - Support Server::Starter in FCGI handler (yuryu) #435 + - Various documentation fixes + 1.0031 2014-08-01 13:19:14 PDT [SECURITY] - Plack::App::File would previously strip trailing slashes off @@ -62,7 +84,7 @@ 1.0025 2013-06-12 13:08:58 PDT [INCOMPATIBLE CHANGES] - No XS! Eliminates dependency to LWP::UserAgent by making it completely optional for - testing. If you run Plack::Test with Server implemenetation or run Plack::Test::Suite + testing. If you run Plack::Test with Server implementation or run Plack::Test::Suite (for PSGI handlers) without LWP installed, the tests will automatically be skipped. This removes the eventual sub-dependency to HTML::Parser, which is the only XS dependency in Plack. #408 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/MANIFEST new/Plack-1.0034/MANIFEST --- old/Plack-1.0031/MANIFEST 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/MANIFEST 2015-02-02 21:42:46.000000000 +0100 @@ -1,4 +1,4 @@ -# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.020. +# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.031. Changes LICENSE MANIFEST @@ -190,6 +190,7 @@ t/Plack-Middleware/simple_logger.t t/Plack-Middleware/stacktrace/basic.t t/Plack-Middleware/stacktrace/force.t +t/Plack-Middleware/stacktrace/multiple_exceptions.t t/Plack-Middleware/stacktrace/sigdie.t t/Plack-Middleware/stacktrace/streaming.t t/Plack-Middleware/stacktrace/utf8.t diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/META.json new/Plack-1.0034/META.json --- old/Plack-1.0031/META.json 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/META.json 2015-02-02 21:42:46.000000000 +0100 @@ -4,13 +4,13 @@ "Tatsuhiko Miyagawa" ], "dynamic_config" : 0, - "generated_by" : "Dist::Milla version v1.0.5, Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060", + "generated_by" : "Dist::Zilla version 5.031, Dist::Milla version v1.0.14, CPAN::Meta::Converter version 2.143240", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", - "version" : "2" + "version" : 2 }, "name" : "Plack", "no_index" : { @@ -32,6 +32,7 @@ }, "develop" : { "requires" : { + "Dist::Milla" : "v1.0.14", "Test::Pod" : "1.41" } }, @@ -95,35 +96,48 @@ "web" : "https://github.com/plack/Plack" } }, - "version" : "1.0031", + "version" : "1.0034", "x_authority" : "cpan:MIYAGAWA", "x_contributors" : [ "Aaron Trevena <[email protected]>", - "Alex J. G. Burzyński <[email protected]>", + "Ævar Arnfjörð Bjarmason <[email protected]>", "Alexandr Ciornii <[email protected]>", + "Alex J. G. Burzyński <[email protected]>", "Andrew Rodland <[email protected]>", "Andy Wardley <[email protected]>", "Aristotle Pagaltzis <[email protected]>", "Arthur Axel 'fREW' Schmidt <[email protected]>", + "Ashley Pond V <[email protected]>", "Ask Bjørn Hansen <[email protected]>", "Ben Morrow <[email protected]>", "Bernhard Graf <[email protected]>", "Chad Granum <[email protected]>", + "chansen <[email protected]>", "Chia-liang Kao <[email protected]>", + "cho45 <[email protected]>", "Christian Walde <[email protected]>", + "chromatic <[email protected]>", "Cosimo Streppone <[email protected]>", "Daisuke Maki <[email protected]>", "Daisuke Murase <[email protected]>", + "Dave Marr <[email protected]>", "Dave Rolsky <[email protected]>", "David E. Wheeler <[email protected]>", "David Steinbrunner <[email protected]>", "Eduardo Arino de la Rubia <[email protected]>", + "Eric Johnson <[email protected]>", + "Fabrice Gabolde <[email protected]>", + "fayland <[email protected]>", "Florian Ragwitz <[email protected]>", + "franck cuny <[email protected]>", + "fREW Schmidt <[email protected]>", "Graham Knop <[email protected]>", "Grant McLean <[email protected]>", - "HIROSE Masaaki <[email protected]>", "Hans Dieter Pearcey <[email protected]>", + "Haruka Iwao <[email protected]>", "Henry Baragar <[email protected]>", + "hiratara <[email protected]>", + "HIROSE Masaaki <[email protected]>", "Hiroshi Sakai <[email protected]>", "Jakob Voss <[email protected]>", "Jakob Voss <[email protected]>", @@ -135,12 +149,15 @@ "John Napiorkowski <[email protected]>", "Jonathan Swartz <[email protected]>", "Justin Davis <[email protected]>", + "kakuno <[email protected]>", "Kang-min Liu <[email protected]>", "Karen Etheridge <[email protected]>", "Kazuho Oku <[email protected]>", "Keedi Kim <[email protected]>", "Lee Aylward <[email protected]>", + "leedo <[email protected]>", "Leo Lapworth <[email protected]>", + "mala <[email protected]>", "Marian Schubert <[email protected]>", "Mark Fowler <[email protected]>", "Mark Stosberg <[email protected]>", @@ -153,12 +170,14 @@ "Oliver Gorwits <[email protected]>", "Oliver Paukstadt <[email protected]>", "Olivier Mengué <[email protected]>", + "osfameron <[email protected]>", "Panu Ervamaa <[email protected]>", "Paul Driver <[email protected]>", "Pedro Melo <[email protected]>", "Peter Flanigan <[email protected]>", "Peter Makholm <[email protected]>", "Piotr Roszatycki <[email protected]>", + "punytan <[email protected]>", "Rafael Kitover <[email protected]>", "Randy Stauner <[email protected]>", "Ray Miller <[email protected]>", @@ -172,29 +191,18 @@ "Stevan Little <[email protected]>", "Stuart A Johnston <[email protected]>", "Takeshi OKURA <[email protected]>", + "Tatsuhiko Miyagawa <[email protected]>", + "Tim Bunce <[email protected]>", "Tokuhiro Matsuno <[email protected]>", - "Tom Heady <[email protected]>", "Tomas Doran <[email protected]>", + "Tom Heady <[email protected]>", + "vti <[email protected]>", "Wallace Reis <[email protected]>", + "xaicron <[email protected]>", "Yann Kerherve <[email protected]>", + "yappo <[email protected]>", "Yury Zavarin <[email protected]>", "Yuval Kogman <[email protected]>", - "chansen <[email protected]>", - "cho45 <[email protected]>", - "chromatic <[email protected]>", - "fREW Schmidt <[email protected]>", - "fayland <[email protected]>", - "franck cuny <[email protected]>", - "hiratara <[email protected]>", - "kakuno <[email protected]>", - "leedo <[email protected]>", - "mala <[email protected]>", - "osfameron <[email protected]>", - "punytan <[email protected]>", - "vti <[email protected]>", - "xaicron <[email protected]>", - "yappo <[email protected]>", - "Ævar Arnfjörð Bjarmason <[email protected]>", "唐鳳 <[email protected]>" ] } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/META.yml new/Plack-1.0034/META.yml --- old/Plack-1.0031/META.yml 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/META.yml 2015-02-02 21:42:46.000000000 +0100 @@ -9,7 +9,7 @@ ExtUtils::MakeMaker: '0' File::ShareDir::Install: '0.06' dynamic_config: 0 -generated_by: 'Dist::Milla version v1.0.5, Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060' +generated_by: 'Dist::Zilla version 5.031, Dist::Milla version v1.0.14, CPAN::Meta::Converter version 2.143240' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -44,35 +44,48 @@ bugtracker: https://github.com/plack/Plack/issues homepage: https://github.com/plack/Plack repository: https://github.com/plack/Plack.git -version: '1.0031' +version: '1.0034' x_authority: cpan:MIYAGAWA x_contributors: - 'Aaron Trevena <[email protected]>' - - 'Alex J. G. Burzyński <[email protected]>' + - 'Ævar Arnfjörð Bjarmason <[email protected]>' - 'Alexandr Ciornii <[email protected]>' + - 'Alex J. G. Burzyński <[email protected]>' - 'Andrew Rodland <[email protected]>' - 'Andy Wardley <[email protected]>' - 'Aristotle Pagaltzis <[email protected]>' - "Arthur Axel 'fREW' Schmidt <[email protected]>" + - 'Ashley Pond V <[email protected]>' - 'Ask Bjørn Hansen <[email protected]>' - 'Ben Morrow <[email protected]>' - 'Bernhard Graf <[email protected]>' - 'Chad Granum <[email protected]>' + - 'chansen <[email protected]>' - 'Chia-liang Kao <[email protected]>' + - 'cho45 <[email protected]>' - 'Christian Walde <[email protected]>' + - 'chromatic <[email protected]>' - 'Cosimo Streppone <[email protected]>' - 'Daisuke Maki <[email protected]>' - 'Daisuke Murase <[email protected]>' + - 'Dave Marr <[email protected]>' - 'Dave Rolsky <[email protected]>' - 'David E. Wheeler <[email protected]>' - 'David Steinbrunner <[email protected]>' - 'Eduardo Arino de la Rubia <[email protected]>' + - 'Eric Johnson <[email protected]>' + - 'Fabrice Gabolde <[email protected]>' + - 'fayland <[email protected]>' - 'Florian Ragwitz <[email protected]>' + - 'franck cuny <[email protected]>' + - 'fREW Schmidt <[email protected]>' - 'Graham Knop <[email protected]>' - 'Grant McLean <[email protected]>' - - 'HIROSE Masaaki <[email protected]>' - 'Hans Dieter Pearcey <[email protected]>' + - 'Haruka Iwao <[email protected]>' - 'Henry Baragar <[email protected]>' + - 'hiratara <[email protected]>' + - 'HIROSE Masaaki <[email protected]>' - 'Hiroshi Sakai <[email protected]>' - 'Jakob Voss <[email protected]>' - 'Jakob Voss <[email protected]>' @@ -84,12 +97,15 @@ - 'John Napiorkowski <[email protected]>' - 'Jonathan Swartz <[email protected]>' - 'Justin Davis <[email protected]>' + - 'kakuno <[email protected]>' - 'Kang-min Liu <[email protected]>' - 'Karen Etheridge <[email protected]>' - 'Kazuho Oku <[email protected]>' - 'Keedi Kim <[email protected]>' - 'Lee Aylward <[email protected]>' + - 'leedo <[email protected]>' - 'Leo Lapworth <[email protected]>' + - 'mala <[email protected]>' - 'Marian Schubert <[email protected]>' - 'Mark Fowler <[email protected]>' - 'Mark Stosberg <[email protected]>' @@ -102,12 +118,14 @@ - 'Oliver Gorwits <[email protected]>' - 'Oliver Paukstadt <[email protected]>' - 'Olivier Mengué <[email protected]>' + - 'osfameron <[email protected]>' - 'Panu Ervamaa <[email protected]>' - 'Paul Driver <[email protected]>' - 'Pedro Melo <[email protected]>' - 'Peter Flanigan <[email protected]>' - 'Peter Makholm <[email protected]>' - 'Piotr Roszatycki <[email protected]>' + - 'punytan <[email protected]>' - 'Rafael Kitover <[email protected]>' - 'Randy Stauner <[email protected]>' - 'Ray Miller <[email protected]>' @@ -121,27 +139,16 @@ - 'Stevan Little <[email protected]>' - 'Stuart A Johnston <[email protected]>' - 'Takeshi OKURA <[email protected]>' + - 'Tatsuhiko Miyagawa <[email protected]>' + - 'Tim Bunce <[email protected]>' - 'Tokuhiro Matsuno <[email protected]>' - - 'Tom Heady <[email protected]>' - 'Tomas Doran <[email protected]>' + - 'Tom Heady <[email protected]>' + - 'vti <[email protected]>' - 'Wallace Reis <[email protected]>' + - 'xaicron <[email protected]>' - 'Yann Kerherve <[email protected]>' + - 'yappo <[email protected]>' - 'Yury Zavarin <[email protected]>' - 'Yuval Kogman <[email protected]>' - - 'chansen <[email protected]>' - - 'cho45 <[email protected]>' - - 'chromatic <[email protected]>' - - 'fREW Schmidt <[email protected]>' - - 'fayland <[email protected]>' - - 'franck cuny <[email protected]>' - - 'hiratara <[email protected]>' - - 'kakuno <[email protected]>' - - 'leedo <[email protected]>' - - 'mala <[email protected]>' - - 'osfameron <[email protected]>' - - 'punytan <[email protected]>' - - 'vti <[email protected]>' - - 'xaicron <[email protected]>' - - 'yappo <[email protected]>' - - 'Ævar Arnfjörð Bjarmason <[email protected]>' - '唐鳳 <[email protected]>' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/Makefile.PL new/Plack-1.0034/Makefile.PL --- old/Plack-1.0031/Makefile.PL 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/Makefile.PL 2015-02-02 21:42:46.000000000 +0100 @@ -1,11 +1,11 @@ -# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.020. +# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.031. use strict; use warnings; use 5.008001; -use ExtUtils::MakeMaker ; +use ExtUtils::MakeMaker; use File::ShareDir::Install; $File::ShareDir::Install::INCLUDE_DOTFILES = 1; @@ -25,6 +25,7 @@ "script/plackup" ], "LICENSE" => "perl", + "MIN_PERL_VERSION" => "5.008001", "NAME" => "Plack", "PREREQ_PM" => { "Apache::LogFormat::Compiler" => "0.12", @@ -47,7 +48,7 @@ "Test::More" => "0.88", "Test::Requires" => 0 }, - "VERSION" => "1.0031", + "VERSION" => "1.0034", "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" } @@ -58,7 +59,9 @@ "Apache::LogFormat::Compiler" => "0.12", "Devel::StackTrace" => "1.23", "Devel::StackTrace::AsHTML" => "0.11", + "ExtUtils::MakeMaker" => 0, "File::ShareDir" => "1.00", + "File::ShareDir::Install" => "0.06", "Filesys::Notify::Simple" => 0, "HTTP::Body" => "1.06", "HTTP::Message" => "5.814", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/README new/Plack-1.0034/README --- old/Plack-1.0031/README 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/README 2015-02-02 21:42:46.000000000 +0100 @@ -1,39 +1,48 @@ NAME - Plack - Perl Superglue for Web frameworks and Web Servers (PSGI toolkit) + + Plack - Perl Superglue for Web frameworks and Web Servers (PSGI + toolkit) DESCRIPTION - Plack is a set of tools for using the PSGI stack. It contains middleware - components, a reference server and utilities for Web application - frameworks. Plack is like Ruby's Rack or Python's Paste for WSGI. + + Plack is a set of tools for using the PSGI stack. It contains + middleware components, a reference server and utilities for Web + application frameworks. Plack is like Ruby's Rack or Python's Paste for + WSGI. See PSGI for the PSGI specification and PSGI::FAQ to know what PSGI and Plack are and why we need them. MODULES AND UTILITIES - Plack::Handler + + Plack::Handler + Plack::Handler and its subclasses contains adapters for web servers. We - have adapters for the built-in standalone web server HTTP::Server::PSGI, - CGI, FCGI, Apache1, Apache2 and HTTP::Server::Simple included in the - core Plack distribution. + have adapters for the built-in standalone web server + HTTP::Server::PSGI, CGI, FCGI, Apache1, Apache2 and + HTTP::Server::Simple included in the core Plack distribution. There are also many HTTP server implementations on CPAN that have Plack handlers. See Plack::Handler when writing your own adapters. - Plack::Loader + Plack::Loader + Plack::Loader is a loader to load one Plack::Handler adapter and run a PSGI application code reference with it. - Plack::Util + Plack::Util + Plack::Util contains a lot of utility functions for server implementors as well as middleware authors. - .psgi files + .psgi files + A PSGI application is a code reference but it's not easy to pass code reference via the command line or configuration files, so Plack uses a - convention that you need a file named "app.psgi" or similar, which would - be loaded (via perl's core function "do") to return the PSGI application + convention that you need a file named app.psgi or similar, which would + be loaded (via perl's core function do) to return the PSGI application code reference. # Hello.psgi @@ -44,75 +53,83 @@ }; If you use a web framework, chances are that they provide a helper - utility to automatically generate these ".psgi" files for you, such as: + utility to automatically generate these .psgi files for you, such as: # MyApp.psgi use MyApp; my $app = sub { MyApp->run_psgi(@_) }; - It's important that the return value of ".psgi" file is the code - reference. See "eg/dot-psgi" directory for more examples of ".psgi" - files. - - plackup, Plack::Runner - plackup is a command line launcher to run PSGI applications from command - line using Plack::Loader to load PSGI backends. It can be used to run - standalone servers and FastCGI daemon processes. Other server backends - like Apache2 needs a separate configuration but ".psgi" application file - can still be the same. + It's important that the return value of .psgi file is the code + reference. See eg/dot-psgi directory for more examples of .psgi files. + + plackup, Plack::Runner + + plackup is a command line launcher to run PSGI applications from + command line using Plack::Loader to load PSGI backends. It can be used + to run standalone servers and FastCGI daemon processes. Other server + backends like Apache2 needs a separate configuration but .psgi + application file can still be the same. If you want to write your own frontend that replaces, or adds functionalities to plackup, take a look at the Plack::Runner module. - Plack::Middleware + Plack::Middleware + PSGI middleware is a PSGI application that wraps an existing PSGI application and plays both side of application and servers. From the servers the wrapped code reference still looks like and behaves exactly the same as PSGI applications. - Plack::Middleware gives you an easy way to wrap PSGI applications with a - clean API, and compatibility with Plack::Builder DSL. + Plack::Middleware gives you an easy way to wrap PSGI applications with + a clean API, and compatibility with Plack::Builder DSL. + + Plack::Builder - Plack::Builder - Plack::Builder gives you a DSL that you can enable Middleware in ".psgi" + Plack::Builder gives you a DSL that you can enable Middleware in .psgi files to wrap existent PSGI applications. - Plack::Request, Plack::Response - Plack::Request gives you a nice wrapper API around PSGI $env hash to get - headers, cookies and query parameters much like Apache::Request in + Plack::Request, Plack::Response + + Plack::Request gives you a nice wrapper API around PSGI $env hash to + get headers, cookies and query parameters much like Apache::Request in mod_perl. - Plack::Response does the same to construct the response array reference. + Plack::Response does the same to construct the response array + reference. + + Plack::Test - Plack::Test Plack::Test is a unified interface to test your PSGI application using standard HTTP::Request and HTTP::Response pair with simple callbacks. - Plack::Test::Suite + Plack::Test::Suite + Plack::Test::Suite is a test suite to test a new PSGI server backend. CONTRIBUTING - Patches and Bug Fixes + + Patches and Bug Fixes + Small patches and bug fixes can be either submitted via nopaste on IRC - <irc://irc.perl.org/#plack> or the github issue tracker - <http://github.com/plack/Plack/issues>. Forking on github - <http://github.com/plack/Plack> is another good way if you intend to - make larger fixes. + irc://irc.perl.org/#plack or the github issue tracker + <http://github.com/plack/Plack/issues>. Forking on github is another + good way if you intend to make larger fixes. - See also <http://contributing.appspot.com/plack> when you think this + See also http://contributing.appspot.com/plack when you think this document is terribly outdated. - Module Namespaces - Modules added to the Plack:: sub-namespaces should be reasonably generic - components which are useful as building blocks and not just simply using - Plack. - - Middleware authors are free to use the Plack::Middleware:: namespace for - their middleware components. Middleware must be written in the pipeline - style such that they can chained together with other middleware - components. The Plack::Middleware:: modules in the core distribution are - good examples of such modules. It is recommended that you inherit from - Plack::Middleware for these types of modules. + Module Namespaces + + Modules added to the Plack:: sub-namespaces should be reasonably + generic components which are useful as building blocks and not just + simply using Plack. + + Middleware authors are free to use the Plack::Middleware:: namespace + for their middleware components. Middleware must be written in the + pipeline style such that they can chained together with other + middleware components. The Plack::Middleware:: modules in the core + distribution are good examples of such modules. It is recommended that + you inherit from Plack::Middleware for these types of modules. Not all middleware components are wrappers, but instead are more like endpoints in a middleware chain. These types of components should use @@ -127,15 +144,19 @@ confuse people badly. AUTHOR + Tatsuhiko Miyagawa COPYRIGHT - The following copyright notice applies to all the files provided in this - distribution, including binary files, unless explicitly noted otherwise. + + The following copyright notice applies to all the files provided in + this distribution, including binary files, unless explicitly noted + otherwise. Copyright 2009-2013 Tatsuhiko Miyagawa CORE DEVELOPERS + Tatsuhiko Miyagawa (miyagawa) Tokuhiro Matsuno (tokuhirom) @@ -147,6 +168,7 @@ Graham Knop (haarg) CONTRIBUTORS + Yuval Kogman (nothingmuch) Kazuhiro Osawa (Yappo) @@ -178,15 +200,17 @@ Aaron Trevena SEE ALSO + The PSGI specification upon which Plack is based. - <http://plackperl.org/> + http://plackperl.org/ - The Plack wiki: <https://github.com/plack/Plack/wiki> + The Plack wiki: https://github.com/plack/Plack/wiki - The Plack FAQ: <https://github.com/plack/Plack/wiki/Faq> + The Plack FAQ: https://github.com/plack/Plack/wiki/Faq LICENSE + This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/App/File.pm new/Plack-1.0034/lib/Plack/App/File.pm --- old/Plack-1.0031/lib/Plack/App/File.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/App/File.pm 2015-02-02 21:42:46.000000000 +0100 @@ -51,7 +51,7 @@ @path = ('.'); } - if (grep $_ eq '..', @path) { + if (grep /^\.{2,}$/, @path) { return $self->return_403; } @@ -143,7 +143,7 @@ # Or map the path to a specific file use Plack::Builder; builder { - mount "/favicon.ico" => Plack::App::File->new(file => '/path/to/favicon.ico'); + mount "/favicon.ico" => Plack::App::File->new(file => '/path/to/favicon.ico')->to_app; }; =head1 DESCRIPTION diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/App/WrapCGI.pm new/Plack-1.0034/lib/Plack/App/WrapCGI.pm --- old/Plack-1.0031/lib/Plack/App/WrapCGI.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/App/WrapCGI.pm 2015-02-02 21:42:46.000000000 +0100 @@ -9,6 +9,13 @@ use Carp; use POSIX ":sys_wait_h"; +sub slurp_fh { + my $fh = $_[0]; + local $/; + my $v = <$fh>; + defined $v ? $v : ''; +} + sub prepare_app { my $self = shift; my $script = $self->script @@ -53,19 +60,15 @@ close $stdoutw; close $stdinr; - syswrite($stdinw, do { - local $/; - my $fh = $env->{'psgi.input'}; - <$fh>; - }); + syswrite($stdinw, slurp_fh($env->{'psgi.input'})); # close STDIN so child will stop waiting close $stdinw; my $res = ''; while (waitpid($pid, WNOHANG) <= 0) { - $res .= do { local $/; <$stdoutr> } || ''; + $res .= slurp_fh($stdoutr); } - $res .= do { local $/; <$stdoutr> } || ''; + $res .= slurp_fh($stdoutr); if (POSIX::WIFEXITED($?)) { return CGI::Parse::PSGI::parse_cgi_output(\$res); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Handler/FCGI.pm new/Plack-1.0034/lib/Plack/Handler/FCGI.pm --- old/Plack-1.0031/lib/Plack/Handler/FCGI.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Handler/FCGI.pm 2015-02-02 21:42:46.000000000 +0100 @@ -30,10 +30,19 @@ sub run { my ($self, $app) = @_; + my $running_on_server_starter = exists $ENV{SERVER_STARTER_PORT}; my $sock = 0; if (-S STDIN) { # running from web server. Do nothing # Note it should come before listen check because of plackup's default + } elsif ($running_on_server_starter) { + # Runing under Server::Starter + require Server::Starter; + my %socks = %{Server::Starter::server_ports()}; + if (scalar(keys(%socks)) > 1) { + die "More than one socket are specified by Server::Starter"; + } + $sock = (values %socks)[0]; } elsif ($self->{listen}) { my $old_umask = umask; unless ($self->{leave_umask}) { @@ -60,7 +69,7 @@ my $proc_manager; - if ($self->{listen}) { + if ($self->{listen} or $running_on_server_starter) { $self->daemon_fork if $self->{daemonize}; if ($self->{manager}) { @@ -409,6 +418,14 @@ FcgiPassHeader Authorization +=head2 Server::Starter + +This plack handler supports L<Server::Starter> as a superdaemon. +Simply launch plackup from start_server with a path option. +The listen option is ignored when launched from Server::Starter. + + start_server --path=/tmp/socket -- plackup -s FCGI app.psgi + =head1 SEE ALSO L<Plack> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Loader/Restarter.pm new/Plack-1.0034/lib/Plack/Loader/Restarter.pm --- old/Plack-1.0031/lib/Plack/Loader/Restarter.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Loader/Restarter.pm 2015-02-02 21:42:46.000000000 +0100 @@ -56,9 +56,9 @@ } sub run { - my($self, $server, $builder) = @_; + my($self, $server) = @_; - $self->_fork_and_start($server, $builder); + $self->_fork_and_start($server); return unless $self->{pid}; require Filesys::Notify::Simple; @@ -86,7 +86,7 @@ $self->_kill_child; warn "Successfully killed! Restarting the new server process.\n"; - $self->_fork_and_start($server, $builder); + $self->_fork_and_start($server); return unless $self->{pid}; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Middleware/ErrorDocument.pm new/Plack-1.0034/lib/Plack/Middleware/ErrorDocument.pm --- old/Plack-1.0031/lib/Plack/Middleware/ErrorDocument.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Middleware/ErrorDocument.pm 2015-02-02 21:42:46.000000000 +0100 @@ -72,9 +72,9 @@ my $done; return sub { unless ($done) { + $done = 1; return join '', <$fh>; } - $done = 1; return defined $_[0] ? '' : undef; }; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Middleware/Lint.pm new/Plack-1.0034/lib/Plack/Middleware/Lint.pm --- old/Plack-1.0031/lib/Plack/Middleware/Lint.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Middleware/Lint.pm 2015-02-02 21:42:46.000000000 +0100 @@ -58,7 +58,7 @@ die('SERVER_PORT must not be empty string'); } if (defined($env->{SERVER_PROTOCOL}) and $env->{SERVER_PROTOCOL} !~ m{^HTTP/1.\d$}) { - die("Invalid SERVER_PROTOCOL: $env->{SEREVR_PROTOCOL}"); + die("Invalid SERVER_PROTOCOL: $env->{SERVER_PROTOCOL}"); } for my $param (qw/version url_scheme input errors multithread multiprocess/) { unless (exists $env->{"psgi.$param"}) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Middleware/StackTrace.pm new/Plack-1.0034/lib/Plack/Middleware/StackTrace.pm --- old/Plack-1.0031/lib/Plack/Middleware/StackTrace.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Middleware/StackTrace.pm 2015-02-02 21:42:46.000000000 +0100 @@ -4,6 +4,7 @@ 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 ); @@ -17,12 +18,18 @@ sub call { my($self, $env) = @_; - my $trace; + my ($trace, %string_traces, %ref_traces); local $SIG{__DIE__} = sub { $trace = $StackTraceClass->new( indent => 1, message => munge_error($_[0], [ caller ]), - ignore_package => __PACKAGE__, + ignore_package => __PACKAGE__, no_refs => 1, ); + if (ref $_[0]) { + $ref_traces{refaddr($_[0])} ||= $trace; + } + else { + $string_traces{$_[0]} ||= $trace; + } die @_; }; @@ -34,6 +41,20 @@ [ 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; + } + if ($trace && ($caught || ($self->force && ref $res eq 'ARRAY' && $res->[0] == 500)) ) { my $text = $trace->as_string; my $html = $trace->as_html; @@ -109,9 +130,15 @@ =head1 DESCRIPTION -This middleware catches exceptions (run-time errors) happening in your -application and displays nice stack trace screen. The stack trace is -also stored in the environment as a plaintext and HTML under the key +This middleware uses C<$SIG{__DIE__}> to intercept I<all> exceptions +(run-time errors) happening in your application, even those that are caught. +For each exception it builds a detailed stack trace. + +If the applications aborts by throwing an exception it will be caught and matched +against the saved stack traces. If a match is found it will be displayed as a nice +stack trace screen, if not then the exception will be reported without a stack trace. + +The stack trace is also stored in the environment as a plaintext and HTML under the key C<plack.stacktrace.text> and C<plack.stacktrace.html> respectively, so that middleware further up the stack can reference it. @@ -126,6 +153,19 @@ Catching errors in streaming response is not supported. +=head2 Stack Trace Module + +The L<Devel::StackTrace::WithLexicals> module will be used to capture the stack trace +if the installed version is 0.08 or later. Otherwise L<Devel::StackTrace> is used. + +=head2 Performance + +Gathering the information for a stack trace via L<Devel::StackTrace> is slow, +and L<Devel::StackTrace::WithLexicals> is significantly slower still. +This is not usually a concern in development and when exceptions are rare. +However, your application may include code that's throwing and catching exceptions +that you're not aware of. Such code will run I<significantly> slower with this module. + =head1 CONFIGURATION =over 4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Middleware.pm new/Plack-1.0034/lib/Plack/Middleware.pm --- old/Plack-1.0031/lib/Plack/Middleware.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Middleware.pm 2015-02-02 21:42:46.000000000 +0100 @@ -100,11 +100,16 @@ function in L<Plack::Util> when implementing a post processing middleware. - my $res = $app->($env); - Plack::Util::response_cb($res, sub { - my $res = shift; - # do something with $res; - }); + sub call { + my($self, $env) = @_; + # pre-processing $env + my $res = $app->($env); + + return Plack::Util::response_cb($res, sub { + my $res = shift; + # do something with $res; + }); + } The callback function gets a response as an array reference, and you can update the reference to implement the post-processing. In the normal @@ -119,7 +124,7 @@ sub call { my($self, $env) = @_; my $res = $self->app->($env); - Plack::Util::response_cb($res, sub { + return Plack::Util::response_cb($res, sub { my $res = shift; $res->[0] = 500; return; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Request.pm new/Plack-1.0034/lib/Plack/Request.pm --- old/Plack-1.0031/lib/Plack/Request.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Request.pm 2015-02-02 21:42:46.000000000 +0100 @@ -2,7 +2,7 @@ use strict; use warnings; use 5.008_001; -our $VERSION = '1.0031'; +our $VERSION = '1.0034'; use HTTP::Headers; use Carp (); @@ -325,7 +325,7 @@ my $req = Plack::Request->new($env); my $path_info = $req->path_info; - my $query = $req->param('query'); + my $query = $req->parameters->{query}; my $res = $req->new_response(200); # new Plack::Response $res->finalize; @@ -457,7 +457,7 @@ If there are multiple cookies with the same name in the request, this method will ignore the duplicates and return only the first value. If that causes issues for you, you may have to use modules like -CGI::Simple::Cookie to parse C<<$request->header('Cookies')>> by +CGI::Simple::Cookie to parse C<< $request->header('Cookies') >> by yourself. =item query_parameters @@ -538,8 +538,15 @@ Returns GET and POST parameters with a CGI.pm-compatible param method. This is an alternative method for accessing parameters in -$req->parameters. Unlike CGI.pm, it does I<not> allow -setting or modifying query parameters. +$req->parameters just in case you want the compatibility with +CGI.pm objects. + +You are B<not recommended> to use this method since it is easy to +misuse in a list context such as inside a hash constructor or method +arguments. Use C<parameters> and Hash::MultiValue instead. + +Unlike CGI.pm, it does I<not> allow setting or modifying query +parameters. $value = $req->param( 'foo' ); @values = $req->param( 'foo' ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Response.pm new/Plack-1.0034/lib/Plack/Response.pm --- old/Plack-1.0031/lib/Plack/Response.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Response.pm 2015-02-02 21:42:46.000000000 +0100 @@ -1,7 +1,7 @@ package Plack::Response; use strict; use warnings; -our $VERSION = '1.0031'; +our $VERSION = '1.0034'; use Plack::Util::Accessor qw(body status); use Carp (); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack/Test/Suite.pm new/Plack-1.0034/lib/Plack/Test/Suite.pm --- old/Plack-1.0031/lib/Plack/Test/Suite.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack/Test/Suite.pm 2015-02-02 21:42:46.000000000 +0100 @@ -813,6 +813,9 @@ Plack::Test::Suite->run_server_tests('Foo'); +Developers writing Plack applications should look at C<Plack::Test> for testing, +as subclassing C<Plack::Handler> is for developing server implementations. + =head1 AUTHOR Tokuhiro Matsuno diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/lib/Plack.pm new/Plack-1.0034/lib/Plack.pm --- old/Plack-1.0031/lib/Plack.pm 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/lib/Plack.pm 2015-02-02 21:42:46.000000000 +0100 @@ -3,7 +3,7 @@ use strict; use warnings; use 5.008_001; -our $VERSION = '1.0031'; +our $VERSION = '1.0034'; 1; __END__ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/script/plackup new/Plack-1.0034/script/plackup --- old/Plack-1.0031/script/plackup 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/script/plackup 2015-02-02 21:42:46.000000000 +0100 @@ -10,7 +10,7 @@ =head1 NAME -plackup - Run PSGI application with Plack servers +plackup - Run PSGI application with Plack handlers =head1 SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/t/Plack-Loader/restarter.t new/Plack-1.0034/t/Plack-Loader/restarter.t --- old/Plack-1.0031/t/Plack-Loader/restarter.t 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/t/Plack-Loader/restarter.t 2015-02-02 21:42:46.000000000 +0100 @@ -5,7 +5,9 @@ use HTTP::Request::Common; use Plack::Loader::Restarter; -plan skip_all => "release test only" unless $ENV{AUTHOR_TESTING}; +plan skip_all => "author test only" unless $ENV{AUTHOR_TESTING}; + +$SIG{__WARN__} = sub { diag @_ }; my @return_bodies = ('Hi first', 'Hi second', 'Hi third'); my @restartertestfiles = ('t/restartertestfile1.pl', 't/restartertestfile2.pl'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/t/Plack-Middleware/cgi-bin/hello.cgi new/Plack-1.0034/t/Plack-Middleware/cgi-bin/hello.cgi --- old/Plack-1.0031/t/Plack-Middleware/cgi-bin/hello.cgi 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/t/Plack-Middleware/cgi-bin/hello.cgi 2015-02-02 21:42:46.000000000 +0100 @@ -1,4 +1,4 @@ #!/usr/bin/perl use CGI; my $q = CGI->new; -print $q->header, "Hello ", $q->param('name'), " counter=", ++$COUNTER; +print $q->header, "Hello ", scalar $q->param('name'), " counter=", ++$COUNTER; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/t/Plack-Middleware/cgi-bin/hello2.cgi new/Plack-1.0034/t/Plack-Middleware/cgi-bin/hello2.cgi --- old/Plack-1.0031/t/Plack-Middleware/cgi-bin/hello2.cgi 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/t/Plack-Middleware/cgi-bin/hello2.cgi 2015-02-02 21:42:46.000000000 +0100 @@ -1,4 +1,4 @@ #!/usr/bin/perl use CGI; my $q = CGI->new; -print $q->header, "Hello ", $q->param('name'), " counter=", ++$COUNTER; +print $q->header, "Hello ", scalar $q->param('name'), " counter=", ++$COUNTER; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/t/Plack-Middleware/stacktrace/multiple_exceptions.t new/Plack-1.0034/t/Plack-Middleware/stacktrace/multiple_exceptions.t --- old/Plack-1.0031/t/Plack-Middleware/stacktrace/multiple_exceptions.t 1970-01-01 01:00:00.000000000 +0100 +++ new/Plack-1.0034/t/Plack-Middleware/stacktrace/multiple_exceptions.t 2015-02-02 21:42:46.000000000 +0100 @@ -0,0 +1,123 @@ +use strict; +use warnings; +use Test::More; +use Plack::Middleware::StackTrace; +use Plack::Test; +use HTTP::Request::Common; + +{ + # Simple exception object + package Plack::Middleware::StackTrace::Exception; + + use overload '""' => sub { $_[0]->{message} }; + + sub new { + my ($class, $message) = @_; + return bless { message => $message }, $class; + } +} + +# Tracks how often the destructor was called +my $dtor_count; + +{ + # A class similar to DBIx::Class::Storage::TxnScopeGuard where the + # destructor might throw and catch another exception. + package Plack::Middleware::StackTrace::Guard; + use Try::Tiny; + + sub new { + my ($class, $exception) = @_; + return bless { exception => $exception }, $class; + } + + sub DESTROY { + my $self = shift; + ++$dtor_count; + try { die $self->{exception}; }; + } +} + +sub test_dtor_exception { + my ($orig_exception, $dtor_exception) = @_; + + my $dtor_exception_app = sub { + my $guard = Plack::Middleware::StackTrace::Guard->new($dtor_exception); + die $orig_exception; + }; + + my $trace_app = Plack::Middleware::StackTrace->wrap($dtor_exception_app, + no_print_errors => 1, + ); + + test_psgi $trace_app, sub { + my $cb = shift; + + $dtor_count = 0; + my $req = GET "/"; + my $res = $cb->($req); + + is $res->code, 500, "Status code is 500"; + like $res->content, qr/^\Q$orig_exception\E at /, + "Original exception returned"; + is $dtor_count, 1, "Destructor called only once"; + }; +} + +test_dtor_exception("urz", "orz"); +test_dtor_exception( + Plack::Middleware::StackTrace::Exception->new("urz"), + Plack::Middleware::StackTrace::Exception->new("orz"), +); + +{ + # A middleware that rethrows exceptions + package Plack::Middleware::StackTrace::Rethrow; + use parent qw(Plack::Middleware); + use Try::Tiny; + + sub call { + my ($self, $env) = @_; + try { + $self->app->($env); + } catch { + die $_; + }; + } +} + +# This sub is expected to appear in the stack trace. +sub fizzle { + my $exception = shift; + die $exception; +} + +sub test_rethrown_exception { + my $exception = shift; + + my $die_app = sub { + fizzle($exception); + }; + + my $rethrow_app = Plack::Middleware::StackTrace::Rethrow->wrap($die_app); + + my $trace_app = Plack::Middleware::StackTrace->wrap($rethrow_app, + no_print_errors => 1, + ); + + test_psgi $trace_app, sub { + my $cb = shift; + + my $req = GET "/"; + my $res = $cb->($req); + + is $res->code, 500, "Status code is 500"; + like $res->content, qr/\bfizzle\b/, "Original stack trace returned"; + }; +} + +test_rethrown_exception("orz"); +test_rethrown_exception(Plack::Middleware::StackTrace::Exception->new("orz")); + +done_testing; + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Plack-1.0031/t/Plack-Middleware/wrapcgi_exec.t new/Plack-1.0034/t/Plack-Middleware/wrapcgi_exec.t --- old/Plack-1.0031/t/Plack-Middleware/wrapcgi_exec.t 2014-08-01 22:19:17.000000000 +0200 +++ new/Plack-1.0034/t/Plack-Middleware/wrapcgi_exec.t 2015-02-02 21:42:46.000000000 +0100 @@ -15,7 +15,7 @@ #!$^X use CGI; my \$q = CGI->new; -print \$q->header, "Hello ", \$q->param('name'), " counter=", ++\$COUNTER; +print \$q->header, "Hello ", scalar \$q->param('name'), " counter=", ++\$COUNTER; ... close $tmp;
