|
4 | 4 |
|
5 | 5 | use React\EventLoop\LoopInterface; |
6 | 6 | use React\Dns\Resolver\Resolver; |
7 | | -use React\Stream\Stream; |
8 | | -use React\Promise; |
9 | | -use React\Promise\Deferred; |
10 | 7 |
|
| 8 | +/** |
| 9 | + * @deprecated Exists for BC only, consider using the newer DnsConnector instead |
| 10 | + */ |
11 | 11 | class Connector implements ConnectorInterface |
12 | 12 | { |
13 | | - private $loop; |
14 | | - private $resolver; |
| 13 | + private $connector; |
15 | 14 |
|
16 | 15 | public function __construct(LoopInterface $loop, Resolver $resolver) |
17 | 16 | { |
18 | | - $this->loop = $loop; |
19 | | - $this->resolver = $resolver; |
| 17 | + $this->connector = new DnsConnector(new TcpConnector($loop), $resolver); |
20 | 18 | } |
21 | 19 |
|
22 | 20 | public function create($host, $port) |
23 | 21 | { |
24 | | - return $this |
25 | | - ->resolveHostname($host) |
26 | | - ->then(function ($address) use ($port) { |
27 | | - return $this->createSocketForAddress($address, $port); |
28 | | - }); |
29 | | - } |
30 | | - |
31 | | - public function createSocketForAddress($address, $port) |
32 | | - { |
33 | | - $url = $this->getSocketUrl($address, $port); |
34 | | - |
35 | | - $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT; |
36 | | - $socket = stream_socket_client($url, $errno, $errstr, 0, $flags); |
37 | | - |
38 | | - if (!$socket) { |
39 | | - return Promise\reject(new \RuntimeException( |
40 | | - sprintf("connection to %s:%d failed: %s", $address, $port, $errstr), |
41 | | - $errno |
42 | | - )); |
43 | | - } |
44 | | - |
45 | | - stream_set_blocking($socket, 0); |
46 | | - |
47 | | - // wait for connection |
48 | | - |
49 | | - return $this |
50 | | - ->waitForStreamOnce($socket) |
51 | | - ->then(array($this, 'checkConnectedSocket')) |
52 | | - ->then(array($this, 'handleConnectedSocket')); |
53 | | - } |
54 | | - |
55 | | - protected function waitForStreamOnce($stream) |
56 | | - { |
57 | | - $deferred = new Deferred(); |
58 | | - |
59 | | - $loop = $this->loop; |
60 | | - |
61 | | - $this->loop->addWriteStream($stream, function ($stream) use ($loop, $deferred) { |
62 | | - $loop->removeWriteStream($stream); |
63 | | - |
64 | | - $deferred->resolve($stream); |
65 | | - }); |
66 | | - |
67 | | - return $deferred->promise(); |
68 | | - } |
69 | | - |
70 | | - public function checkConnectedSocket($socket) |
71 | | - { |
72 | | - // The following hack looks like the only way to |
73 | | - // detect connection refused errors with PHP's stream sockets. |
74 | | - if (false === stream_socket_get_name($socket, true)) { |
75 | | - return Promise\reject(new ConnectionException('Connection refused')); |
76 | | - } |
77 | | - |
78 | | - return Promise\resolve($socket); |
79 | | - } |
80 | | - |
81 | | - public function handleConnectedSocket($socket) |
82 | | - { |
83 | | - return new Stream($socket, $this->loop); |
84 | | - } |
85 | | - |
86 | | - protected function getSocketUrl($host, $port) |
87 | | - { |
88 | | - if (strpos($host, ':') !== false) { |
89 | | - // enclose IPv6 addresses in square brackets before appending port |
90 | | - $host = '[' . $host . ']'; |
91 | | - } |
92 | | - return sprintf('tcp://%s:%s', $host, $port); |
93 | | - } |
94 | | - |
95 | | - protected function resolveHostname($host) |
96 | | - { |
97 | | - if (false !== filter_var($host, FILTER_VALIDATE_IP)) { |
98 | | - return Promise\resolve($host); |
99 | | - } |
100 | | - |
101 | | - return $this->resolver->resolve($host); |
| 22 | + return $this->connector->create($host, $port); |
102 | 23 | } |
103 | 24 | } |
0 commit comments