bug77535.phpt 2.4 KB

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