]> granicus.if.org Git - php/commitdiff
Use ephemeral ports during curl tests with dev server
authorSara Golemon <pollita@php.net>
Mon, 14 Sep 2020 20:45:39 +0000 (20:45 +0000)
committerSara Golemon <pollita@php.net>
Thu, 17 Sep 2020 14:44:12 +0000 (14:44 +0000)
ext/curl/tests/CONFLICTS [deleted file]
ext/curl/tests/bug79033.phpt
ext/curl/tests/server.inc

diff --git a/ext/curl/tests/CONFLICTS b/ext/curl/tests/CONFLICTS
deleted file mode 100644 (file)
index 254defd..0000000
+++ /dev/null
@@ -1 +0,0 @@
-server
index 454c3b2669dfedb1c824db8cc81a84ee53f29315..c70611dda602f40d60e35014503ab2d8cad1cbe6 100644 (file)
@@ -21,7 +21,7 @@ var_dump(curl_getinfo($ch)["request_header"]);
 string(%d) "array(0) {
 }
 "
-string(90) "POST /get.inc?test=post HTTP/1.1
+string(%d) "POST /get.inc?test=post HTTP/1.1
 Host: localhost:%d
 Accept: */*
 Content-Length: 0
index 00eeb5ff766833b612302ee764ce9e6c332df64a..3051bf98a4c1d1ac00538f90d8fa3b1aaf6148f6 100644 (file)
@@ -1,8 +1,4 @@
-<?php
-
-define ("PHP_CURL_SERVER_HOSTNAME", "localhost");
-define ("PHP_CURL_SERVER_PORT", 8964);
-define ("PHP_CURL_SERVER_ADDRESS", PHP_CURL_SERVER_HOSTNAME.":".PHP_CURL_SERVER_PORT);
+<?php declare(strict_types=1);
 
 function curl_cli_server_start() {
     if(getenv('PHP_CURL_HTTP_REMOTE_SERVER')) {
@@ -12,21 +8,50 @@ function curl_cli_server_start() {
     $php_executable = getenv('TEST_PHP_EXECUTABLE');
     $doc_root = __DIR__;
     $router = "responder/get.inc";
-    $cmd = [$php_executable, '-t', $doc_root, '-n', '-S', PHP_CURL_SERVER_ADDRESS, $router];
+    $cmd = [$php_executable, '-t', $doc_root, '-n', '-S', 'localhost:0', $router];
     $descriptorspec = array(
         0 => STDIN,
         1 => STDOUT,
-        2 => array("null"),
+        2 => ['pipe', 'w'],
     );
     $handle = proc_open($cmd, $descriptorspec, $pipes, $doc_root, null, array("suppress_errors" => true));
 
+    // First, wait for the dev server to declare itself ready.
+    $bound = null;
+    stream_set_blocking($pipes[2], false);
+    for ($i = 0; $i < 60; $i++) {
+        usleep(50000); // 50ms per try
+        $status = proc_get_status($handle);
+        if (empty($status['running'])) {
+            echo "Server is not running\n";
+            proc_terminate($handle);
+            exit(1);
+        }
+
+        while (($line = fgets($pipes[2])) !== false) {
+            if (preg_match('@PHP \S* Development Server \(https?://(.*?:\d+)\) started@', $line, $matches)) {
+                $bound = $matches[1];
+                // Now that we've identified the listen address, close STDERR.
+                // Otherwise the pipe may clog up with unread log messages.
+                fclose($pipes[2]);
+                break 2;
+            }
+        }
+    }
+    if ($bound === null) {
+        echo "Server did not output startup message";
+        proc_terminate($handle);
+        exit(1);
+    }
+
+    // Now wait for a connection to succeed.
     // note: even when server prints 'Listening on localhost:8964...Press Ctrl-C to quit.'
     //       it might not be listening yet...need to wait until fsockopen() call returns
     $error = "Unable to connect to server\n";
     for ($i=0; $i < 60; $i++) {
         usleep(50000); // 50ms per try
         $status = proc_get_status($handle);
-        $fp = @fsockopen(PHP_CURL_SERVER_HOSTNAME, PHP_CURL_SERVER_PORT);
+        $fp = @fsockopen("tcp://$bound");
         // Failure, the server is no longer running
         if (!($status && $status['running'])) {
             $error = "Server is not running\n";
@@ -64,5 +89,5 @@ function curl_cli_server_start() {
         $handle
     );
 
-    return PHP_CURL_SERVER_ADDRESS;
+    return $bound;
 }