Skip to content

Commit e0bbe0c

Browse files
authored
Merge pull request #28 from clue-labs/socket
Simplify usage by supporting new Socket API without nullable loop
2 parents b2d791f + 1e51a37 commit e0bbe0c

11 files changed

+44
-52
lines changed

README.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ plaintext HTTP request to google.com through a remote SSH server:
7777
```php
7878
$proxy = new Clue\React\SshProxy\SshProcessConnector('[email protected]');
7979

80-
$connector = new React\Socket\Connector(null, array(
80+
$connector = new React\Socket\Connector(array(
8181
'tcp' => $proxy,
8282
'dns' => false
8383
));
@@ -287,7 +287,7 @@ $proxy = new Clue\React\SshProxy\SshProcessConnector('[email protected]');
287287
// or
288288
$proxy = new Clue\React\SshProxy\SshSocksConnector('[email protected]');
289289

290-
$connector = new React\Socket\Connector(null, array(
290+
$connector = new React\Socket\Connector(array(
291291
'tcp' => $proxy,
292292
'dns' => false
293293
));
@@ -318,7 +318,7 @@ low-level [`SecureConnector`](https://github.com/reactphp/socket#secureconnector
318318
```php
319319
$proxy = new Clue\React\SshProxy\SshSocksConnector('[email protected]');
320320

321-
$connector = new React\Socket\Connector(null, array(
321+
$connector = new React\Socket\Connector(array(
322322
'tcp' => $proxy,
323323
'dns' => false
324324
));
@@ -350,12 +350,12 @@ This allows you to send both plain HTTP and TLS-encrypted HTTPS requests like th
350350
```php
351351
$proxy = new Clue\React\SshProxy\SshSocksConnector('[email protected]');
352352

353-
$connector = new React\Socket\Connector(null, array(
353+
$connector = new React\Socket\Connector(array(
354354
'tcp' => $proxy,
355355
'dns' => false
356356
));
357357

358-
$browser = new React\Http\Browser(null, $connector);
358+
$browser = new React\Http\Browser($connector);
359359

360360
$browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {
361361
var_dump($response->getHeaders(), (string) $response->getBody());
@@ -435,7 +435,7 @@ $proxy = new Clue\React\SshProxy\SshProcessConnector('[email protected]');
435435
// or
436436
$proxy = new Clue\React\SshProxy\SshSocksConnector('[email protected]');
437437

438-
$connector = new React\Socket\Connector(null, array(
438+
$connector = new React\Socket\Connector(array(
439439
'tcp' => $proxy,
440440
'dns' => false,
441441
'timeout' => 3.0
@@ -481,7 +481,7 @@ $proxy = new Clue\React\SshProxy\SshProcessConnector('[email protected]');
481481
// or
482482
$proxy = new Clue\React\SshProxy\SshSocksConnector('[email protected]');
483483

484-
$connector = new React\Socket\Connector(null, array(
484+
$connector = new React\Socket\Connector(array(
485485
'tcp' => $proxy,
486486
'dns' => false
487487
));
@@ -495,7 +495,7 @@ $proxy = new Clue\React\SshProxy\SshProcessConnector('[email protected]');
495495
$proxy = new Clue\React\SshProxy\SshSocksConnector('[email protected]');
496496

497497
// set up Connector which uses Google's public DNS (8.8.8.8)
498-
$connector = new React\Socket\Connector(null, array(
498+
$connector = new React\Socket\Connector(array(
499499
'tcp' => $proxy,
500500
'dns' => '8.8.8.8'
501501
));

composer.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
"react/child-process": "^0.6",
2424
"react/event-loop": "^1.2",
2525
"react/promise": "^2.1 || ^1.2.1",
26-
"react/socket": "^1.8",
26+
"react/socket": "^1.9",
2727
"react/stream": "^1.2"
2828
},
2929
"require-dev": {
3030
"clue/block-react": "^1.3",
3131
"phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36",
32-
"react/http": "^1.4",
32+
"react/http": "^1.5",
3333
"react/mysql": "^0.5.5"
3434
}
3535
}

examples/01-https-request.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515

1616
$proxy = new Clue\React\SshProxy\SshProcessConnector($url);
1717

18-
$connector = new React\Socket\Connector(null, array(
18+
$connector = new React\Socket\Connector(array(
1919
'tcp' => $proxy,
2020
'timeout' => 3.0,
2121
'dns' => false
2222
));
2323

24-
$browser = new React\Http\Browser(null, $connector);
24+
$browser = new React\Http\Browser($connector);
2525

2626
$browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {
2727
var_dump($response->getHeaders(), (string) $response->getBody());

examples/02-optional-proxy-https-request.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
if (getenv('SSH_PROXY') !== false) {
1717
$proxy = new Clue\React\SshProxy\SshProcessConnector(getenv('SSH_PROXY'));
1818

19-
$connector = new React\Socket\Connector(null, array(
19+
$connector = new React\Socket\Connector(array(
2020
'tcp' => $proxy,
2121
'timeout' => 3.0,
2222
'dns' => false
2323
));
2424
}
2525

26-
$browser = new React\Http\Browser(null, $connector);
26+
$browser = new React\Http\Browser($connector);
2727

2828
$browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {
2929
var_dump($response->getHeaders(), (string) $response->getBody());

examples/11-proxy-raw-http-protocol.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
$proxy = new Clue\React\SshProxy\SshProcessConnector($url);
2020

21-
$connector = new React\Socket\Connector(null, array(
21+
$connector = new React\Socket\Connector(array(
2222
'tcp' => $proxy,
2323
'timeout' => 3.0,
2424
'dns' => false

examples/12-optional-proxy-raw-http-protocol.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
if (getenv('SSH_PROXY') !== false) {
2323
$proxy = new Clue\React\SshProxy\SshProcessConnector(getenv('SSH_PROXY'));
2424

25-
$connector = new React\Socket\Connector(null, array(
25+
$connector = new React\Socket\Connector(array(
2626
'tcp' => $proxy,
2727
'timeout' => 3.0,
2828
'dns' => false

examples/21-proxy-raw-https-protocol.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
$proxy = new Clue\React\SshProxy\SshSocksConnector($url);
2020

21-
$connector = new React\Socket\Connector(null, array(
21+
$connector = new React\Socket\Connector(array(
2222
'tcp' => $proxy,
2323
'timeout' => 3.0,
2424
'dns' => false

examples/22-optional-proxy-raw-https-protocol.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
if (getenv('SSH_PROXY') !== false) {
2323
$proxy = new Clue\React\SshProxy\SshProcessConnector(getenv('SSH_PROXY'));
2424

25-
$connector = new React\Socket\Connector(null, array(
25+
$connector = new React\Socket\Connector(array(
2626
'tcp' => $proxy,
2727
'timeout' => 3.0,
2828
'dns' => false

tests/FunctionalSshProcessConnectorTest.php

+7-9
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22

33
namespace Clue\Tests\React\SshProxy;
44

5-
use React\EventLoop\Factory;
65
use Clue\React\SshProxy\SshProcessConnector;
6+
use React\EventLoop\Loop;
77

88
class FunctionalSshProcessConnectorTest extends TestCase
99
{
1010
const TIMEOUT = 10.0;
1111

12-
private $loop;
1312
private $connector;
1413

1514
/**
@@ -22,25 +21,24 @@ public function setUpConnector()
2221
$this->markTestSkipped('No SSH_PROXY env set');
2322
}
2423

25-
$this->loop = Factory::create();
26-
$this->connector = new SshProcessConnector($url, $this->loop);
24+
$this->connector = new SshProcessConnector($url);
2725
}
2826

2927
public function testConnectInvalidProxyUriWillReturnRejectedPromise()
3028
{
31-
$this->connector = new SshProcessConnector(getenv('SSH_PROXY') . '.invalid', $this->loop);
29+
$this->connector = new SshProcessConnector(getenv('SSH_PROXY') . '.invalid');
3230
$promise = $this->connector->connect('example.com:80');
3331

3432
$this->setExpectedException('RuntimeException', 'Connection to example.com:80 failed because SSH client died');
35-
\Clue\React\Block\await($promise, $this->loop, self::TIMEOUT);
33+
\Clue\React\Block\await($promise, Loop::get(), self::TIMEOUT);
3634
}
3735

3836
public function testConnectInvalidTargetWillReturnRejectedPromise()
3937
{
4038
$promise = $this->connector->connect('example.invalid:80');
4139

4240
$this->setExpectedException('RuntimeException', 'Connection to example.invalid:80 rejected:');
43-
\Clue\React\Block\await($promise, $this->loop, self::TIMEOUT);
41+
\Clue\React\Block\await($promise, Loop::get(), self::TIMEOUT);
4442
}
4543

4644
public function testCancelConnectWillReturnRejectedPromise()
@@ -49,14 +47,14 @@ public function testCancelConnectWillReturnRejectedPromise()
4947
$promise->cancel();
5048

5149
$this->setExpectedException('RuntimeException', 'Connection to example.com:80 cancelled while waiting for SSH client');
52-
\Clue\React\Block\await($promise, $this->loop, 0);
50+
\Clue\React\Block\await($promise, Loop::get(), 0);
5351
}
5452

5553
public function testConnectValidTargetWillReturnPromiseWhichResolvesToConnection()
5654
{
5755
$promise = $this->connector->connect('example.com:80');
5856

59-
$connection = \Clue\React\Block\await($promise, $this->loop, self::TIMEOUT);
57+
$connection = \Clue\React\Block\await($promise, Loop::get(), self::TIMEOUT);
6058

6159
$this->assertInstanceOf('React\Socket\ConnectionInterface', $connection);
6260
$this->assertTrue($connection->isReadable());

tests/FunctionalSshSocksConnectorTest.php

+10-12
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22

33
namespace Clue\Tests\React\SshProxy;
44

5-
use React\EventLoop\Factory;
65
use Clue\React\SshProxy\SshSocksConnector;
6+
use React\EventLoop\Loop;
77

88
class FunctionalSshSocksConnectorTest extends TestCase
99
{
1010
const TIMEOUT = 10.0;
1111

12-
private $loop;
1312
private $connector;
1413

1514
/**
@@ -22,8 +21,7 @@ public function setUpConnector()
2221
$this->markTestSkipped('No SSH_PROXY env set');
2322
}
2423

25-
$this->loop = Factory::create();
26-
$this->connector = new SshSocksConnector($url, $this->loop);
24+
$this->connector = new SshSocksConnector($url);
2725
}
2826

2927
/**
@@ -32,25 +30,25 @@ public function setUpConnector()
3230
public function tearDownSSHClientProcess()
3331
{
3432
// run loop in order to shut down SSH client process again
35-
\Clue\React\Block\sleep(0.001, $this->loop);
33+
\Clue\React\Block\sleep(0.001, Loop::get());
3634
}
3735

3836
public function testConnectInvalidProxyUriWillReturnRejectedPromise()
3937
{
40-
$this->connector = new SshSocksConnector(getenv('SSH_PROXY') . '.invalid', $this->loop);
38+
$this->connector = new SshSocksConnector(getenv('SSH_PROXY') . '.invalid');
4139

4240
$promise = $this->connector->connect('example.com:80');
4341

4442
$this->setExpectedException('RuntimeException', 'Connection to example.com:80 failed because SSH client process died');
45-
\Clue\React\Block\await($promise, $this->loop, self::TIMEOUT);
43+
\Clue\React\Block\await($promise, Loop::get(), self::TIMEOUT);
4644
}
4745

4846
public function testConnectInvalidTargetWillReturnRejectedPromise()
4947
{
5048
$promise = $this->connector->connect('example.invalid:80');
5149

5250
$this->setExpectedException('RuntimeException', 'Connection to tcp://example.invalid:80 failed because connection to proxy was lost');
53-
\Clue\React\Block\await($promise, $this->loop, self::TIMEOUT);
51+
\Clue\React\Block\await($promise, Loop::get(), self::TIMEOUT);
5452
}
5553

5654
public function testCancelConnectWillReturnRejectedPromise()
@@ -59,14 +57,14 @@ public function testCancelConnectWillReturnRejectedPromise()
5957
$promise->cancel();
6058

6159
$this->setExpectedException('RuntimeException', 'Connection to example.com:80 cancelled while waiting for SSH client');
62-
\Clue\React\Block\await($promise, $this->loop, 0);
60+
\Clue\React\Block\await($promise, Loop::get(), 0);
6361
}
6462

6563
public function testConnectValidTargetWillReturnPromiseWhichResolvesToConnection()
6664
{
6765
$promise = $this->connector->connect('example.com:80');
6866

69-
$connection = \Clue\React\Block\await($promise, $this->loop, self::TIMEOUT);
67+
$connection = \Clue\React\Block\await($promise, Loop::get(), self::TIMEOUT);
7068

7169
$this->assertInstanceOf('React\Socket\ConnectionInterface', $connection);
7270
$this->assertTrue($connection->isReadable());
@@ -76,10 +74,10 @@ public function testConnectValidTargetWillReturnPromiseWhichResolvesToConnection
7674

7775
public function testConnectValidTargetWillReturnPromiseWhichResolvesToConnectionForCustomBindAddress()
7876
{
79-
$this->connector = new SshSocksConnector(getenv('SSH_PROXY') . '?bind=127.0.0.1:1081', $this->loop);
77+
$this->connector = new SshSocksConnector(getenv('SSH_PROXY') . '?bind=127.0.0.1:1081', Loop::get());
8078
$promise = $this->connector->connect('example.com:80');
8179

82-
$connection = \Clue\React\Block\await($promise, $this->loop, self::TIMEOUT);
80+
$connection = \Clue\React\Block\await($promise, Loop::get(), self::TIMEOUT);
8381

8482
$this->assertInstanceOf('React\Socket\ConnectionInterface', $connection);
8583
$this->assertTrue($connection->isReadable());

tests/IntegrationSshProcessConnectorTest.php

+9-13
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
namespace Clue\Tests\React\SshProxy;
44

55
use Clue\React\SshProxy\SshProcessConnector;
6-
use React\EventLoop\Factory;
6+
use React\EventLoop\Loop;
77
use React\Socket\ConnectionInterface;
88

99
class IntegrationSshProcessConnectorTest extends TestCase
1010
{
1111
public function testConnectWillResolveWithConnectionInterfaceWhenProcessOutputsChannelOpenConfirmMessage()
1212
{
13-
$loop = Factory::create();
14-
$connector = new SshProcessConnector('host', $loop);
13+
$connector = new SshProcessConnector('host');
1514

1615
$ref = new \ReflectionProperty($connector, 'cmd');
1716
$ref->setAccessible(true);
@@ -20,13 +19,12 @@ public function testConnectWillResolveWithConnectionInterfaceWhenProcessOutputsC
2019
$promise = $connector->connect('example.com:80');
2120
$promise->then($this->expectCallableOnceWith($this->isInstanceOf('React\Socket\ConnectionInterface')));
2221

23-
$loop->run();
22+
Loop::run();
2423
}
2524

2625
public function testConnectWillRejectWithExceptionWhenProcessOutputsChannelOpenFailedMessage()
2726
{
28-
$loop = Factory::create();
29-
$connector = new SshProcessConnector('host', $loop);
27+
$connector = new SshProcessConnector('host');
3028

3129
$ref = new \ReflectionProperty($connector, 'cmd');
3230
$ref->setAccessible(true);
@@ -35,13 +33,12 @@ public function testConnectWillRejectWithExceptionWhenProcessOutputsChannelOpenF
3533
$promise = $connector->connect('example.com:80');
3634
$promise->then(null, $this->expectCallableOnceWith($this->isInstanceOf('RuntimeException')));
3735

38-
$loop->run();
36+
Loop::run();
3937
}
4038

4139
public function testConnectWillRejectWithExceptionWhenProcessOutputsEndsWithoutChannelMessage()
4240
{
43-
$loop = Factory::create();
44-
$connector = new SshProcessConnector('host', $loop);
41+
$connector = new SshProcessConnector('host');
4542

4643
$ref = new \ReflectionProperty($connector, 'cmd');
4744
$ref->setAccessible(true);
@@ -50,13 +47,12 @@ public function testConnectWillRejectWithExceptionWhenProcessOutputsEndsWithoutC
5047
$promise = $connector->connect('example.com:80');
5148
$promise->then(null, $this->expectCallableOnceWith($this->isInstanceOf('RuntimeException')));
5249

53-
$loop->run();
50+
Loop::run();
5451
}
5552

5653
public function testConnectWillResolveWithConnectionThatWillEmitImmediateDataFromProcessStdoutAfterChannelOpenConfirmMessage()
5754
{
58-
$loop = Factory::create();
59-
$connector = new SshProcessConnector('host', $loop);
55+
$connector = new SshProcessConnector('host');
6056

6157
$ref = new \ReflectionProperty($connector, 'cmd');
6258
$ref->setAccessible(true);
@@ -69,6 +65,6 @@ public function testConnectWillResolveWithConnectionThatWillEmitImmediateDataFro
6965
$connection->on('data', $data);
7066
});
7167

72-
$loop->run();
68+
Loop::run();
7369
}
7470
}

0 commit comments

Comments
 (0)