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 - coolo@suse.com
+
+- 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 ",
- "Alex J. G. Burzyński ",
+ "Ævar Arnfjörð Bjarmason ",
"Alexandr Ciornii ",
+ "Alex J. G. Burzyński ",
"Andrew Rodland ",
"Andy Wardley ",
"Aristotle Pagaltzis ",
"Arthur Axel 'fREW' Schmidt ",
+ "Ashley Pond V ",
"Ask Bjørn Hansen ",
"Ben Morrow ",
"Bernhard Graf ",
"Chad Granum ",
+ "chansen ",
"Chia-liang Kao ",
+ "cho45 ",
"Christian Walde ",
+ "chromatic ",
"Cosimo Streppone ",
"Daisuke Maki ",
"Daisuke Murase ",
+ "Dave Marr ",
"Dave Rolsky ",
"David E. Wheeler ",
"David Steinbrunner ",
"Eduardo Arino de la Rubia ",
+ "Eric Johnson ",
+ "Fabrice Gabolde ",
+ "fayland ",
"Florian Ragwitz ",
+ "franck cuny ",
+ "fREW Schmidt ",
"Graham Knop ",
"Grant McLean ",
- "HIROSE Masaaki ",
"Hans Dieter Pearcey ",
+ "Haruka Iwao ",
"Henry Baragar ",
+ "hiratara ",
+ "HIROSE Masaaki ",
"Hiroshi Sakai ",
"Jakob Voss ",
"Jakob Voss ",
@@ -135,12 +149,15 @@
"John Napiorkowski ",
"Jonathan Swartz ",
"Justin Davis ",
+ "kakuno ",
"Kang-min Liu ",
"Karen Etheridge ",
"Kazuho Oku ",
"Keedi Kim ",
"Lee Aylward ",
+ "leedo ",
"Leo Lapworth ",
+ "mala ",
"Marian Schubert ",
"Mark Fowler ",
"Mark Stosberg ",
@@ -153,12 +170,14 @@
"Oliver Gorwits ",
"Oliver Paukstadt ",
"Olivier Mengué ",
+ "osfameron ",
"Panu Ervamaa ",
"Paul Driver ",
"Pedro Melo ",
"Peter Flanigan ",
"Peter Makholm ",
"Piotr Roszatycki ",
+ "punytan ",
"Rafael Kitover ",
"Randy Stauner ",
"Ray Miller ",
@@ -172,29 +191,18 @@
"Stevan Little ",
"Stuart A Johnston ",
"Takeshi OKURA ",
+ "Tatsuhiko Miyagawa ",
+ "Tim Bunce ",
"Tokuhiro Matsuno ",
- "Tom Heady ",
"Tomas Doran ",
+ "Tom Heady ",
+ "vti ",
"Wallace Reis ",
+ "xaicron ",
"Yann Kerherve ",
+ "yappo ",
"Yury Zavarin ",
"Yuval Kogman ",
- "chansen ",
- "cho45 ",
- "chromatic ",
- "fREW Schmidt ",
- "fayland ",
- "franck cuny ",
- "hiratara ",
- "kakuno ",
- "leedo ",
- "mala ",
- "osfameron ",
- "punytan ",
- "vti ",
- "xaicron ",
- "yappo ",
- "Ævar Arnfjörð Bjarmason ",
"唐鳳 "
]
}
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 '
- - 'Alex J. G. Burzyński '
+ - 'Ævar Arnfjörð Bjarmason '
- 'Alexandr Ciornii '
+ - 'Alex J. G. Burzyński '
- 'Andrew Rodland '
- 'Andy Wardley '
- 'Aristotle Pagaltzis '
- "Arthur Axel 'fREW' Schmidt "
+ - 'Ashley Pond V '
- 'Ask Bjørn Hansen '
- 'Ben Morrow '
- 'Bernhard Graf '
- 'Chad Granum '
+ - 'chansen '
- 'Chia-liang Kao '
+ - 'cho45 '
- 'Christian Walde '
+ - 'chromatic '
- 'Cosimo Streppone '
- 'Daisuke Maki '
- 'Daisuke Murase '
+ - 'Dave Marr '
- 'Dave Rolsky '
- 'David E. Wheeler '
- 'David Steinbrunner '
- 'Eduardo Arino de la Rubia '
+ - 'Eric Johnson '
+ - 'Fabrice Gabolde '
+ - 'fayland '
- 'Florian Ragwitz '
+ - 'franck cuny '
+ - 'fREW Schmidt '
- 'Graham Knop '
- 'Grant McLean '
- - 'HIROSE Masaaki '
- 'Hans Dieter Pearcey '
+ - 'Haruka Iwao '
- 'Henry Baragar '
+ - 'hiratara '
+ - 'HIROSE Masaaki '
- 'Hiroshi Sakai '
- 'Jakob Voss '
- 'Jakob Voss '
@@ -84,12 +97,15 @@
- 'John Napiorkowski '
- 'Jonathan Swartz '
- 'Justin Davis '
+ - 'kakuno '
- 'Kang-min Liu '
- 'Karen Etheridge '
- 'Kazuho Oku '
- 'Keedi Kim '
- 'Lee Aylward '
+ - 'leedo '
- 'Leo Lapworth '
+ - 'mala '
- 'Marian Schubert '
- 'Mark Fowler '
- 'Mark Stosberg '
@@ -102,12 +118,14 @@
- 'Oliver Gorwits '
- 'Oliver Paukstadt '
- 'Olivier Mengué '
+ - 'osfameron '
- 'Panu Ervamaa '
- 'Paul Driver '
- 'Pedro Melo '
- 'Peter Flanigan '
- 'Peter Makholm '
- 'Piotr Roszatycki '
+ - 'punytan '
- 'Rafael Kitover '
- 'Randy Stauner '
- 'Ray Miller '
@@ -121,27 +139,16 @@
- 'Stevan Little '
- 'Stuart A Johnston '
- 'Takeshi OKURA '
+ - 'Tatsuhiko Miyagawa '
+ - 'Tim Bunce '
- 'Tokuhiro Matsuno '
- - 'Tom Heady '
- 'Tomas Doran '
+ - 'Tom Heady '
+ - 'vti '
- 'Wallace Reis '
+ - 'xaicron '
- 'Yann Kerherve '
+ - 'yappo '
- 'Yury Zavarin '
- 'Yuval Kogman '
- - 'chansen '
- - 'cho45 '
- - 'chromatic '
- - 'fREW Schmidt '
- - 'fayland '
- - 'franck cuny '
- - 'hiratara '
- - 'kakuno '
- - 'leedo '
- - 'mala '
- - 'osfameron '
- - 'punytan '
- - 'vti '
- - 'xaicron '
- - 'yappo '
- - 'Ævar Arnfjörð Bjarmason '
- '唐鳳 '
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 LServer::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 and C 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 LDevel::StackTrace::WithLexicals module will be used to capture the stack trace
+if the installed version is 0.08 or later. Otherwise LDevel::StackTrace is used.
+
+=head2 Performance
+
+Gathering the information for a stack trace via LDevel::StackTrace is slow,
+and LDevel::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 LPlack::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 CPlack::Test for testing,
+as subclassing CPlack::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;