22-http-client.php 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. // Simple plaintext HTTP and secure HTTPS client example (for illustration purposes only).
  3. // This shows how an URI parameter can parsed to decide whether to establish
  4. // a plaintext TCP/IP or secure TLS connection and then send an
  5. // application level protocol message (HTTP).
  6. // Real applications should use react/http-client instead!
  7. //
  8. // Unlike examples #11 and #12, this example will actually take an optional URI
  9. // parameter and parse it to connect to the correct default port and use the
  10. // correct transport protocol.
  11. //
  12. // $ php examples/22-http-client.php
  13. // $ php examples/22-http-client.php https://reactphp.org/
  14. use React\Socket\ConnectionInterface;
  15. use React\Socket\Connector;
  16. use React\Stream\WritableResourceStream;
  17. require __DIR__ . '/../vendor/autoload.php';
  18. $uri = isset($argv[1]) ? $argv[1] : 'www.google.com';
  19. if (strpos($uri, '://') === false) {
  20. $uri = 'http://' . $uri;
  21. }
  22. $parts = parse_url($uri);
  23. if (!$parts || !isset($parts['scheme'], $parts['host'])) {
  24. fwrite(STDERR, 'Usage error: required argument <host:port>' . PHP_EOL);
  25. exit(1);
  26. }
  27. $connector = new Connector();
  28. if (!isset($parts['port'])) {
  29. $parts['port'] = $parts['scheme'] === 'https' ? 443 : 80;
  30. }
  31. $host = $parts['host'];
  32. if (($parts['scheme'] === 'http' && $parts['port'] !== 80) || ($parts['scheme'] === 'https' && $parts['port'] !== 443)) {
  33. $host .= ':' . $parts['port'];
  34. }
  35. $target = ($parts['scheme'] === 'https' ? 'tls' : 'tcp') . '://' . $parts['host'] . ':' . $parts['port'];
  36. $resource = isset($parts['path']) ? $parts['path'] : '/';
  37. if (isset($parts['query'])) {
  38. $resource .= '?' . $parts['query'];
  39. }
  40. $stdout = new WritableResourceStream(STDOUT);
  41. $connector->connect($target)->then(function (ConnectionInterface $connection) use ($resource, $host, $stdout) {
  42. $connection->pipe($stdout);
  43. $connection->write("GET $resource HTTP/1.0\r\nHost: $host\r\n\r\n");
  44. }, function (Exception $e) {
  45. echo 'Error: ' . $e->getMessage() . PHP_EOL;
  46. });