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