summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Magalhães <pmmaga@php.net>2019-03-15 18:11:51 +0000
committerPedro Magalhães <pmmaga@php.net>2019-03-15 18:11:51 +0000
commitf167b06d4c86c96291c21c027ba3cae22f5b5be8 (patch)
treec7fd9b156be353787e57932db0cc211f662d2984
parent97f9fd6949a52d1eb30c3e1c90f0789b57c29468 (diff)
downloadphp-git-f167b06d4c86c96291c21c027ba3cae22f5b5be8.tar.gz
Added test for #77535 fix
-rw-r--r--ext/curl/tests/bug77535.phpt77
1 files changed, 77 insertions, 0 deletions
diff --git a/ext/curl/tests/bug77535.phpt b/ext/curl/tests/bug77535.phpt
new file mode 100644
index 0000000000..b79cdb9c02
--- /dev/null
+++ b/ext/curl/tests/bug77535.phpt
@@ -0,0 +1,77 @@
+--TEST--
+Bug #77535 (Invalid callback, h2 server push)
+--SKIPIF--
+<?php
+include 'skipif.inc';
+if (getenv("SKIP_ONLINE_TESTS")) {
+ die("skip online test");
+}
+$curl_version = curl_version();
+if ($curl_version['version_number'] < 0x073d00) {
+ exit("skip: test may crash with curl < 7.61.0");
+}
+?>
+--FILE--
+<?php
+class MyHttpClient
+{
+ private $mh;
+ private $curl;
+
+ public function sendRequest()
+ {
+ if (false === $this->mh = curl_multi_init()) {
+ throw new \RuntimeException('Unable to create a new cURL multi handle');
+ }
+
+ $this->addServerPushCallback();
+
+ $this->curl = curl_init();
+ curl_setopt($this->curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
+ curl_setopt($this->curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
+ curl_setopt($this->curl, CURLOPT_HEADER, false);
+ curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, false);
+ curl_setopt($this->curl, CURLOPT_FAILONERROR, false);
+ curl_setopt($this->curl, CURLOPT_URL, 'https://http2.golang.org/serverpush');
+ curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
+ curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, function ($ch, $data) {
+ return \strlen($data);
+ });
+ curl_setopt($this->curl, CURLOPT_WRITEFUNCTION, function ($ch, $data) {
+ return \strlen($data);
+ });
+ curl_multi_add_handle($this->mh, $this->curl);
+
+ $stillRunning = null;
+ while (true) {
+ do {
+ $mrc = curl_multi_exec($this->mh, $stillRunning);
+ } while (CURLM_CALL_MULTI_PERFORM === $mrc);
+
+ $info = curl_multi_info_read($this->mh);
+ while (false !== $info && $info['msg'] == CURLMSG_DONE) {
+ if (CURLMSG_DONE !== $info['msg']) {
+ continue;
+ }
+ die("Start handle request.");
+ }
+ }
+ }
+
+ private function addServerPushCallback(): void
+ {
+
+ $callback = static function () {
+ return CURL_PUSH_OK;
+ };
+
+ curl_multi_setopt($this->mh, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+ curl_multi_setopt($this->mh, CURLMOPT_PUSHFUNCTION, $callback);
+ }
+}
+
+$buzz = new MyHttpClient();
+$buzz->sendRequest();
+--EXPECT--
+Start handle request.
+