diff options
author | Pedro Magalhães <pmmaga@php.net> | 2019-03-15 18:11:51 +0000 |
---|---|---|
committer | Pedro Magalhães <pmmaga@php.net> | 2019-03-15 18:11:51 +0000 |
commit | f167b06d4c86c96291c21c027ba3cae22f5b5be8 (patch) | |
tree | c7fd9b156be353787e57932db0cc211f662d2984 /ext/curl | |
parent | 97f9fd6949a52d1eb30c3e1c90f0789b57c29468 (diff) | |
download | php-git-f167b06d4c86c96291c21c027ba3cae22f5b5be8.tar.gz |
Added test for #77535 fix
Diffstat (limited to 'ext/curl')
-rw-r--r-- | ext/curl/tests/bug77535.phpt | 77 |
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. + |