summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-09-17 15:43:35 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-09-17 15:43:35 +0200
commitb50a90867aa8235e4f7c85450c116ccef130e649 (patch)
treea76969ee0c7e929480cd9f0e6b0a4fe64594bb5a
parentdb094b4b2e5ef0f0c30f412ce3a2516e31e17da7 (diff)
parentc5d4c45e7d6a316683add2202f36e944860335fb (diff)
downloadphp-git-b50a90867aa8235e4f7c85450c116ccef130e649.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
-rw-r--r--ext/standard/http_fopen_wrapper.c4
-rw-r--r--ext/standard/tests/http/bug76342.phpt33
-rw-r--r--ext/standard/tests/http/server.inc42
3 files changed, 70 insertions, 9 deletions
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index 478132fd40..9632bd344e 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -726,7 +726,9 @@ finish:
ZVAL_STRINGL(&http_response, tmp_line, tmp_line_len);
zend_hash_next_index_insert(Z_ARRVAL_P(response_header), &http_response);
} else {
- php_stream_wrapper_log_error(wrapper, options, "HTTP request failed, unexpected end of socket!");
+ php_stream_close(stream);
+ stream = NULL;
+ php_stream_wrapper_log_error(wrapper, options, "HTTP request failed!");
goto out;
}
}
diff --git a/ext/standard/tests/http/bug76342.phpt b/ext/standard/tests/http/bug76342.phpt
new file mode 100644
index 0000000000..179127081f
--- /dev/null
+++ b/ext/standard/tests/http/bug76342.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Bug #76342 (file_get_contents waits twice specified timeout)
+--INI--
+allow_url_fopen=1
+--SKIPIF--
+<?php require 'server.inc'; http_server_skipif('tcp://127.0.0.1:12342'); ?>
+--FILE--
+<?php
+require 'server.inc';
+
+$options = [
+ 'http' => [
+ 'timeout' => '0.1',
+ ],
+];
+
+$ctx = stream_context_create($options);
+
+$pid = http_server_sleep('tcp://127.0.0.1:12342');
+
+$start = microtime(true);
+file_get_contents('http://127.0.0.1:12342/', false, $ctx);
+if (microtime(true) - $start >= 0.2) {
+ echo 'FAIL';
+}
+
+http_server_kill($pid);
+
+?>
+DONE
+--EXPECTF--
+Warning: file_get_contents(http://127.0.0.1:12342/): failed to open stream: HTTP request failed! in %s on line %d
+DONE
diff --git a/ext/standard/tests/http/server.inc b/ext/standard/tests/http/server.inc
index db66c3dd13..e580674928 100644
--- a/ext/standard/tests/http/server.inc
+++ b/ext/standard/tests/http/server.inc
@@ -7,14 +7,7 @@ function http_server_skipif($socket_string) {
if (!stream_socket_server($socket_string)) die('skip stream_socket_server() failed');
}
-/* Minimal HTTP server with predefined responses.
- *
- * $socket_string is the socket to create and listen on (e.g. tcp://127.0.0.1:1234)
- * $files is an array of files containing N responses for N expected requests. Server dies after N requests.
- * $output is a stream on which everything sent by clients is written to
- */
-function http_server($socket_string, array $files, &$output = null) {
-
+function http_server_init($socket_string, &$output = null) {
pcntl_alarm(60);
$server = stream_socket_server($socket_string, $errno, $errstr);
@@ -36,6 +29,21 @@ function http_server($socket_string, array $files, &$output = null) {
return $pid;
}
+ return $server;
+}
+
+/* Minimal HTTP server with predefined responses.
+ *
+ * $socket_string is the socket to create and listen on (e.g. tcp://127.0.0.1:1234)
+ * $files is an array of files containing N responses for N expected requests. Server dies after N requests.
+ * $output is a stream on which everything sent by clients is written to
+ */
+function http_server($socket_string, array $files, &$output = null) {
+
+ if (!is_resource($server = http_server_init($socket_string, $output))) {
+ return $server;
+ }
+
foreach($files as $file) {
$sock = stream_socket_accept($server);
@@ -84,6 +92,24 @@ function http_server($socket_string, array $files, &$output = null) {
exit(0);
}
+function http_server_sleep($socket_string, $micro_seconds = 500000)
+{
+ if (!is_resource($server = http_server_init($socket_string, $output))) {
+ return $server;
+ }
+
+ $sock = stream_socket_accept($server);
+ if (!$sock) {
+ exit(1);
+ }
+
+ usleep($micro_seconds);
+
+ fclose($sock);
+
+ exit(0);
+}
+
function http_server_kill($pid) {
posix_kill($pid, SIGTERM);
pcntl_waitpid($pid, $status);