Skip to content
This repository was archived by the owner on Mar 24, 2025. It is now read-only.

Commit 924363b

Browse files
committed
improve onHandShake callback
1 parent 7967033 commit 924363b

File tree

3 files changed

+38
-50
lines changed

3 files changed

+38
-50
lines changed

config/swoole_websocket.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@
3737

3838
/*
3939
|--------------------------------------------------------------------------
40-
| Websocket handler for onHandShake callback
41-
| If enable, onOpen would not be triggered
40+
| Websocket handler for customized onHandShake callback
4241
|--------------------------------------------------------------------------
4342
*/
4443
'handshake' => [

src/Concerns/InteractsWithWebsocket.php

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -53,73 +53,54 @@ trait InteractsWithWebsocket
5353
protected $wsEvents = ['open', 'message', 'close'];
5454

5555
/**
56-
* "onOpen" listener.
57-
*
58-
* @param \Swoole\Websocket\Server $server
56+
* "onHandShake" listener.
5957
* @param \Swoole\Http\Request $swooleRequest
58+
* @param \Swoole\Http\Response $response
6059
*/
61-
public function onOpen($server, $swooleRequest)
60+
public function onHandShake($swooleRequest, $response)
6261
{
63-
$illuminateRequest = Request::make($swooleRequest)->toIlluminate();
64-
$websocket = $this->app->make(Websocket::class);
65-
$sandbox = $this->app->make(Sandbox::class);
66-
67-
try {
68-
$websocket->reset(true)->setSender($swooleRequest->fd);
69-
// set currnt request to sandbox
70-
$sandbox->setRequest($illuminateRequest);
71-
// enable sandbox
72-
$sandbox->enable();
73-
// check if socket.io connection established
74-
if (! $this->websocketHandler->onOpen($swooleRequest->fd, $illuminateRequest)) {
75-
return;
76-
}
77-
// trigger 'connect' websocket event
78-
if ($websocket->eventExists('connect')) {
79-
// set sandbox container to websocket pipeline
80-
$websocket->setContainer($sandbox->getApplication());
81-
$websocket->call('connect', $illuminateRequest);
82-
}
83-
} catch (Throwable $e) {
84-
$this->logServerError($e);
85-
} finally {
86-
// disable and recycle sandbox resource
87-
$sandbox->disable();
88-
}
62+
$this->onOpen(
63+
$this->app->make(Server::class),
64+
$swooleRequest,
65+
$response
66+
);
8967
}
9068

9169
/**
92-
* @param \Swoole\Http\Request $swooleRequest
93-
* @param \Swoole\Http\Response $response
70+
* "onOpen" listener.
9471
*
95-
* @return bool
96-
* @throws \Illuminate\Contracts\Container\BindingResolutionException
72+
* @param \Swoole\Websocket\Server $server
73+
* @param \Swoole\Http\Request $swooleRequest
74+
* @param \Swoole\Http\Response $response (optional)
9775
*/
98-
public function onHandShake($swooleRequest, $response)
76+
public function onOpen($server, $swooleRequest, $response = null)
9977
{
10078
$illuminateRequest = Request::make($swooleRequest)->toIlluminate();
10179
$websocket = $this->app->make(Websocket::class);
10280
$sandbox = $this->app->make(Sandbox::class);
103-
$handler = $this->container->make('config')->get('swoole_websocket.handshake.handler');
81+
$handshakeHandler = $this->app->make('config')
82+
->get('swoole_websocket.handshake.handler');
10483

10584
try {
10685
$websocket->reset(true)->setSender($swooleRequest->fd);
10786
// set currnt request to sandbox
10887
$sandbox->setRequest($illuminateRequest);
10988
// enable sandbox
11089
$sandbox->enable();
111-
112-
if (! $this->app->make($handler)->handle($swooleRequest, $response)) {
113-
return false;
90+
// call customized handshake handler
91+
if ($response && ! $this->app->make($handshakeHandler)->handle($swooleRequest, $response)) {
92+
return;
93+
}
94+
// check if socket.io connection established
95+
if (! $this->websocketHandler->onOpen($swooleRequest->fd, $illuminateRequest)) {
96+
return;
11497
}
11598
// trigger 'connect' websocket event
11699
if ($websocket->eventExists('connect')) {
117100
// set sandbox container to websocket pipeline
118101
$websocket->setContainer($sandbox->getApplication());
119102
$websocket->call('connect', $illuminateRequest);
120103
}
121-
122-
return true;
123104
} catch (Throwable $e) {
124105
$this->logServerError($e);
125106
} finally {
@@ -258,17 +239,19 @@ public function getPayloadParser()
258239
protected function prepareWebsocket()
259240
{
260241
$config = $this->container->make('config');
261-
$isWebsocket = $config->get('swoole_http.websocket.enabled');
262242
$parser = $config->get('swoole_websocket.parser');
263243

264-
if ($isWebsocket) {
265-
$handshake = $config->get('swoole_websocket.handshake.enabled');
244+
if (! $this->isServerWebsocket = $config->get('swoole_http.websocket.enabled')) {
245+
return;
246+
}
266247

267-
$this->events = array_merge($this->events ?? [], array_merge($this->wsEvents, $handshake ? ['handshake'] : []));
268-
$this->isServerWebsocket = true;
269-
$this->prepareWebsocketRoom();
270-
$this->setPayloadParser(new $parser);
248+
if ($config->get('swoole_websocket.handshake.enabled')) {
249+
$this->wsEvents = array_merge($this->wsEvents, ['handshake']);
271250
}
251+
252+
$this->events = array_merge($this->events ?? [], $this->wsEvents);
253+
$this->prepareWebsocketRoom();
254+
$this->setPayloadParser(new $parser);
272255
}
273256

274257
/**

tests/Server/ManagerTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,8 +471,14 @@ public function testOnHandShake()
471471

472472
$container->alias(Sandbox::class, 'swoole.sandbox');
473473

474+
$handler = m::mock(HandlerContract::class);
475+
$handler->shouldReceive('onOpen')
476+
->with(1, m::type('Illuminate\Http\Request'))
477+
->andReturn(true);
478+
474479
$manager = $this->getWebsocketManager();
475480
$manager->setApplication($container);
481+
$manager->setWebsocketHandler($handler);
476482
$manager->onHandShake($request, $response);
477483
}
478484

0 commit comments

Comments
 (0)