Fixed args handling in forward
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / FastCGI.pm
CommitLineData
d1d9793f 1package Catalyst::Engine::FastCGI;
ffb41d94 2
3use strict;
fbcc39ad 4use base 'Catalyst::Engine::CGI';
5use FCGI;
ffb41d94 6
7=head1 NAME
8
fbcc39ad 9Catalyst::Engine::FastCGI - FastCGI Engine
ffb41d94 10
11=head1 DESCRIPTION
12
fbcc39ad 13This is the FastCGI engine.
ffb41d94 14
e2fd5b5f 15=head1 OVERLOADED METHODS
16
fbcc39ad 17This class overloads some methods from C<Catalyst::Engine::CGI>.
e2fd5b5f 18
19=over 4
20
5898abae 21=item $self->run($c, $listen, { option => value, ... })
22
23Starts the FastCGI server. If C<$listen> is set, then it specifies a
24location to listen for FastCGI requests;
25
26 Form Meaning
27 /path listen via Unix sockets on /path
28 :port listen via TCP on port on all interfaces
29 hostname:port listen via TCP on port bound to hostname
30
31Options may also be specified;
32
33 Option Meaning
34 leave_umask Set to 1 to disable setting umask to 0
35 for socket open
36 nointr Do not allow the listener to be
37 interrupted by Ctrl+C
38 nproc Specify a number of processes for
39 FCGI::ProcManager
e2fd5b5f 40
41=cut
42
fbcc39ad 43sub run {
5898abae 44 my ( $self, $class, $listen, $options ) = @_;
45
46 my $sock;
47 if ($listen) {
48 my $old_umask = umask;
49 unless ( $options->{leave_umask} ) {
50 umask(0);
51 }
52 $sock = FCGI::OpenSocket( $listen, 100 )
53 or die "failed to open FastCGI socket; $!";
54 unless ( $options->{leave_umask} ) {
55 umask($old_umask);
56 }
57 }
58 else {
59 -S STDIN
60 or die "STDIN is not a socket; specify a listen location";
61 }
62
63 $options ||= {};
e2fd5b5f 64
5898abae 65 my $request =
66 FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%ENV, $sock,
67 ( $options->{nointr} ? 0 : &FCGI::FAIL_ACCEPT_ON_INTR ),
68 );
69
70 my $proc_manager;
71
72 if ( $listen and ( $options->{nproc} || 1 ) > 1 ) {
73 require FCGI::ProcManager;
74 $proc_manager =
75 FCGI::ProcManager->new( { n_processes => $options->{nproc} } );
76 $proc_manager->pm_manage();
77 }
e2fd5b5f 78
fbcc39ad 79 while ( $request->Accept >= 0 ) {
5898abae 80 $proc_manager && $proc_manager->pm_pre_dispatch();
fbcc39ad 81 $class->handle_request;
5898abae 82 $proc_manager && $proc_manager->pm_pre_dispatch();
fbcc39ad 83 }
e2fd5b5f 84}
85
fbcc39ad 86=item $self->write($c, $buffer)
e2fd5b5f 87
88=cut
89
fbcc39ad 90sub write {
91 my ( $self, $c, $buffer ) = @_;
4f5ebacd 92
fbcc39ad 93 unless ( $self->{_prepared_write} ) {
4f5ebacd 94 $self->prepare_write($c);
fbcc39ad 95 $self->{_prepared_write} = 1;
96 }
4f5ebacd 97
fbcc39ad 98 # FastCGI does not stream data properly if using 'print $handle',
99 # but a syswrite appears to work properly.
4f5ebacd 100 *STDOUT->syswrite($buffer);
e2fd5b5f 101}
102
fbcc39ad 103=back
e2fd5b5f 104
fbcc39ad 105=head1 SEE ALSO
e2fd5b5f 106
fbcc39ad 107L<Catalyst>, L<FCGI>.
cd3bb248 108
fbcc39ad 109=head1 AUTHORS
ffb41d94 110
fbcc39ad 111Sebastian Riedel, <sri@cpan.org>
ffb41d94 112
fbcc39ad 113Christian Hansen, <ch@ngmedia.com>
ffb41d94 114
fbcc39ad 115Andy Grundman, <andy@hybridized.org>
ffb41d94 116
117=head1 COPYRIGHT
118
119This program is free software, you can redistribute it and/or modify it under
120the same terms as Perl itself.
121
122=cut
123
1241;