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

Commit eafc1cf

Browse files
authored
Merge pull request #302 from swooletw/develop
1. improve onHandShake callback 2. make pid file compatible with older versions
2 parents b3b9d5e + 5e27069 commit eafc1cf

File tree

6 files changed

+46
-54
lines changed

6 files changed

+46
-54
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/Commands/HttpServerCommand.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,9 @@ protected function showInfos()
212212
$isWebsocket = Arr::get($this->config, 'websocket.enabled');
213213
$hasTaskWorker = $isWebsocket || Arr::get($this->config, 'queue.default') === 'swoole';
214214
$logFile = Arr::get($this->config, 'server.options.log_file');
215-
$pidManager = $this->laravel->make(PidManager::class);
216-
[$masterPid, $managerPid] = $pidManager->read();
215+
$pids = $this->laravel->make(PidManager::class)->read();
216+
$masterPid = $pids['masterPid'] ?? null;
217+
$managerPid = $pids['managerPid'] ?? null;
217218

218219
$table = [
219220
['PHP Version', 'Version' => phpversion()],

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
/**

src/Server/PidManager.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ public function read(): array
5858
$pids = explode(',', $content);
5959
}
6060

61-
return $pids;
61+
return [
62+
'masterPid' => $pids[0] ?? null,
63+
'managerPid' => $pids[1] ?? null
64+
];
6265
}
6366

6467
/**

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

tests/Server/PidManagerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public function testRead()
6767
});
6868

6969
$this->assertEquals(
70-
['1', '2'],
70+
['masterPid' => '1', 'managerPid' => '2'],
7171
$pidManager->read()
7272
);
7373
}

0 commit comments

Comments
 (0)