Skip to content

Commit 60adee7

Browse files
committed
Add Server::listen() method instead of accepting socket in constructor
1 parent a94c732 commit 60adee7

10 files changed

Lines changed: 113 additions & 77 deletions

README.md

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ to google.com via a local SOCKS proxy server:
4343

4444
```php
4545
$loop = React\EventLoop\Factory::create();
46-
$client = new Client('127.0.0.1:1080', new Connector($loop));
46+
$connector = new React\Socket\Connector($loop);
47+
$client = new Clue\React\Socks\Client('127.0.0.1:1080', $connector);
4748

4849
$client->connect('tcp://www.google.com:80')->then(function (ConnectionInterface $stream) {
4950
$stream->write("GET / HTTP/1.0\r\n\r\n");
@@ -59,11 +60,12 @@ proxy server listening for connections on `localhost:1080`:
5960
```php
6061
$loop = React\EventLoop\Factory::create();
6162

62-
// listen on localhost:1080
63-
$socket = new Socket('127.0.0.1:1080', $loop);
63+
// start a new SOCKS proxy server
64+
$server = new Clue\React\Socks\Server($loop);
6465

65-
// start a new server listening for incoming connection on the given socket
66-
$server = new Server($loop, $socket);
66+
// listen on localhost:1080
67+
$socket = new React\Socket\Server('127.0.0.1:1080', $loop);
68+
$server->listen($socket);
6769

6870
$loop->run();
6971
```
@@ -93,20 +95,17 @@ You can omit the port if you're using the default SOCKS port 1080:
9395
$client = new Client('127.0.0.1', $connector);
9496
```
9597

96-
If you need custom connector settings (DNS resolution, timeouts etc.), you can explicitly pass a
97-
custom instance of the [`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface):
98+
If you need custom connector settings (DNS resolution, TLS parameters, timeouts,
99+
proxy servers etc.), you can explicitly pass a custom instance of the
100+
[`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface):
98101

99102
```php
100-
// use local DNS server
101-
$dnsResolverFactory = new DnsFactory();
102-
$resolver = $dnsResolverFactory->createCached('127.0.0.1', $loop);
103-
104-
// outgoing connections to SOCKS server via interface 192.168.10.1
105-
// this is not to be confused with local DNS resolution (see further below)
106-
$connector = new DnsConnector(
107-
new TcpConnector($loop, array('bindto' => '192.168.10.1:0')),
108-
$resolver
109-
);
103+
$connector = new React\Socket\Connector($loop, array(
104+
'dns' => '127.0.0.1',
105+
'tcp' => array(
106+
'bindto' => '192.168.10.1:0'
107+
)
108+
));
110109

111110
$client = new Client('my-socks-server.local:1080', $connector);
112111
```
@@ -622,12 +621,15 @@ It also registers everything with the main [`EventLoop`](https://github.com/reac
622621
and an underlying TCP/IP socket server like this:
623622

624623
```php
625-
$loop = \React\EventLoop\Factory::create();
624+
$loop = React\EventLoop\Factory::create();
625+
626+
$server = new Clue\React\Socks\Server($loop);
626627

627628
// listen on localhost:$port
628-
$socket = new Socket($port, $loop);
629+
$socket = new React\Socket\Server($port, $loop);
630+
$server->listen($socket);
629631

630-
$server = new Server($loop, $socket);
632+
$loop->run();
631633
```
632634

633635
#### Server connector
@@ -636,21 +638,19 @@ The `Server` uses an instance of ReactPHP's
636638
[`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface)
637639
to establish outgoing connections for each incoming connection request.
638640

639-
If you need custom connector settings (DNS resolution, timeouts etc.), you can explicitly pass a
640-
custom instance of the [`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface):
641+
If you need custom connector settings (DNS resolution, TLS parameters, timeouts,
642+
proxy servers etc.), you can explicitly pass a custom instance of the
643+
[`ConnectorInterface`](https://github.com/reactphp/socket#connectorinterface):
641644

642645
```php
643-
// use local DNS server
644-
$dnsResolverFactory = new DnsFactory();
645-
$resolver = $dnsResolverFactory->createCached('127.0.0.1', $loop);
646-
647-
// outgoing connections to target host via interface 192.168.10.1
648-
$connector = new DnsConnector(
649-
new TcpConnector($loop, array('bindto' => '192.168.10.1:0')),
650-
$resolver
651-
);
646+
$connector = new React\Socket\Connector($loop, array(
647+
'dns' => '127.0.0.1',
648+
'tcp' => array(
649+
'bindto' => '192.168.10.1:0'
650+
)
651+
));
652652

653-
$server = new Server($loop, $socket, $connector);
653+
$server = new Clue\React\Socks\Server($loop, $connector);
654654
```
655655

656656
If you want to forward the outgoing connection through another SOCKS proxy, you
@@ -758,15 +758,20 @@ In order to connect through another SOCKS server, you can simply use the
758758
You can create a SOCKS `Client` instance like this:
759759

760760
```php
761+
$loop = React\EventLoop\Factory::create();
762+
761763
// set next SOCKS server example.com:1080 as target
762764
$connector = new React\Socket\Connector($loop);
763-
$client = new Client('user:pass@example.com:1080', $connector);
765+
$client = new Clue\React\Socks\Client('user:pass@example.com:1080', $connector);
766+
767+
// start a new server which forwards all connections to the other SOCKS server
768+
$server = new Clue\React\Socks\Server($loop, $client);
764769

765770
// listen on localhost:1080
766-
$socket = new Socket('127.0.0.1:1080', $loop);
771+
$socket = new React\Socket\Server('127.0.0.1:1080', $loop);
772+
$server->listen($socket);
767773

768-
// start a new server which forwards all connections to the other SOCKS server
769-
$server = new Server($loop, $socket, $client);
774+
$loop->run();
770775
```
771776

772777
See also [example #21](examples).
@@ -807,15 +812,19 @@ details.
807812
You can simply start your listening socket on the `tls://` URI scheme like this:
808813

809814
```php
810-
$loop = \React\EventLoop\Factory::create();
815+
$loop = React\EventLoop\Factory::create();
816+
817+
$server = new Clue\React\Socks\Server($loop);
811818

812819
// listen on tls://127.0.0.1:1080 with the given server certificate
813820
$socket = new React\Socket\Server('tls://127.0.0.1:1080', $loop, array(
814821
'tls' => array(
815822
'local_cert' => __DIR__ . '/localhost.pem',
816823
)
817824
));
818-
$server = new Server($loop, $socket);
825+
$server->listen($socket);
826+
827+
$loop->run();
819828
```
820829

821830
See also [example 31](examples).
@@ -842,11 +851,15 @@ having to rely on explicit [authentication](#server-authentication).
842851
You can simply start your listening socket on the `unix://` URI scheme like this:
843852

844853
```php
845-
$loop = \React\EventLoop\Factory::create();
854+
$loop = React\EventLoop\Factory::create();
855+
856+
$server = new Clue\React\Socks\Server($loop);
846857

847858
// listen on /tmp/proxy.sock
848859
$socket = new React\Socket\Server('unix:///tmp/proxy.sock', $loop);
849-
$server = new Server($loop, $socket);
860+
$server->listen($socket);
861+
862+
$loop->run();
850863
```
851864

852865
> Note that Unix domain sockets (UDS) are considered advanced usage and that

examples/11-server.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77

88
$loop = React\EventLoop\Factory::create();
99

10-
// listen on 127.0.0.1:1080 or first argument
11-
$listen = isset($argv[1]) ? $argv[1] : '127.0.0.1:1080';
12-
$socket = new Socket($listen, $loop);
10+
// start a new SOCKS proxy server
11+
$server = new Server($loop);
1312

14-
// start a new server listening for incoming connection on the given socket
15-
$server = new Server($loop, $socket);
13+
// listen on 127.0.0.1:1080 or first argument
14+
$socket = new Socket(isset($argv[1]) ? $argv[1] : '127.0.0.1:1080', $loop);
15+
$server->listen($socket);
1616

1717
echo 'SOCKS server listening on ' . $socket->getAddress() . PHP_EOL;
1818

examples/12-server-with-password.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@
77

88
$loop = React\EventLoop\Factory::create();
99

10-
// listen on 127.0.0.1:1080 or first argument
11-
$listen = isset($argv[1]) ? $argv[1] : '127.0.0.1:1080';
12-
$socket = new Socket($listen, $loop);
13-
14-
// start a new server listening for incoming connection on the given socket
10+
// start a new SOCKS proxy server
1511
// require authentication and hence make this a SOCKS5-only server
16-
$server = new Server($loop, $socket);
12+
$server = new Server($loop);
1713
$server->setAuthArray(array(
1814
'tom' => 'god',
1915
'user' => 'p@ssw0rd'
2016
));
2117

18+
// listen on 127.0.0.1:1080 or first argument
19+
$socket = new Socket(isset($argv[1]) ? $argv[1] : '127.0.0.1:1080', $loop);
20+
$server->listen($socket);
21+
2222
echo 'SOCKS5 server requiring authentication listening on ' . $socket->getAddress() . PHP_EOL;
2323

2424
$loop->run();

examples/13-server-blacklist.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828
'*' => $permit
2929
));
3030

31-
// listen on 127.0.0.1:1080 or first argument
32-
$listen = isset($argv[1]) ? $argv[1] : '127.0.0.1:1080';
33-
$socket = new Socket($listen, $loop);
31+
// start a new SOCKS proxy server using our connection manager for outgoing connections
32+
$server = new Server($loop, $connector);
3433

35-
// start the actual socks server on the given server socket and using our connection manager for outgoing connections
36-
$server = new Server($loop, $socket, $connector);
34+
// listen on 127.0.0.1:1080 or first argument
35+
$socket = new Socket(isset($argv[1]) ? $argv[1] : '127.0.0.1:1080', $loop);
36+
$server->listen($socket);
3737

3838
echo 'SOCKS server listening on ' . $socket->getAddress() . PHP_EOL;
3939

examples/21-server-proxy-chaining.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@
3030
$connector = new Client($proxy, $connector);
3131
}
3232

33+
// start a new SOCKS proxy server which forwards all connections to the other SOCKS server
34+
$server = new Server($loop, $connector);
35+
3336
// listen on 127.0.0.1:1080 or first argument
3437
$socket = new Socket($listen, $loop);
35-
36-
// start a new server which forwards all connections to the other SOCKS server
37-
$server = new Server($loop, $socket, $connector);
38+
$server->listen($socket);
3839

3940
echo 'SOCKS server listening on ' . $socket->getAddress() . PHP_EOL;
4041
echo 'Forwarding via: ' . implode(' -> ', $path) . PHP_EOL;

examples/22-server-proxy-chaining-from-random-pool.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@
3535
}
3636
$connector = new ConnectionManagerRandom($clients);
3737

38-
$socket = new Socket($listen, $loop);
39-
40-
// start the actual socks server on the given server socket and using our connection manager for outgoing connections
38+
// start the SOCKS proxy server using our connection manager for outgoing connections
4139
$server = new Server($loop, $socket, $connector);
4240

41+
// listen on 127.0.0.1:1080 or first argument
42+
$socket = new Socket($listen, $loop);
43+
$server->listen($socket);
44+
4345
echo 'SOCKS server listening on ' . $socket->getAddress() . PHP_EOL;
4446
echo 'Randomly picking from: ' . implode(', ', $pool) . PHP_EOL;
4547

examples/31-server-secure.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
$loop = React\EventLoop\Factory::create();
99

10+
// start a new SOCKS proxy server
11+
$server = new Server($loop);
12+
1013
// listen on tls://127.0.0.1:1080 or first argument
1114
$listen = isset($argv[1]) ? $argv[1] : '127.0.0.1:1080';
1215
$socket = new Socket('tls://' . $listen, $loop, array('tls' => array(
1316
'local_cert' => __DIR__ . '/localhost.pem',
1417
)));
1518

16-
// start a new server listening for incoming connection on the given socket
17-
$server = new Server($loop, $socket);
18-
1919
echo 'SOCKS over TLS server listening on ' . str_replace('tls:', 'sockss:', $socket->getAddress()) . PHP_EOL;
2020

2121
$loop->run();

src/Server.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,24 @@ final class Server
4343

4444
private $protocolVersion = null;
4545

46-
public function __construct(LoopInterface $loop, ServerInterface $serverInterface, ConnectorInterface $connector = null)
46+
public function __construct(LoopInterface $loop, ConnectorInterface $connector = null)
4747
{
4848
if ($connector === null) {
4949
$connector = new Connector($loop);
5050
}
5151

5252
$this->loop = $loop;
5353
$this->connector = $connector;
54+
}
5455

56+
/**
57+
* @param ServerInterface $socket
58+
* @return void
59+
*/
60+
public function listen(ServerInterface $socket)
61+
{
5562
$that = $this;
56-
$serverInterface->on('connection', function ($connection) use ($that) {
63+
$socket->on('connection', function ($connection) use ($that) {
5764
$that->onConnection($connection);
5865
});
5966
}

tests/FunctionalTest.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public function setUp()
3030
$this->port = parse_url($address, PHP_URL_PORT);
3131
$this->assertNotEquals(0, $this->port);
3232

33-
$this->server = new Server($this->loop, $socket);
33+
$this->server = new Server($this->loop);
34+
$this->server->listen($socket);
3435
$this->connector = new TcpConnector($this->loop);
3536
$this->client = new Client('127.0.0.1:' . $this->port, $this->connector);
3637
}
@@ -113,7 +114,8 @@ public function testConnectionSocksOverTls()
113114
$socket = new \React\Socket\Server('tls://127.0.0.1:0', $this->loop, array('tls' => array(
114115
'local_cert' => __DIR__ . '/../examples/localhost.pem',
115116
)));
116-
$this->server = new Server($this->loop, $socket);
117+
$this->server = new Server($this->loop);
118+
$this->server->listen($socket);
117119

118120
$this->connector = new Connector($this->loop, array('tls' => array(
119121
'verify_peer' => false,
@@ -137,7 +139,8 @@ public function testConnectionSocksOverTlsUsesPeerNameFromSocksUri()
137139
$socket = new \React\Socket\Server('tls://127.0.0.1:0', $this->loop, array('tls' => array(
138140
'local_cert' => __DIR__ . '/../examples/localhost.pem',
139141
)));
140-
$this->server = new Server($this->loop, $socket);
142+
$this->server = new Server($this->loop);
143+
$this->server->listen($socket);
141144

142145
$this->connector = new Connector($this->loop, array('tls' => array(
143146
'verify_peer' => false,
@@ -157,7 +160,8 @@ public function testConnectionSocksOverUnix()
157160

158161
$path = sys_get_temp_dir() . '/test' . mt_rand(1000, 9999) . '.sock';
159162
$socket = new UnixServer($path, $this->loop);
160-
$this->server = new Server($this->loop, $socket);
163+
$this->server = new Server($this->loop);
164+
$this->server->listen($socket);
161165

162166
$this->connector = new Connector($this->loop);
163167
$this->client = new Client('socks+unix://' . $path, $this->connector);
@@ -176,7 +180,8 @@ public function testConnectionSocks5OverUnix()
176180

177181
$path = sys_get_temp_dir() . '/test' . mt_rand(1000, 9999) . '.sock';
178182
$socket = new UnixServer($path, $this->loop);
179-
$this->server = new Server($this->loop, $socket);
183+
$this->server = new Server($this->loop);
184+
$this->server->listen($socket);
180185
$this->server->setProtocolVersion(5);
181186

182187
$this->connector = new Connector($this->loop);
@@ -196,7 +201,8 @@ public function testConnectionSocksWithAuthenticationOverUnix()
196201

197202
$path = sys_get_temp_dir() . '/test' . mt_rand(1000, 9999) . '.sock';
198203
$socket = new UnixServer($path, $this->loop);
199-
$this->server = new Server($this->loop, $socket);
204+
$this->server = new Server($this->loop);
205+
$this->server->listen($socket);
200206
$this->server->setAuthArray(array('name' => 'pass'));
201207

202208
$this->connector = new Connector($this->loop);

0 commit comments

Comments
 (0)