Skip to content

Commit 6f5d7f2

Browse files
authored
Merge pull request #283 from edusalguero/refactor/ratchet-0.4-support
Refactor/ratchet 0.4 support
2 parents 72ab0c1 + 7d0c0b3 commit 6f5d7f2

File tree

12 files changed

+350
-50
lines changed

12 files changed

+350
-50
lines changed

.travis.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
language: php
2+
3+
php:
4+
- 5.5
5+
- 5.6
6+
- 7.0
7+
- 7.1
8+
- 7.2
9+
10+
before_script:
11+
- travis_retry composer self-update
12+
- travis_retry composer install --prefer-source --no-interaction
13+
14+
script:
15+
- phpunit -c phpunit.xml --coverage-text

Event/ClientRejectedEvent.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
namespace Gos\Bundle\WebSocketBundle\Event;
44

5-
use Guzzle\Http\Message\RequestInterface;
5+
use GuzzleHttp\Psr7\Request;
6+
use Psr\Http\Message\RequestInterface;
67
use Symfony\Component\EventDispatcher\Event;
78

89
/**
@@ -16,7 +17,7 @@ class ClientRejectedEvent extends Event
1617
protected $origin;
1718

1819
/**
19-
* @var RequestInterface
20+
* @var Request
2021
*/
2122
protected $request;
2223

Event/StartServerListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ protected function closure(Server $server, LoopInterface $loop)
5757
}
5858

5959
$server->emit('end');
60-
$server->shutdown();
60+
$server->close();
6161

6262
foreach ($this->periodicRegistry->getPeriodics() as $periodic) {
6363
if ($periodic instanceof TimerInterface && $loop->isTimerActive($periodic)) {

Resources/config/services/services.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,10 @@ services:
229229
- { name: gos_web_socket.push_handler, alias: amqp }
230230

231231
gos_web_socket.wamp.topic_manager:
232-
class: Ratchet\Wamp\TopicManager
232+
class: Gos\Bundle\WebSocketBundle\Topic\TopicManager
233+
arguments:
234+
- '@gos_web_socket_server.wamp_application'
235+
233236

234237
gos_web_socket.kernel_event.terminate:
235238
class: Gos\Bundle\WebSocketBundle\Event\KernelTerminateListener

Server/App/Dispatcher/TopicDispatcher.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
use Gos\Bundle\WebSocketBundle\Server\Exception\FirewallRejectionException;
99
use Gos\Bundle\WebSocketBundle\Topic\SecuredTopicInterface;
1010
use Gos\Bundle\WebSocketBundle\Topic\PushableTopicInterface;
11+
use Gos\Bundle\WebSocketBundle\Topic\TopicManager;
1112
use Gos\Bundle\WebSocketBundle\Topic\TopicPeriodicTimer;
1213
use Gos\Bundle\WebSocketBundle\Topic\TopicPeriodicTimerInterface;
1314
use Psr\Log\LoggerInterface;
1415
use Psr\Log\NullLogger;
1516
use Ratchet\ConnectionInterface;
1617
use Ratchet\Wamp\Topic;
17-
use Ratchet\Wamp\TopicManager;
1818

1919

2020
/**
@@ -51,7 +51,9 @@ class TopicDispatcher implements TopicDispatcherInterface
5151

5252
const PUSH = 'onPush';
5353

54-
/**
54+
/**use Ratchet\MessageComponentInterface;
55+
use Ratchet\WebSocket\WsServerInterface;
56+
use Ratchet\ConnectionInterface;
5557
* @param TopicRegistry $topicRegistry
5658
* @param WampRouter $router
5759
* @param TopicPeriodicTimer $topicPeriodicTimer

Server/App/Stack/OriginCheck.php

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
use Gos\Bundle\WebSocketBundle\Event\ClientRejectedEvent;
66
use Gos\Bundle\WebSocketBundle\Event\Events;
7-
use Guzzle\Http\Message\RequestInterface;
7+
use GuzzleHttp\Psr7 as gPsr;
8+
use GuzzleHttp\Psr7\Response;
9+
use Psr\Http\Message\RequestInterface;
810
use Ratchet\ConnectionInterface;
911
use Ratchet\Http\OriginCheck as BaseOriginCheck;
1012
use Ratchet\MessageComponentInterface;
@@ -19,27 +21,40 @@ class OriginCheck extends BaseOriginCheck
1921
* @var EventDispatcherInterface
2022
*/
2123
protected $eventDispatcher;
24+
/**
25+
* @var bool
26+
*/
27+
private $check;
2228

2329
/**
2430
* @param MessageComponentInterface $component
31+
* @param bool $check
2532
* @param string[] $allowed
2633
* @param EventDispatcherInterface $eventDispatcher
2734
*/
2835
public function __construct(
2936
MessageComponentInterface $component,
30-
array $allowed = array(),
37+
$check = true,
38+
array $allowed = [],
3139
EventDispatcherInterface $eventDispatcher
32-
) {
40+
)
41+
{
3342
$this->eventDispatcher = $eventDispatcher;
3443
parent::__construct($component, $allowed);
44+
$this->check = $check;
3545
}
3646

3747
/**
3848
* {@inheritdoc}
3949
*/
4050
public function onOpen(ConnectionInterface $conn, RequestInterface $request = null)
4151
{
42-
$header = (string) $request->getHeader('Origin');
52+
if (!$this->check) {
53+
return $this->_component->onOpen($conn, $request);
54+
}
55+
56+
$header = (string)$request->getHeaderLine('Origin');
57+
4358
$origin = parse_url($header, PHP_URL_HOST) ?: $header;
4459

4560
if (!in_array($origin, $this->allowedOrigins)) {
@@ -53,4 +68,20 @@ public function onOpen(ConnectionInterface $conn, RequestInterface $request = nu
5368

5469
return $this->_component->onOpen($conn, $request);
5570
}
71+
72+
/**
73+
* Close a connection with an HTTP response
74+
*
75+
* @param \Ratchet\ConnectionInterface $conn
76+
* @param int $code HTTP status code
77+
*/
78+
protected function close(ConnectionInterface $conn, $code = 400, array $additional_headers = [])
79+
{
80+
$response = new Response($code, array_merge([
81+
'X-Powered-By' => \Ratchet\VERSION,
82+
], $additional_headers));
83+
84+
$conn->send(gPsr\str($response));
85+
$conn->close();
86+
}
5687
}

Server/App/WampApplication.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ public function onCall(ConnectionInterface $conn, $id, $topic, array $params)
133133
*/
134134
public function onSubscribe(ConnectionInterface $conn, $topic)
135135
{
136+
136137
$user = $this->clientStorage->getClient($conn->WAMP->clientStorageId);
137138
$username = $user instanceof UserInterface ? $user->getUsername() : $user;
138139

Server/Type/WebSocketServer.php

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,18 @@
99
use Gos\Bundle\WebSocketBundle\Pusher\ServerPushHandlerRegistry;
1010
use Gos\Bundle\WebSocketBundle\Server\App\Registry\OriginRegistry;
1111
use Gos\Bundle\WebSocketBundle\Server\App\Registry\PeriodicRegistry;
12+
use Gos\Bundle\WebSocketBundle\Server\App\Stack\OriginCheck;
13+
use Gos\Bundle\WebSocketBundle\Server\App\Stack\WampConnectionPeriodicTimer;
1214
use Gos\Bundle\WebSocketBundle\Server\App\WampApplication;
13-
use Gos\Component\RatchetStack\Builder;
15+
use Gos\Bundle\WebSocketBundle\Server\WampServer;
16+
use Gos\Bundle\WebSocketBundle\Topic\TopicManager;
1417
use ProxyManager\Proxy\ProxyInterface;
1518
use Psr\Log\LoggerInterface;
1619
use Psr\Log\NullLogger;
17-
use Ratchet\Wamp\TopicManager;
18-
use React\EventLoop\Factory;
20+
use Ratchet\Http\HttpServer;
21+
use Ratchet\Server\IoServer;
22+
use Ratchet\Session\SessionProvider;
23+
use Ratchet\WebSocket\WsServer;
1924
use React\EventLoop\LoopInterface;
2025
use React\Socket\Server;
2126
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -67,18 +72,21 @@ class WebSocketServer implements ServerInterface
6772
/** @var ServerPushHandlerRegistry */
6873
protected $serverPusherHandlerRegistry;
6974

70-
/** @var TopicManager */
75+
/**
76+
* @var TopicManager
77+
*/
7178
protected $topicManager;
7279

7380
/**
74-
* @param LoopInterface $loop
75-
* @param EventDispatcherInterface $eventDispatcher
76-
* @param PeriodicRegistry $periodicRegistry
77-
* @param WampApplication $wampApplication
78-
* @param OriginRegistry $originRegistry
79-
* @param bool $originCheck
80-
* @param TopicManager $topicManager
81-
* @param LoggerInterface|null $logger
81+
* @param LoopInterface $loop
82+
* @param EventDispatcherInterface $eventDispatcher
83+
* @param PeriodicRegistry $periodicRegistry
84+
* @param WampApplication $wampApplication
85+
* @param OriginRegistry $originRegistry
86+
* @param bool $originCheck
87+
* @param TopicManager $topicManager
88+
* @param ServerPushHandlerRegistry $serverPushHandlerRegistry
89+
* @param LoggerInterface|null $logger
8290
*/
8391
public function __construct(
8492
LoopInterface $loop,
@@ -120,13 +128,8 @@ public function launch($host, $port, $profile)
120128
{
121129
$this->logger->info('Starting web socket');
122130

123-
//In order to avoid circular reference
124-
$this->topicManager->setWampApplication($this->wampApplication);
125131

126-
$stack = new Builder();
127-
128-
$server = new Server($this->loop);
129-
$server->listen($port, $host);
132+
$server = new Server("$host:$port", $this->loop);
130133

131134
if (true === $profile) {
132135
$memoryUsagePeriodicTimer = new PeriodicMemoryUsage($this->logger);
@@ -146,21 +149,29 @@ public function launch($host, $port, $profile)
146149

147150
$allowedOrigins = array_merge(array('localhost', '127.0.0.1'), $this->originRegistry->getOrigins());
148151

149-
$stack
150-
->push('Ratchet\Server\IoServer', $server, $this->loop)
151-
->push('Ratchet\Http\HttpServer');
152-
153-
if ($this->originCheck) {
154-
$stack->push('Gos\Bundle\WebSocketBundle\Server\App\Stack\OriginCheck', $allowedOrigins, $this->eventDispatcher);
155-
}
156-
157-
$stack
158-
->push('Ratchet\WebSocket\WsServer')
159-
->push('Gos\Bundle\WebSocketBundle\Server\App\Stack\WampConnectionPeriodicTimer', $this->loop)
160-
->push('Ratchet\Session\SessionProvider', $this->sessionHandler)
161-
->push('Ratchet\Wamp\WampServer', $this->topicManager);
162-
163-
$app = $stack->resolve($this->wampApplication);
152+
$wsServer = new WsServer(
153+
new WampConnectionPeriodicTimer(
154+
new WampServer($this->wampApplication, $this->topicManager),
155+
$this->loop
156+
)
157+
);
158+
$wsServer->setStrictSubProtocolCheck(false);
159+
160+
$app = new IoServer(
161+
new HttpServer(
162+
new OriginCheck(
163+
new SessionProvider(
164+
$wsServer,
165+
$this->sessionHandler
166+
),
167+
$this->originCheck,
168+
$allowedOrigins,
169+
$this->eventDispatcher
170+
)
171+
),
172+
$server,
173+
$this->loop
174+
);
164175

165176
//Push Transport Layer
166177
foreach ($this->serverPusherHandlerRegistry->getPushers() as $handler) {

Server/WampServer.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace Gos\Bundle\WebSocketBundle\Server;
4+
5+
use Gos\Bundle\WebSocketBundle\Topic\TopicManager;
6+
use Ratchet\ConnectionInterface;
7+
use Ratchet\MessageComponentInterface;
8+
use Ratchet\Wamp\ServerProtocol;
9+
use Ratchet\Wamp\WampServerInterface;
10+
use Ratchet\WebSocket\WsServerInterface;
11+
12+
/**
13+
* Class WampServer
14+
*
15+
* @author Edu Salguero <[email protected]>
16+
*/
17+
class WampServer implements MessageComponentInterface, WsServerInterface
18+
{
19+
/**
20+
* @var ServerProtocol
21+
*/
22+
protected $wampProtocol;
23+
24+
/**
25+
* This class just makes it 1 step easier to use Topic objects in WAMP
26+
* If you're looking at the source code, look in the __construct of this
27+
* class and use that to make your application instead of using this
28+
*/
29+
public function __construct(WampServerInterface $app, TopicManager $topicManager)
30+
{
31+
$this->wampProtocol = new ServerProtocol($topicManager);
32+
}
33+
34+
/**
35+
* {@inheritdoc}
36+
*/
37+
public function onOpen(ConnectionInterface $conn)
38+
{
39+
$this->wampProtocol->onOpen($conn);
40+
}
41+
42+
/**
43+
* {@inheritdoc}
44+
*/
45+
public function onMessage(ConnectionInterface $conn, $msg)
46+
{
47+
try {
48+
$this->wampProtocol->onMessage($conn, $msg);
49+
} catch (\Exception $we) {
50+
$conn->close(1007);
51+
}
52+
}
53+
54+
/**
55+
* {@inheritdoc}
56+
*/
57+
public function onClose(ConnectionInterface $conn)
58+
{
59+
$this->wampProtocol->onClose($conn);
60+
}
61+
62+
/**
63+
* {@inheritdoc}
64+
*/
65+
public function onError(ConnectionInterface $conn, \Exception $e)
66+
{
67+
$this->wampProtocol->onError($conn, $e);
68+
}
69+
70+
/**
71+
* {@inheritdoc}
72+
*/
73+
public function getSubProtocols()
74+
{
75+
return $this->wampProtocol->getSubProtocols();
76+
}
77+
}

0 commit comments

Comments
 (0)