POE-Component-FastCGI
view release on metacpan or search on metacpan
lib/POE/Component/FastCGI.pm view on Meta::CPAN
# XXX: check fastcgi is allowed to connect.
my $wheel = POE::Wheel::ReadWrite->new(
Handle => $socket,
Driver => POE::Driver::SysRW->new(),
Filter => POE::Filter::FastCGI->new(),
InputEvent => 'input',
ErrorEvent => 'error'
);
$heap->{wheels}->{$wheel->ID} = $wheel;
}
sub _input {
my($heap, $session, $kernel, $fcgi, $wheel_id) = @_[HEAP, SESSION, KERNEL, ARG0, ARG1];
my $client = $heap->{wheels}->{$wheel_id};
my $request = POE::Component::FastCGI::Request->new(
$client, $session->ID,
$fcgi->[0], # request id
$fcgi->[2], # cgi parameters
$fcgi->[1]->{postdata}
);
if($fcgi->[1]->{role} eq 'AUTHORIZER') {
if(defined $heap->{Auth}) {
$heap->{Auth}->($request);
}else{
$request->error(500, "FastCGI authorizer role requested but not configured");
}
return;
}
my $path = $request->uri->path;
my $run;
for my $handler(@{$heap->{Handlers}}) {
if(ref $handler->[0] eq 'Regexp') {
$run = $handler, last if $path =~ /$handler->[0]/;
}else{
$run = $handler, last if
(($handler->[0] !~ m!/! and $path =~ m!^/$handler->[0]($|/)!) or
($handler->[0] eq $path));
}
}
if(not defined $run) {
$request->error(404, "No handler found for $path");
}else{
if(ref($run->[1]) eq 'CODE' or $run->[1]->isa('POE::Session::AnonEvent') ) {
$run->[1]->($request, $run->[0]);
} else {
$kernel->post($heap->{Session}, $run->[1],$request, $run->[0]);
}
if($request->{_res}) {
# Streaming support
if($request->{_res}->streaming) {
push @{$heap->{toclose}->{$wheel_id}}, $request->{_res};
} else {
# Send and break circular ref
$request->{_res}->send if exists $request->{_res}->{client};
$request->{_res} = 0;
}
}
}
}
sub _error {
my($heap, $wheel_id) = @_[HEAP, ARG3];
if(exists $heap->{toclose}->{$wheel_id}) {
for(@{$heap->{toclose}->{$wheel_id}}) {
$_->closed;
}
delete $heap->{toclose}->{$wheel_id};
}
delete $heap->{wheels}->{$wheel_id};
undef;
}
sub _client_shutdown {
my($heap, $wheel_id) = @_[HEAP, ARG0];
delete $heap->{wheels}->{$wheel_id};
undef;
}
sub _shutdown {
my($heap, $kernel) = @_[HEAP, KERNEL];
return unless defined $heap->{server};
# Tell TCP server to shutdown
$kernel->post($heap->{server}, 'shutdown');
delete $heap->{server};
}
# these are here to help PoCo::FastCGI::Response
# to deal with it's wheel from the right session
sub _w_send {
my($resp) = $_[ARG0];
$resp->_send();
}
sub _w_write {
my($resp, $out) = @_[ARG0, ARG1];
$resp->_write($out);
}
sub _w_close {
my($resp, $out) = @_[ARG0, ARG1];
$resp->_close($out);
}
1;
( run in 1.094 second using v1.01-cache-2.11-cpan-39bf76dae61 )