http2 test
[m6w6/ext-http] / tests / helper / server.inc
index 70fb7cf..26f0c50 100644 (file)
@@ -2,7 +2,7 @@
 
 function serve(callable $cb) {
        foreach (range(8000, 9000) as $port) {
-               if (($server = stream_socket_server("tcp://localhost:$port"))) {
+               if (($server = @stream_socket_server("tcp://localhost:$port"))) {
                        fprintf(STDERR, "%s\n", $port);
                        do {
                                $R = [$server]; $W = []; $E = [];
@@ -22,20 +22,65 @@ function serve(callable $cb) {
 }
 
 function server($handler, callable $cb) {
-       $spec = array(array("pipe","r"), array("pipe","w"), array("pipe","w"));
-       $comm = sprintf("%s %s/%s", PHP_BINARY, __DIR__, $handler);
-       if (($proc = proc_open($comm, $spec, $pipes, __DIR__))) {
-               $port = trim(fgets($pipes[2]));
+       proc(PHP_BINARY, [__DIR__."/$handler"], $cb);
+}
+
+function nghttpd(callable $cb) {
+       $spec = [["pipe","r"], ["pipe","w"], ["pipe","w"]];
+       foreach (range(8000, 9000) as $port) {
+               $comm = "exec nghttpd -d html $port http2.key http2.crt";
+               if (($proc = proc_open($comm, $spec, $pipes, __DIR__))) {
+                       $stdin = $pipes[0];
+                       $stdout = $pipes[1];
+                       $stderr = $pipes[2];
+                       
+                       usleep(50000);
+                       $status = proc_get_status($proc);
+                       
+                       if (!$status["running"]) {
+                               continue;
+                       }
+                       
+                       try {
+                               $cb($port, $stdin, $stdout, $stderr);
+                       } catch (Exception $e) {
+                               echo $e,"\n";
+                       }
                
-               try {
-                       $cb($port, $stdin = $pipes[0], $stdout = $pipes[1], $stderr = $pipes[2]);
-               } catch (Exception $e) {
-                       echo $e,"\n";
+                       proc_terminate($proc);
+               
+                       fpassthru($stderr);
+                       fpassthru($stdout);
+                       return;
                }
+       }
+                       
+}
+
+function proc($bin, $args, callable $cb) {
+       $spec = [["pipe","r"], ["pipe","w"], ["pipe","w"]];
+       $comm = escapeshellcmd($bin) . " ". implode(" ", array_map("escapeshellarg", $args));
+       if (($proc = proc_open($comm, $spec, $pipes, __DIR__))) {
+               $stdin = $pipes[0];
+               $stdout = $pipes[1];
+               $stderr = $pipes[2];
                
+               do {
+                       $port = trim(fgets($stderr));
+                       $R = [$stderr]; $W = []; $E = [];
+               } while (is_numeric($port) && stream_select($R, $W, $E, 0, 10000));
+       
+               if (is_numeric($port)) {
+                       try {
+                               $cb($port, $stdin, $stdout, $stderr);
+                       } catch (Exception $e) {
+                               echo $e,"\n";
+                       }
+               }
+       
                proc_terminate($proc);
-               
+       
                fpassthru($stderr);
                fpassthru($stdout);
        }
-}
+}
\ No newline at end of file