From bfa8e42a5550cdd0545259cc34cf36152c3e1b08 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Mon, 14 Sep 2020 20:45:39 +0000 Subject: [PATCH] Use ephemeral ports during curl tests with dev server --- ext/curl/tests/CONFLICTS | 1 - ext/curl/tests/bug79033.phpt | 2 +- ext/curl/tests/server.inc | 43 ++++++++++++++++++++++++++++-------- 3 files changed, 35 insertions(+), 11 deletions(-) delete mode 100644 ext/curl/tests/CONFLICTS diff --git a/ext/curl/tests/CONFLICTS b/ext/curl/tests/CONFLICTS deleted file mode 100644 index 254defddb5..0000000000 --- a/ext/curl/tests/CONFLICTS +++ /dev/null @@ -1 +0,0 @@ -server diff --git a/ext/curl/tests/bug79033.phpt b/ext/curl/tests/bug79033.phpt index 454c3b2669..c70611dda6 100644 --- a/ext/curl/tests/bug79033.phpt +++ b/ext/curl/tests/bug79033.phpt @@ -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 diff --git a/ext/curl/tests/server.inc b/ext/curl/tests/server.inc index 00eeb5ff76..3051bf98a4 100644 --- a/ext/curl/tests/server.inc +++ b/ext/curl/tests/server.inc @@ -1,8 +1,4 @@ - 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; } -- 2.40.0