@@ -24,7 +24,7 @@ public function createClient($address)
24
24
$ factory = $ this ;
25
25
$ loop = $ this ->loop ;
26
26
27
- return $ this ->resolve ($ address )->then (function ($ address ) use ($ loop ) {
27
+ return $ this ->resolveAddress ($ address )->then (function ($ address ) use ($ loop ) {
28
28
$ socket = stream_socket_client ($ address , $ errno , $ errstr );
29
29
if (!$ socket ) {
30
30
throw new Exception ('Unable to create client socket: ' . $ errstr , $ errno );
@@ -39,7 +39,7 @@ public function createServer($address)
39
39
$ factory = $ this ;
40
40
$ loop = $ this ->loop ;
41
41
42
- return $ this ->resolve ($ address )->then (function ($ address ) use ($ loop ) {
42
+ return $ this ->resolveAddress ($ address )->then (function ($ address ) use ($ loop ) {
43
43
$ socket = stream_socket_server ($ address , $ errno , $ errstr , STREAM_SERVER_BIND );
44
44
if (!$ socket ) {
45
45
throw new Exception ('Unable to create server socket: ' . $ errstr , $ errno );
@@ -49,12 +49,40 @@ public function createServer($address)
49
49
});
50
50
}
51
51
52
- protected function resolve ($ address )
52
+ protected function resolveAddress ($ address )
53
53
{
54
54
if (strpos ($ address , ':// ' ) === false ) {
55
55
$ address = 'udp:// ' . $ address ;
56
56
}
57
57
$ parts = parse_url ($ address );
58
+
59
+ if (!$ parts || !isset ($ parts ['host ' ])) {
60
+ return When::resolve ($ address );
61
+ }
62
+
63
+ // remove square brackets for IPv6 addresses
64
+ $ host = trim ($ parts ['host ' ], '[] ' );
65
+
66
+ return $ this ->resolveHost ($ host )->then (function ($ host ) use ($ parts ) {
67
+ $ address = $ parts ['scheme ' ] . ':// ' ;
68
+
69
+ if (isset ($ parts ['port ' ]) && strpos ($ host , ': ' ) !== false ) {
70
+ // enclose IPv6 address in square brackets if a port will be appended
71
+ $ host = '[ ' . $ host . '] ' ;
72
+ }
73
+
74
+ $ address .= $ host ;
75
+
76
+ if (isset ($ parts ['port ' ])) {
77
+ $ address .= ': ' . $ parts ['port ' ];
78
+ }
79
+
80
+ return $ address ;
81
+ });
82
+ }
83
+
84
+ protected function resolveHost ($ host )
85
+ {
58
86
// there's no need to resolve if the host is already given as an IP address
59
87
if (false !== filter_var ($ host , FILTER_VALIDATE_IP )) {
60
88
return When::resolve ($ host );
@@ -65,17 +93,8 @@ protected function resolve($address)
65
93
}
66
94
67
95
if ($ this ->resolver === null ) {
68
- return When::reject (\ Exception ('No resolver given in order to get IP address for given hostname ' ));
96
+ return When::reject (new Exception ('No resolver given in order to get IP address for given hostname ' ));
69
97
}
70
98
return $ this ->resolver ->resolve ($ host );
71
99
}
72
-
73
- public function createAddress ($ host , $ port )
74
- {
75
- if (strpos ($ host , ': ' ) !== false ) {
76
- // enclose IPv6 address in square brackets
77
- $ host = '[ ' . $ host . '] ' ;
78
- }
79
- return $ host . ': ' . $ port ;
80
- }
81
100
}
0 commit comments