1--TEST--
2Test trampoline for curl option CURLMOPT_PUSHFUNCTION
3--EXTENSIONS--
4curl
5--SKIPIF--
6<?php
7include 'skipif-nocaddy.inc';
8
9$curl_version = curl_version();
10if ($curl_version['version_number'] < 0x080100) {
11    exit("skip: test may crash with curl < 8.1.0");
12}
13?>
14--FILE--
15<?php
16
17class TrampolineTest {
18    public function __call(string $name, array $arguments) {
19        echo 'Trampoline for ', $name, PHP_EOL;
20	    return CURL_PUSH_OK;
21    }
22}
23$o = new TrampolineTest();
24$callback = [$o, 'trampoline'];
25
26$mh = curl_multi_init();
27
28curl_multi_setopt($mh, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
29curl_multi_setopt($mh, CURLMOPT_PUSHFUNCTION, $callback);
30
31$ch = curl_init();
32curl_setopt($ch, CURLOPT_URL, "https://localhost/serverpush");
33curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
34curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
35
36curl_multi_add_handle($mh, $ch);
37
38$responses = [];
39$active = null;
40do {
41    $status = curl_multi_exec($mh, $active);
42
43    do {
44        $info = curl_multi_info_read($mh);
45        if (false !== $info && $info['msg'] == CURLMSG_DONE) {
46            $handle = $info['handle'];
47            if ($handle !== null) {
48		        $responses[] = curl_multi_getcontent($info['handle']);
49                curl_multi_remove_handle($mh, $handle);
50                curl_close($handle);
51            }
52        }
53    } while ($info);
54} while (count($responses) !== 2);
55
56curl_multi_close($mh);
57
58sort($responses);
59print_r($responses);
60?>
61--EXPECT--
62Array
63(
64    [0] => main response
65    [1] => pushed response
66)
67