Take me over?
NAME
Plack::App::FakeApache - Wrapping mod_perl2 applications in Plack
SYNOPSIS
use Plack::App::FakeApache;
my $app = Plack::App::FakeApache->new(
response_handler => "My::ResponseHandler"
dir_config => { ... }
)->to_app;
DESCRIPTION
Plack::App::FakeApache transforms a mod_perl2 application into a PSGI application
NOTICE
This is Proof of Concept code originating in the mocking code developed to test an internal very non-trivial mod_perl2 application. Features have been added on a need to have basis.
This code has been extended to make a different non-trivial mod_perl app work under plack too. If you need to use this module for serious work you will almost certainly need to read and modify the source. Contributions welcomed.
CONFIGURATION
*_handler arguments support multiple "stacked" handlers if passed as an arrayref.
- authen_handler
- authz_handler
- response_handler (required)
- handler (alias for response_handler)
-
Handlers for the respective request phases. Pass a blessed object, a class name or use the
Class->method
syntax. See the mod_perl docs for calling conventions. - request_class
-
If you want to subclass Plack::App::FakeApache::Request do so here. Make sure that your subclass inherits from Plack::App::FakeApache::Request (duh). This is for use in situations where you've subclasssed Apache2::Request and want to make it work under PSGI.
- without_cgi
-
CGI.pm does bad things to STDIN and ENV. If your mod_perl app uses these, but your're transitioning away from CGI.pm (e.g. in order to support POST parameters with your app running under Plack::Client), then you can selectively set this to false. For example:
my $app = Plack::App::FakeApache->new({ handler => 'MyApp', without_cgi => 1, })->to_app; my $client = Plack::Client->new( 'psgi-local' => { apps => { myapp => $app } } ); my $res = $client->post('psgi-local://myapp/path/to/wherever', [], { parms => 'go', here => 'yeah' });
- dir_config
-
Hash used to resolve $req->dir_config() requests. Defaults to an empty hashref.
- root
-
Root directory of the file system (optional, defaults to the current working directory)
- logger
-
The destination of the log messages (i.e. the errorlog). This should be a file handle
- request_args
-
Aditional args passed to the fake request object. E.g. auth_name and auth_type.
APACHE METHODS
The following methods from Apache2::RequestRec and mixins are supported:
- headers_in
- headers_out
- subprecess_env
- dir_config
- method
- unparsed_uri
- uri
- user
- hostname
- content_type
- content_encoding
- status
- log_reason (implemented as a no-op)
- read
- write
- filename
- construct_url
- auth_type
- auth_name
- is_initial_req
PLACK METHODS
A few methods have been added to the interface to enable interaction with Plack:
- plack_request
-
Returns the underling Plack::Request object
- plack_response
-
Returns the underlying Plack::Response object. During the request phase this is incomplete.
- finalize
-
Fills information into the response object and finalizes it.
MOD_PERL OVERRIDES
mod_perl overrides exit with ModPerl::Util. The way I (kd) have handled this was that in order to avoid the horrors of overriding CORE::GLOBAL::EXIT was to have a subroutine main::legacy_exit defined in the startup.pl or in the .psgi file which calls die "EXIT 0". Meanwhile this specific exception is ignored by Plack::APP::FakeApache.
TODO: There are other circumstances where exception handling routines in upstream legacy mod_perl code are insufficiently well structured to catch at the plack level, so the exception handling won't catch them. In this situation a user configurable list of exception content earmarked for custom handling is desirable (e.g. where a 500 error really ought to be treated as a 404). I intend to implement this some time RSN.
AUTHOR
Kieren Diment zarquon@cpan.org. Peter Makholm, peter@makholm.net