xref: /PHP-7.4/ext/curl/tests/bug77535.phpt (revision f167b06d)
1--TEST--
2Bug #77535 (Invalid callback, h2 server push)
3--SKIPIF--
4<?php
5include 'skipif.inc';
6if (getenv("SKIP_ONLINE_TESTS")) {
7	die("skip online test");
8}
9$curl_version = curl_version();
10if ($curl_version['version_number'] < 0x073d00) {
11	exit("skip: test may crash with curl < 7.61.0");
12}
13?>
14--FILE--
15<?php
16class MyHttpClient
17{
18    private $mh;
19    private $curl;
20
21    public function sendRequest()
22    {
23        if (false === $this->mh = curl_multi_init()) {
24            throw new \RuntimeException('Unable to create a new cURL multi handle');
25        }
26
27        $this->addServerPushCallback();
28
29        $this->curl = curl_init();
30        curl_setopt($this->curl, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
31        curl_setopt($this->curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
32        curl_setopt($this->curl, CURLOPT_HEADER, false);
33        curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, false);
34        curl_setopt($this->curl, CURLOPT_FAILONERROR, false);
35        curl_setopt($this->curl, CURLOPT_URL, 'https://http2.golang.org/serverpush');
36        curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
37        curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, function ($ch, $data) {
38            return \strlen($data);
39        });
40        curl_setopt($this->curl, CURLOPT_WRITEFUNCTION, function ($ch, $data) {
41            return \strlen($data);
42        });
43        curl_multi_add_handle($this->mh, $this->curl);
44
45        $stillRunning = null;
46        while (true) {
47            do {
48                $mrc = curl_multi_exec($this->mh, $stillRunning);
49            } while (CURLM_CALL_MULTI_PERFORM === $mrc);
50
51            $info = curl_multi_info_read($this->mh);
52            while (false !== $info && $info['msg'] == CURLMSG_DONE) {
53                if (CURLMSG_DONE !== $info['msg']) {
54                    continue;
55                }
56                die("Start handle request.");
57            }
58        }
59    }
60
61    private function addServerPushCallback(): void
62    {
63
64        $callback = static function () {
65            return CURL_PUSH_OK;
66        };
67
68        curl_multi_setopt($this->mh, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
69        curl_multi_setopt($this->mh, CURLMOPT_PUSHFUNCTION, $callback);
70    }
71}
72
73$buzz = new MyHttpClient();
74$buzz->sendRequest();
75--EXPECT--
76Start handle request.
77
78