bug72333.phpt 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. --TEST--
  2. Bug #72333: fwrite() on non-blocking SSL sockets doesn't work
  3. --EXTENSIONS--
  4. openssl
  5. --SKIPIF--
  6. <?php
  7. if (!function_exists("proc_open")) die("skip no proc_open");
  8. ?>
  9. --FILE--
  10. <?php
  11. $certFile = __DIR__ . DIRECTORY_SEPARATOR . 'bug72333.pem.tmp';
  12. $serverCode = <<<'CODE'
  13. $context = stream_context_create(['ssl' => ['local_cert' => '%s']]);
  14. $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
  15. $fp = stream_socket_server("ssl://127.0.0.1:10011", $errornum, $errorstr, $flags, $context);
  16. phpt_notify();
  17. $conn = stream_socket_accept($fp);
  18. $total = 100000;
  19. $result = fread($conn, $total);
  20. stream_set_blocking($conn, false);
  21. usleep(50000);
  22. $read = [$conn];
  23. while (stream_select($read, $write, $except, 1)) {
  24. $result = fread($conn, 100000);
  25. if (!$result) {
  26. break;
  27. }
  28. $total += strlen($result);
  29. if ($total >= 4000000) {
  30. break;
  31. }
  32. }
  33. phpt_wait();
  34. CODE;
  35. $serverCode = sprintf($serverCode, $certFile);
  36. $peerName = 'bug72333';
  37. $clientCode = <<<'CODE'
  38. $context = stream_context_create(['ssl' => ['verify_peer' => false, 'peer_name' => '%s']]);
  39. phpt_wait();
  40. $fp = stream_socket_client("ssl://127.0.0.1:10011", $errornum, $errorstr, 3000, STREAM_CLIENT_CONNECT, $context);
  41. stream_set_blocking($fp, false);
  42. function blocking_fwrite($fp, $buf) {
  43. $write = [$fp];
  44. $total = 0;
  45. while (stream_select($read, $write, $except, 1)) {
  46. $result = fwrite($fp, $buf);
  47. if (!$result) {
  48. break;
  49. }
  50. $total += $result;
  51. if ($total >= strlen($buf)) {
  52. return $total;
  53. }
  54. $buf = substr($buf, $total);
  55. }
  56. }
  57. $str1 = str_repeat("a", 4000000);
  58. blocking_fwrite($fp, $str1);
  59. phpt_notify();
  60. echo "done";
  61. CODE;
  62. $clientCode = sprintf($clientCode, $peerName);
  63. include 'CertificateGenerator.inc';
  64. $certificateGenerator = new CertificateGenerator();
  65. $certificateGenerator->saveNewCertAsFileWithKey($peerName, $certFile);
  66. include 'ServerClientTestCase.inc';
  67. ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
  68. ?>
  69. --CLEAN--
  70. <?php
  71. @unlink(__DIR__ . DIRECTORY_SEPARATOR . 'bug72333.pem.tmp');
  72. ?>
  73. --EXPECT--
  74. done