Compiler-Parser
view release on metacpan or search on metacpan
t/app/Plack/Handler/Apache1.t view on Meta::CPAN
},
right => branch { '=>',
left => leaf 'psgi.url_scheme',
right => three_term_operator { '?',
cond => branch { '=~',
left => branch { '||',
left => hash { '$ENV',
key => hash_ref { '{}',
data => leaf 'HTTPS',
},
},
right => leaf 'off',
},
right => regexp { '^(?:on|1)$',
option => leaf 'i',
},
},
true_expr => leaf 'https',
false_expr => leaf 'http',
},
},
},
right => branch { '=>',
left => leaf 'psgi.input',
right => leaf '$r',
},
},
right => branch { '=>',
left => leaf 'psgi.errors',
right => single_term_operator { '*',
expr => handle { 'STDERR',
},
},
},
},
right => branch { '=>',
left => leaf 'psgi.multithread',
right => function_call { 'Plack::Util::FALSE',
args => [
],
},
},
},
right => branch { '=>',
left => leaf 'psgi.multiprocess',
right => function_call { 'Plack::Util::TRUE',
args => [
],
},
},
},
right => branch { '=>',
left => leaf 'psgi.run_once',
right => function_call { 'Plack::Util::FALSE',
args => [
],
},
},
},
right => branch { '=>',
left => leaf 'psgi.streaming',
right => function_call { 'Plack::Util::TRUE',
args => [
],
},
},
},
right => branch { '=>',
left => leaf 'psgi.nonblocking',
right => function_call { 'Plack::Util::FALSE',
args => [
],
},
},
},
right => branch { '=>',
left => leaf 'psgix.harakiri',
right => function_call { 'Plack::Util::TRUE',
args => [
],
},
},
},
},
},
},
if_stmt { 'if',
expr => function_call { 'defined',
args => [
branch { '=',
left => leaf '$HTTP_AUTHORIZATION',
right => branch { '->',
left => branch { '->',
left => leaf '$r',
right => function_call { 'headers_in',
args => [
],
},
},
right => hash_ref { '{}',
data => leaf 'Authorization',
},
},
},
],
},
true_stmt => branch { '=',
left => branch { '->',
left => leaf '$env',
right => hash_ref { '{}',
data => leaf 'HTTP_AUTHORIZATION',
},
},
right => leaf '$HTTP_AUTHORIZATION',
},
},
branch { '=',
left => leaf '$vpath',
right => branch { '.',
left => branch { '->',
left => leaf '$env',
t/app/Plack/Handler/Apache1.t view on Meta::CPAN
__DATA__
package Plack::Handler::Apache1;
use strict;
use Apache::Request;
use Apache::Constants qw(:common :response);
use Plack::Util;
use Scalar::Util;
my %apps; # psgi file to $app mapping
sub new { bless {}, shift }
sub preload {
my $class = shift;
for my $app (@_) {
$class->load_app($app);
}
}
sub load_app {
my($class, $app) = @_;
return $apps{$app} ||= do {
# Trick Catalyst, CGI.pm, CGI::Cookie and others that check
# for $ENV{MOD_PERL}.
#
# Note that we delete it instead of just localizing
# $ENV{MOD_PERL} because some users may check if the key
# exists, and we do it this way because "delete local" is new
# in 5.12:
# http://perldoc.perl.org/5.12.0/perldelta.html#delete-local
local $ENV{MOD_PERL};
delete $ENV{MOD_PERL};
Plack::Util::load_psgi $app;
};
}
sub handler {
my $class = __PACKAGE__;
my $r = shift;
my $psgi = $r->dir_config('psgi_app');
$class->call_app($r, $class->load_app($psgi));
}
sub call_app {
my ($class, $r, $app) = @_;
$r->subprocess_env; # let Apache create %ENV for us :)
my $env = {
%ENV,
'psgi.version' => [ 1, 1 ],
'psgi.url_scheme' => ($ENV{HTTPS}||'off') =~ /^(?:on|1)$/i ? 'https' : 'http',
'psgi.input' => $r,
'psgi.errors' => *STDERR,
'psgi.multithread' => Plack::Util::FALSE,
'psgi.multiprocess' => Plack::Util::TRUE,
'psgi.run_once' => Plack::Util::FALSE,
'psgi.streaming' => Plack::Util::TRUE,
'psgi.nonblocking' => Plack::Util::FALSE,
'psgix.harakiri' => Plack::Util::TRUE,
};
if (defined(my $HTTP_AUTHORIZATION = $r->headers_in->{Authorization})) {
$env->{HTTP_AUTHORIZATION} = $HTTP_AUTHORIZATION;
}
my $vpath = $env->{SCRIPT_NAME} . ($env->{PATH_INFO} || '');
my $location = $r->location || "/";
$location =~ s{/$}{};
(my $path_info = $vpath) =~ s/^\Q$location\E//;
$env->{SCRIPT_NAME} = $location;
$env->{PATH_INFO} = $path_info;
my $res = $app->($env);
if (ref $res eq 'ARRAY') {
_handle_response($r, $res);
}
elsif (ref $res eq 'CODE') {
$res->(sub {
_handle_response($r, $_[0]);
});
}
else {
die "Bad response $res";
}
if ($env->{'psgix.harakiri.commit'}) {
$r->child_terminate;
}
return OK;
}
sub _handle_response {
my ($r, $res) = @_;
my ($status, $headers, $body) = @{ $res };
my $hdrs = ($status >= 200 && $status < 300)
? $r->headers_out : $r->err_headers_out;
Plack::Util::header_iter($headers, sub {
my($h, $v) = @_;
if (lc $h eq 'content-type') {
$r->content_type($v);
} else {
$hdrs->add($h => $v);
}
});
$r->status($status);
$r->send_http_header;
if (defined $body) {
if (Plack::Util::is_real_fh($body)) {
$r->send_fd($body);
( run in 0.647 second using v1.01-cache-2.11-cpan-140bd7fdf52 )