Initial import of Catalyst::Plugin::Authenticate::FTP, Catalyst::Plugin::Authenticate...
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / HTTP / Daemon.pm
1 package Catalyst::Engine::HTTP::Daemon;
2
3 use strict;
4 use base 'Catalyst::Engine::HTTP::Base';
5
6 use IO::Socket qw(AF_INET INADDR_ANY SOCK_STREAM SOMAXCONN );
7
8 =head1 NAME
9
10 Catalyst::Engine::HTTP::Daemon - Catalyst HTTP Daemon Engine
11
12 =head1 SYNOPSIS
13
14 A script using the Catalyst::Engine::HTTP::Daemon module might look like:
15
16     #!/usr/bin/perl -w
17
18     BEGIN {  $ENV{CATALYST_ENGINE} = 'HTTP::Daemon' }
19
20     use strict;
21     use lib '/path/to/MyApp/lib';
22     use MyApp;
23
24     MyApp->run;
25
26 =head1 DESCRIPTION
27
28 This is the Catalyst engine specialized for development and testing.
29
30 =head1 OVERLOADED METHODS
31
32 This class overloads some methods from C<Catalyst::Engine::HTTP::Base>.
33
34 =over 4
35
36 =item $c->run
37
38 =cut
39
40 $SIG{'PIPE'} = 'IGNORE';
41
42 sub run {
43     my $class = shift;
44     my $port  = shift || 3000;
45     
46     $HTTP::Daemon::PROTO = 'HTTP/1.0'; # For now until we resolve the blocking 
47                                        # issues with HTTP 1.1
48
49     my $daemon = Catalyst::Engine::HTTP::Daemon::Catalyst->new(
50         Listen    => SOMAXCONN,
51         LocalPort => $port,
52         ReuseAddr => 1,
53         Type      => SOCK_STREAM,
54     );
55
56     unless ($daemon) {
57         die("Failed to create daemon: $!\n");
58     }
59
60     my $base = URI->new( $daemon->url )->canonical;
61
62     printf( "You can connect to your server at %s\n", $base );
63
64     while ( my $connection = $daemon->accept ) {
65
66         $connection->timeout(5);
67
68         while ( my $request = $connection->get_request ) {
69
70             $request->uri->scheme('http');    # Force URI::http
71             $request->uri->host( $request->header('Host') || $base->host );
72             $request->uri->port( $base->port );
73             
74             my $hostname = gethostbyaddr( $connection->peeraddr, AF_INET );
75
76             my $http = Catalyst::Engine::HTTP::Base::struct->new(
77                 address  => $connection->peerhost,
78                 hostname => $hostname || $connection->peerhost,
79                 request  => $request,
80                 response => HTTP::Response->new
81             );
82
83             $class->handler($http);
84             $connection->send_response( $http->response );
85         }
86
87         $connection->close;
88         undef($connection);
89     }
90 }
91
92 =back
93
94 =head1 SEE ALSO
95
96 L<Catalyst>, L<Catalyst::Engine>, L<Catalyst::Engine::HTTP::Base>, 
97 L<HTTP::Daemon>.
98
99 =head1 AUTHOR
100
101 Sebastian Riedel, C<sri@cpan.org>
102 Christian Hansen, C<ch@ngmedia.com>
103
104 =head1 COPYRIGHT
105
106 This program is free software, you can redistribute it and/or modify it under
107 the same terms as Perl itself.
108
109 =cut
110
111 package Catalyst::Engine::HTTP::Daemon::Catalyst;
112
113 use strict;
114 use base 'HTTP::Daemon';
115
116 sub product_tokens {
117     "Catalyst/$Catalyst::VERSION";
118 }
119
120 1;