summaryrefslogtreecommitdiff
blob: fbb7c443d97a1d5d2894adb82aa02f5d5d16fb19 (plain)
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
--- a/t/01live.t
+++ b/t/01live.t
@@ -34,11 +34,7 @@ for my $class (@classes) {
 }
 
 
-TODO: { 
-    local $TODO = "We don't currently wait for 'server is running' responses from the client";
-    run_server_tests('SlowServer');
-
-}
+run_server_tests('SlowServer');
 
 
 
From: Niko Tyni <ntyni@iki.fi>
Subject: [PATCH] Pipe version: parent waits for the child to say "OK" via a pipe.

--- libhttp-server-simple-perl.orig/lib/HTTP/Server/Simple.pm
+++ libhttp-server-simple-perl/lib/HTTP/Server/Simple.pm
@@ -6,6 +6,7 @@
 use Socket;
 use Carp;
 use URI::Escape;
+use IO::Select;
 
 use vars qw($VERSION $bad_request_doc);
 $VERSION = '0.36';
@@ -206,15 +207,36 @@
 
 sub background {
     my $self  = shift;
+
+    # set up a pipe so the child can tell the parent when it's ready
+    # to accept requests
+    my ($readfh, $writefh) = FileHandle::pipe;
+
     my $child = fork;
     croak "Can't fork: $!" unless defined($child);
-    return $child if $child;
+    if ($child) { # parent
+        my $s = IO::Select->new;
+        $s->add($readfh);
+        my $now = time; my $left = 0;
+        my @ready;
+        while(not @ready and $left < 5) {
+            @ready = $s->can_read($left);
+            $left = time - $now;
+        }
+        die("child unresponsive for 5 seconds") if(not @ready);
+        my $response = <$readfh>;
+        chomp $response;
+        die("child is confused: answer '$response' != 'OK'")
+            if $response ne "OK";
+        return $child;
+    }
 
     if ( $^O !~ /MSWin32/ ) {
         require POSIX;
         POSIX::setsid()
             or croak "Can't start a new session: $!";
     }
+    $self->{_parent_handle} = $writefh;
     $self->run(@_);
 }
 
@@ -263,6 +285,7 @@
 	$self->after_setup_listener();
         *{"$pkg\::run"} = $self->_default_run;
     }
+    $self->_maybe_tell_parent();
 
     local $SIG{HUP} = sub { $SERVER_SHOULD_RUN = 0; };
 
@@ -400,6 +423,16 @@
     }
 }
 
+sub _maybe_tell_parent {
+    # inform the parent process that we're ready, if applicable
+    my $self = shift;
+    my $handle = $self->{_parent_handle};
+    return if !$handle;
+    print $handle "OK\n";
+    close $handle;
+    delete $self->{_parent_handle};
+}
+
 =head2 stdio_handle [FILEHANDLE]
 
 When called with an argument, sets the socket to the server to that arg.