-
-
Notifications
You must be signed in to change notification settings - Fork 158
Expand file tree
/
Copy pathConnector.php
More file actions
127 lines (107 loc) · 3.83 KB
/
Copy pathConnector.php
File metadata and controls
127 lines (107 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
namespace React\Socket;
use React\EventLoop\LoopInterface;
use React\Dns\Resolver\Resolver;
use React\Dns\Resolver\Factory;
use React\Promise;
use RuntimeException;
/**
* The `Connector` class is the main class in this package that implements the
* `ConnectorInterface` and allows you to create streaming connections.
*
* You can use this connector to create any kind of streaming connections, such
* as plaintext TCP/IP, secure TLS or local Unix connection streams.
*
* Under the hood, the `Connector` is implemented as a *higher-level facade*
* or the lower-level connectors implemented in this package. This means it
* also shares all of their features and implementation details.
* If you want to typehint in your higher-level protocol implementation, you SHOULD
* use the generic [`ConnectorInterface`](#connectorinterface) instead.
*
* @see ConnectorInterface for the base interface
*/
final class Connector implements ConnectorInterface
{
private $connectors = array();
public function __construct(LoopInterface $loop, array $options = array())
{
// apply default options if not explicitly given
$options += array(
'tcp' => true,
'tls' => true,
'unix' => true,
'dns' => true,
'timeout' => true,
);
if ($options['timeout'] === true) {
$options['timeout'] = (float)ini_get("default_socket_timeout");
}
if ($options['tcp'] instanceof ConnectorInterface) {
$tcp = $options['tcp'];
} else {
$tcp = new TcpConnector(
$loop,
is_array($options['tcp']) ? $options['tcp'] : array()
);
}
if ($options['dns'] !== false) {
if ($options['dns'] instanceof Resolver) {
$resolver = $options['dns'];
} else {
$factory = new Factory();
$resolver = $factory->create(
$options['dns'] === true ? '8.8.8.8' : $options['dns'],
$loop
);
}
$tcp = new DnsConnector($tcp, $resolver);
}
if ($options['tcp'] !== false) {
$options['tcp'] = $tcp;
if ($options['timeout'] !== false) {
$options['tcp'] = new TimeoutConnector(
$options['tcp'],
$options['timeout'],
$loop
);
}
$this->connectors['tcp'] = $options['tcp'];
}
if ($options['tls'] !== false) {
if (!$options['tls'] instanceof ConnectorInterface) {
$options['tls'] = new SecureConnector(
$tcp,
$loop,
is_array($options['tls']) ? $options['tls'] : array()
);
}
if ($options['timeout'] !== false) {
$options['tls'] = new TimeoutConnector(
$options['tls'],
$options['timeout'],
$loop
);
}
$this->connectors['tls'] = $options['tls'];
}
if ($options['unix'] !== false) {
if (!$options['unix'] instanceof ConnectorInterface) {
$options['unix'] = new UnixConnector($loop);
}
$this->connectors['unix'] = $options['unix'];
}
}
public function connect($uri)
{
$scheme = 'tcp';
if (strpos($uri, '://') !== false) {
$scheme = (string)substr($uri, 0, strpos($uri, '://'));
}
if (!isset($this->connectors[$scheme])) {
return Promise\reject(new RuntimeException(
'No connector available for URI scheme "' . $scheme . '"'
));
}
return $this->connectors[$scheme]->connect($uri);
}
}