Skip to content

Commit a967ef1

Browse files
committed
Properly return null for unknown addresses
1 parent 32385d7 commit a967ef1

File tree

2 files changed

+124
-1
lines changed

2 files changed

+124
-1
lines changed

src/Connection.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,15 @@ public function handleClose()
2626

2727
public function getRemoteAddress()
2828
{
29-
return $this->parseAddress(stream_socket_get_name($this->stream, true));
29+
return $this->parseAddress(@stream_socket_get_name($this->stream, true));
3030
}
3131

3232
private function parseAddress($address)
3333
{
34+
if ($address === false) {
35+
return null;
36+
}
37+
3438
return trim(substr($address, 0, strrpos($address, ':')), '[]');
3539
}
3640
}

tests/FunctionalServerTest.php

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use React\SocketClient\TcpConnector;
77
use React\Socket\Server;
88
use Clue\React\Block;
9+
use React\Socket\ConnectionException;
10+
use React\Socket\ConnectionInterface;
911

1012
class FunctionalServerTest extends TestCase
1113
{
@@ -26,6 +28,76 @@ public function testEmitsConnectionForNewConnection()
2628
Block\sleep(0.1, $loop);
2729
}
2830

31+
public function testEmitsConnectionWithRemoteIp()
32+
{
33+
$loop = Factory::create();
34+
35+
$server = new Server($loop);
36+
$peer = null;
37+
$server->on('connection', function (ConnectionInterface $conn) use (&$peer) {
38+
$peer = $conn->getRemoteAddress();
39+
});
40+
$server->listen(0);
41+
$port = $server->getPort();
42+
43+
$connector = new TcpConnector($loop);
44+
$promise = $connector->create('127.0.0.1', $port);
45+
46+
$promise->then($this->expectCallableOnce());
47+
48+
Block\sleep(0.1, $loop);
49+
50+
$this->assertEquals('127.0.0.1', $peer);
51+
}
52+
53+
public function testEmitsConnectionWithRemoteIpAfterConnectionIsClosedByPeer()
54+
{
55+
$loop = Factory::create();
56+
57+
$server = new Server($loop);
58+
$peer = null;
59+
$server->on('connection', function (ConnectionInterface $conn) use (&$peer) {
60+
$conn->on('close', function () use ($conn, &$peer) {
61+
$peer = $conn->getRemoteAddress();
62+
});
63+
});
64+
$server->listen(0);
65+
$port = $server->getPort();
66+
67+
$connector = new TcpConnector($loop);
68+
$promise = $connector->create('127.0.0.1', $port);
69+
70+
$client = Block\await($promise, $loop, 0.1);
71+
$client->end();
72+
73+
Block\sleep(0.1, $loop);
74+
75+
$this->assertEquals('127.0.0.1', $peer);
76+
}
77+
78+
public function testEmitsConnectionWithRemoteNullAddressAfterConnectionIsClosedLocally()
79+
{
80+
$loop = Factory::create();
81+
82+
$server = new Server($loop);
83+
$peer = null;
84+
$server->on('connection', function (ConnectionInterface $conn) use (&$peer) {
85+
$conn->close();
86+
$peer = $conn->getRemoteAddress();
87+
});
88+
$server->listen(0);
89+
$port = $server->getPort();
90+
91+
$connector = new TcpConnector($loop);
92+
$promise = $connector->create('127.0.0.1', $port);
93+
94+
$promise->then($this->expectCallableOnce());
95+
96+
Block\sleep(0.1, $loop);
97+
98+
$this->assertNull($peer);
99+
}
100+
29101
public function testEmitsConnectionEvenIfConnectionIsCancelled()
30102
{
31103
$loop = Factory::create();
@@ -43,4 +115,51 @@ public function testEmitsConnectionEvenIfConnectionIsCancelled()
43115

44116
Block\sleep(0.1, $loop);
45117
}
118+
119+
public function testEmitsConnectionForNewIpv6Connection()
120+
{
121+
$loop = Factory::create();
122+
123+
$server = new Server($loop);
124+
$server->on('connection', $this->expectCallableOnce());
125+
try {
126+
$server->listen(0, '::1');
127+
} catch (ConnectionException $e) {
128+
$this->markTestSkipped('Unable to start IPv6 server socket (not available on your platform?)');
129+
}
130+
$port = $server->getPort();
131+
132+
$connector = new TcpConnector($loop);
133+
$promise = $connector->create('::1', $port);
134+
135+
$promise->then($this->expectCallableOnce());
136+
137+
Block\sleep(0.1, $loop);
138+
}
139+
140+
public function testEmitsConnectionWithRemoteIpv6()
141+
{
142+
$loop = Factory::create();
143+
144+
$server = new Server($loop);
145+
$peer = null;
146+
$server->on('connection', function (ConnectionInterface $conn) use (&$peer) {
147+
$peer = $conn->getRemoteAddress();
148+
});
149+
try {
150+
$server->listen(0, '::1');
151+
} catch (ConnectionException $e) {
152+
$this->markTestSkipped('Unable to start IPv6 server socket (not available on your platform?)');
153+
}
154+
$port = $server->getPort();
155+
156+
$connector = new TcpConnector($loop);
157+
$promise = $connector->create('::1', $port);
158+
159+
$promise->then($this->expectCallableOnce());
160+
161+
Block\sleep(0.1, $loop);
162+
163+
$this->assertEquals('::1', $peer);
164+
}
46165
}

0 commit comments

Comments
 (0)