/usr/share/perl5/Plack/Loader.pm is in libplack-perl 1.0042-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | package Plack::Loader;
use strict;
use Carp ();
use Plack::Util;
use Try::Tiny;
sub new {
my $class = shift;
bless {}, $class;
}
sub watch {
# do nothing. Override in subclass
}
sub auto {
my($class, @args) = @_;
my $backend = $class->guess
or Carp::croak("Couldn't auto-guess server server implementation. Set it with PLACK_SERVER");
my $server = try {
$class->load($backend, @args);
} catch {
if (($ENV{PLACK_ENV}||'') eq 'development' or !/^Can't locate /) {
warn "Autoloading '$backend' backend failed. Falling back to the Standalone. ",
"(You might need to install Plack::Handler::$backend from CPAN. Caught error was: $_)\n"
if $ENV{PLACK_ENV} && $ENV{PLACK_ENV} eq 'development';
}
$class->load('Standalone' => @args);
};
return $server;
}
sub load {
my($class, $server, @args) = @_;
my($server_class, $error);
try {
$server_class = Plack::Util::load_class($server, 'Plack::Handler');
} catch {
$error ||= $_;
};
if ($server_class) {
$server_class->new(@args);
} else {
die $error;
}
}
sub preload_app {
my($self, $builder) = @_;
$self->{app} = $builder->();
}
sub guess {
my $class = shift;
my $env = $class->env;
return $env->{PLACK_SERVER} if $env->{PLACK_SERVER};
if ($env->{PHP_FCGI_CHILDREN} || $env->{FCGI_ROLE} || $env->{FCGI_SOCKET_PATH}) {
return "FCGI";
} elsif ($env->{GATEWAY_INTERFACE}) {
return "CGI";
} elsif (exists $INC{"Coro.pm"}) {
return "Corona";
} elsif (exists $INC{"AnyEvent.pm"}) {
return "Twiggy";
} elsif (exists $INC{"POE.pm"}) {
return "POE";
} else {
return "Standalone";
}
}
sub env { \%ENV }
sub run {
my($self, $server, $builder) = @_;
$server->run($self->{app});
}
1;
__END__
=head1 NAME
Plack::Loader - (auto)load Plack Servers
=head1 SYNOPSIS
# auto-select server backends based on env vars
use Plack::Loader;
Plack::Loader->auto(%args)->run($app);
# specify the implementation with a name
Plack::Loader->load('FCGI', %args)->run($app);
=head1 DESCRIPTION
Plack::Loader is a factory class to load one of Plack::Handler subclasses based on the environment.
=head1 AUTOLOADING
C<< Plack::Loader->auto(%args) >> will autoload the most correct
server implementation by guessing from environment variables and Perl INC
hashes.
=over 4
=item PLACK_SERVER
env PLACK_SERVER=AnyEvent ...
Plack users can specify the specific implementation they want to load
using the C<PLACK_SERVER> environment variable.
=item PHP_FCGI_CHILDREN, GATEWAY_INTERFACE
If there's one of FastCGI or CGI specific environment variables set,
use the corresponding server implementation.
=item %INC
If one of L<AnyEvent>, L<Coro> or L<POE> is loaded, the relevant
server implementation such as L<Twiggy>, L<Corona> or
L<POE::Component::Server::PSGI> will be loaded, if they're available.
=back
=cut
|