Fixed: don't autmoatically resolve hostnames
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / HTTP / Daemon.pm
index b8e0a09..92faf42 100644 (file)
@@ -1,9 +1,9 @@
 package Catalyst::Engine::HTTP::Daemon;
 
 use strict;
-use base 'Catalyst::Engine::HTTP';
+use base 'Catalyst::Engine::HTTP::Base';
 
-use IO::Socket qw(AF_INET);
+use IO::Socket qw( SOCK_STREAM SOMAXCONN );
 
 =head1 NAME
 
@@ -15,9 +15,7 @@ A script using the Catalyst::Engine::HTTP::Daemon module might look like:
 
     #!/usr/bin/perl -w
 
-    BEGIN { 
-       $ENV{CATALYST_ENGINE} = 'HTTP::Daemon';
-    }
+    BEGIN {  $ENV{CATALYST_ENGINE} = 'HTTP::Daemon' }
 
     use strict;
     use lib '/path/to/MyApp/lib';
@@ -31,49 +29,69 @@ This is the Catalyst engine specialized for development and testing.
 
 =head1 OVERLOADED METHODS
 
-This class overloads some methods from C<Catalyst::Engine::HTTP>.
+This class overloads some methods from C<Catalyst::Engine::HTTP::Base>.
 
 =over 4
 
-=item $c->run
+=item $c->handler
 
 =cut
 
-$SIG{'PIPE'} = 'IGNORE';
+sub handler {
+    my ( $class, $client ) = @_;
+
+    $client->timeout(5);
+
+    while ( my $request = $client->get_request ) {
+
+        $request->uri->scheme('http');    # Force URI::http
+        $request->uri->host( $request->header('Host') || $client->sockhost );
+        $request->uri->port( $client->sockport );
+
+        my $http = Catalyst::Engine::HTTP::Base::struct->new(
+            address  => $client->peerhost,
+            request  => $request,
+            response => HTTP::Response->new
+        );
+
+        $class->SUPER::handler($http);
+
+        $client->send_response( $http->response );
+    }
+
+    $client->close;
+}
+
+=item $c->run
+
+=cut
 
 sub run {
     my $class = shift;
     my $port  = shift || 3000;
+    
+    $SIG{'PIPE'} = 'IGNORE';
+    
+    $HTTP::Daemon::PROTO = 'HTTP/1.0'; # For now until we resolve the blocking 
+                                       # issues with HTTP 1.1
 
     my $daemon = Catalyst::Engine::HTTP::Daemon::Catalyst->new(
+        Listen    => SOMAXCONN,
         LocalPort => $port,
-        ReuseAddr => 1
+        ReuseAddr => 1,
+        Type      => SOCK_STREAM,
     );
-
-    unless ( $daemon ) {
-       die( "Failed to create daemon: $!\n" );
+    
+    unless ( defined $daemon ) {
+        die( qq/Failed to create daemon. Reason: '$!'/ );
     }
 
-    printf( "You can connect to your server at %s\n", $daemon->url );
+    my $base = URI->new( $daemon->url )->canonical;
 
-    while ( my $connection = $daemon->accept ) {
+    printf( "You can connect to your server at %s\n", $base );
 
-        while ( my $request = $connection->get_request ) {
-
-            $request->uri->scheme('http');    # Force URI::http
-
-            my $http = Catalyst::Engine::HTTP::LWP->new(
-                request  => $request,
-                address  => $connection->peerhost,
-                hostname => gethostbyaddr( $connection->peeraddr, AF_INET )
-            );
-
-            $class->handler($http);
-            $connection->send_response( $http->response );
-        }
-
-        $connection->close;
-        undef($connection);
+    while ( my $client = $daemon->accept ) {
+        $class->handler($client);
     }
 }
 
@@ -81,7 +99,8 @@ sub run {
 
 =head1 SEE ALSO
 
-L<Catalyst>, L<HTTP::Daemon>.
+L<Catalyst>, L<Catalyst::Engine>, L<Catalyst::Engine::HTTP::Base>, 
+L<HTTP::Daemon>.
 
 =head1 AUTHOR
 
@@ -105,4 +124,3 @@ sub product_tokens {
 }
 
 1;
-