改名
This commit is contained in:
@@ -7,6 +7,8 @@ namespace HttpServer\Events;
|
|||||||
use Exception;
|
use Exception;
|
||||||
use HttpServer\Abstracts\Callback;
|
use HttpServer\Abstracts\Callback;
|
||||||
use HttpServer\Route\Annotation\Websocket as AWebsocket;
|
use HttpServer\Route\Annotation\Websocket as AWebsocket;
|
||||||
|
use Snowflake\Event;
|
||||||
|
use Snowflake\Exception\ComponentException;
|
||||||
use Snowflake\Snowflake;
|
use Snowflake\Snowflake;
|
||||||
use Swoole\Http\Request as SRequest;
|
use Swoole\Http\Request as SRequest;
|
||||||
use Swoole\Http\Response as SResponse;
|
use Swoole\Http\Response as SResponse;
|
||||||
@@ -22,18 +24,17 @@ class OnHandshake extends Callback
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param SRequest $request
|
* @param $request
|
||||||
* @param SResponse $response
|
* @param $response
|
||||||
* @return bool|string
|
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function onHandler(SRequest $request, SResponse $response)
|
private function resolveParse($request, $response)
|
||||||
{
|
{
|
||||||
/** @var Server $server */
|
/** @var Server $server */
|
||||||
$secWebSocketKey = $request->header['sec-websocket-key'];
|
$secWebSocketKey = $request->header['sec-websocket-key'];
|
||||||
$patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#';
|
$patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#';
|
||||||
if (0 === preg_match($patten, $secWebSocketKey) || 16 !== strlen(base64_decode($secWebSocketKey))) {
|
if (0 === preg_match($patten, $secWebSocketKey) || 16 !== strlen(base64_decode($secWebSocketKey))) {
|
||||||
return false;
|
throw new Exception('protocol error.', 500);
|
||||||
}
|
}
|
||||||
$key = base64_encode(sha1(
|
$key = base64_encode(sha1(
|
||||||
$request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
|
$request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
|
||||||
@@ -51,16 +52,61 @@ class OnHandshake extends Callback
|
|||||||
foreach ($headers as $key => $val) {
|
foreach ($headers as $key => $val) {
|
||||||
$response->header($key, $val);
|
$response->header($key, $val);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** @var AWebsocket $manager */
|
|
||||||
$manager = Snowflake::app()->annotation->get('websocket');
|
/**
|
||||||
if ($manager->has($manager->getName(AWebsocket::HANDSHAKE))) {
|
* @param $response
|
||||||
$manager->runWith($manager->getName(AWebsocket::HANDSHAKE), [$request, $response]);
|
* @param int $code
|
||||||
} else {
|
* @return false
|
||||||
$response->status(502);
|
*/
|
||||||
$response->end();
|
private function disconnect($response, $code = 500)
|
||||||
|
{
|
||||||
|
$response->status($code);
|
||||||
|
$response->end();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param SRequest $request
|
||||||
|
* @param SResponse $response
|
||||||
|
* @return mixed|void
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function onHandler(SRequest $request, SResponse $response)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->resolveParse($request, $response);
|
||||||
|
|
||||||
|
/** @var AWebsocket $manager */
|
||||||
|
$manager = Snowflake::app()->annotation->get('websocket');
|
||||||
|
$name = $manager->getName(AWebsocket::HANDSHAKE);
|
||||||
|
if (!$manager->has($name)) {
|
||||||
|
return $this->disconnect($response);
|
||||||
|
}
|
||||||
|
return $manager->runWith($name, [$request, $response]);
|
||||||
|
} catch (\Throwable $exception) {
|
||||||
|
$this->addError($exception->getMessage());
|
||||||
|
return $this->disconnect($response, 500);
|
||||||
|
} finally {
|
||||||
|
$this->eventTrigger($request, $response);
|
||||||
}
|
}
|
||||||
return true;
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $request
|
||||||
|
* @param $response
|
||||||
|
* @throws ComponentException
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private function eventTrigger($request, $response)
|
||||||
|
{
|
||||||
|
go(function () use ($request, $response) {
|
||||||
|
$manager = Snowflake::app()->getEvent();
|
||||||
|
$manager->trigger(Event::SERVER_HANDSHAKE, [$request, $response]);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user