Skip to content

Commit 7f8cd67

Browse files
authored
Merge branch 'master' into chore/php84
2 parents 032eab6 + 390dc57 commit 7f8cd67

4 files changed

Lines changed: 185 additions & 169 deletions

File tree

src/OneBot/Driver/Swoole/TopEventListener.php

Lines changed: 106 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -83,38 +83,38 @@ public function onWorkerExit()
8383
*/
8484
public function onRequest(array $config, Request $request, Response $response)
8585
{
86-
ob_logger()->debug('Http request: ' . $request->server['request_uri']);
87-
if (empty($content = $request->rawContent()) && $content !== '0') { // empty 遇到纯0的请求会返回true,所以这里加上 !== '0'
88-
$content = null;
89-
}
90-
$req = HttpFactory::createServerRequest(
91-
$request->server['request_method'],
92-
$request->server['request_uri'],
93-
$request->header,
94-
$content
95-
);
96-
$req = $req->withQueryParams($request->get ?? [])
97-
->withCookieParams($request->cookie ?? []);
98-
$uploaded = [];
99-
// 上传的文件
100-
if (!empty($request->files)) {
101-
foreach ($request->files as $key => $value) {
102-
$upload = new UploadedFile([
103-
'key' => $key,
104-
...$value,
105-
]);
106-
$uploaded[] = $upload;
86+
try {
87+
ob_logger()->debug('Http request: ' . $request->server['request_uri']);
88+
if (empty($content = $request->rawContent()) && $content !== '0') { // empty 遇到纯0的请求会返回true,所以这里加上 !== '0'
89+
$content = null;
10790
}
108-
if ($uploaded !== []) {
109-
$req = $req->withUploadedFiles($uploaded);
91+
$req = HttpFactory::createServerRequest(
92+
$request->server['request_method'],
93+
$request->server['request_uri'],
94+
$request->header,
95+
$content
96+
);
97+
$req = $req->withQueryParams($request->get ?? [])
98+
->withCookieParams($request->cookie ?? []);
99+
$uploaded = [];
100+
// 上传的文件
101+
if (!empty($request->files)) {
102+
foreach ($request->files as $key => $value) {
103+
$upload = new UploadedFile([
104+
'key' => $key,
105+
...$value,
106+
]);
107+
$uploaded[] = $upload;
108+
}
109+
if ($uploaded !== []) {
110+
$req = $req->withUploadedFiles($uploaded);
111+
}
110112
}
111-
}
112-
// post 包体
113-
if (!empty($request->post)) {
114-
$req = $req->withParsedBody($request->post);
115-
}
116-
$event = new HttpRequestEvent($req);
117-
try {
113+
// post 包体
114+
if (!empty($request->post)) {
115+
$req = $req->withParsedBody($request->post);
116+
}
117+
$event = new HttpRequestEvent($req);
118118
$event->setSocketConfig($config);
119119
ob_event_dispatcher()->dispatch($event);
120120
if (($psr_response = $event->getResponse()) !== null) {
@@ -128,7 +128,7 @@ public function onRequest(array $config, Request $request, Response $response)
128128
}
129129
} catch (\Throwable $e) {
130130
ExceptionHandler::getInstance()->handle($e);
131-
if (is_callable($event->getErrorHandler())) {
131+
if (isset($event) && is_callable($event->getErrorHandler())) {
132132
$err_response = call_user_func($event->getErrorHandler(), $e, $event);
133133
if ($err_response instanceof ResponseInterface) {
134134
foreach ($err_response->getHeaders() as $header => $value) {
@@ -164,88 +164,97 @@ public function onClose(array $config, ?Server $server, $fd)
164164
*/
165165
public function onHandshake(array $config, Request $request, Response $response)
166166
{
167-
ob_logger()->debug('WebSocket connection handahske: ' . $request->fd);
168-
if (empty($content = $request->rawContent())) {
169-
$content = null;
170-
}
171-
$event = new WebSocketOpenEvent(HttpFactory::createServerRequest(
172-
$request->server['request_method'],
173-
$request->server['request_uri'],
174-
$request->header,
175-
$content
176-
), $request->fd);
177-
$event->setSocketConfig($config);
178-
ob_event_dispatcher()->dispatchWithHandler($event);
179-
// 检查有没有制定response
180-
if (is_object($event->getResponse())) {
181-
$user_resp = $event->getResponse();
182-
// 不等于 101 bu不握手
183-
if ($user_resp->getStatusCode() !== 101) {
167+
try {
168+
ob_logger()->debug('WebSocket connection handahske: ' . $request->fd);
169+
if (empty($content = $request->rawContent())) {
170+
$content = null;
171+
}
172+
$event = new WebSocketOpenEvent(HttpFactory::createServerRequest(
173+
$request->server['request_method'],
174+
$request->server['request_uri'],
175+
$request->header,
176+
$content
177+
), $request->fd);
178+
$event->setSocketConfig($config);
179+
ob_event_dispatcher()->dispatchWithHandler($event);
180+
// 检查有没有制定response
181+
if (is_object($event->getResponse())) {
182+
$user_resp = $event->getResponse();
183+
// 不等于 101 bu不握手
184+
if ($user_resp->getStatusCode() !== 101) {
185+
foreach ($user_resp->getHeaders() as $header => $value) {
186+
if (is_array($value)) {
187+
$response->setHeader($header, implode(';', $value));
188+
}
189+
}
190+
$response->setStatusCode($user_resp->getStatusCode());
191+
$response->end($user_resp->getBody()->getContents());
192+
return false;
193+
}
194+
// 等于 101 时候,检查把 Header 合进来
195+
$my_headers = [];
184196
foreach ($user_resp->getHeaders() as $header => $value) {
185197
if (is_array($value)) {
186-
$response->setHeader($header, implode(';', $value));
198+
$my_headers[$header] = implode(';', $value);
187199
}
188200
}
189-
$response->setStatusCode($user_resp->getStatusCode());
190-
$response->end($user_resp->getBody()->getContents());
201+
}
202+
// 手动实现握手
203+
// websocket握手连接算法验证
204+
$sec_websocket_key = $request->header['sec-websocket-key'];
205+
$patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#';
206+
if (preg_match($patten, $sec_websocket_key) === 0 || strlen(base64_decode($sec_websocket_key)) !== 16) {
207+
$response->end();
191208
return false;
192209
}
193-
// 等于 101 时候,检查把 Header 合进来
194-
$my_headers = [];
195-
foreach ($user_resp->getHeaders() as $header => $value) {
196-
if (is_array($value)) {
197-
$my_headers[$header] = implode(';', $value);
198-
}
210+
echo $request->header['sec-websocket-key'];
211+
$key = base64_encode(
212+
sha1(
213+
$request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
214+
true
215+
)
216+
);
217+
$headers = [
218+
'Upgrade' => 'websocket',
219+
'Connection' => 'Upgrade',
220+
'Sec-WebSocket-Accept' => $key,
221+
'Sec-WebSocket-Version' => '13',
222+
];
223+
if (isset($my_headers)) {
224+
$headers = array_merge($headers, $my_headers);
199225
}
200-
}
201-
// 手动实现握手
202-
// websocket握手连接算法验证
203-
$sec_websocket_key = $request->header['sec-websocket-key'];
204-
$patten = '#^[+/0-9A-Za-z]{21}[AQgw]==$#';
205-
if (preg_match($patten, $sec_websocket_key) === 0 || strlen(base64_decode($sec_websocket_key)) !== 16) {
226+
foreach ($headers as $key => $val) {
227+
$response->header($key, $val);
228+
}
229+
230+
$response->status(101);
206231
$response->end();
232+
return true;
233+
} catch (\Throwable $e) {
234+
ExceptionHandler::getInstance()->handle($e);
207235
return false;
208236
}
209-
echo $request->header['sec-websocket-key'];
210-
$key = base64_encode(
211-
sha1(
212-
$request->header['sec-websocket-key'] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
213-
true
214-
)
215-
);
216-
$headers = [
217-
'Upgrade' => 'websocket',
218-
'Connection' => 'Upgrade',
219-
'Sec-WebSocket-Accept' => $key,
220-
'Sec-WebSocket-Version' => '13',
221-
];
222-
if (isset($my_headers)) {
223-
$headers = array_merge($headers, $my_headers);
224-
}
225-
foreach ($headers as $key => $val) {
226-
$response->header($key, $val);
227-
}
228-
229-
$response->status(101);
230-
$response->end();
231-
return true;
232237
}
233238

234239
/**
235240
* Swoole 的顶层 message 事件回调(WebSocket 消息事件)
236241
*/
237242
public function onMessage(array $config, ?SwooleWebSocketServer $server, Frame $frame)
238243
{
239-
ob_logger()->debug('WebSocket message from: ' . $frame->fd);
240-
$new_frame = new \Choir\WebSocket\Frame($frame->data, $frame->opcode, true, true);
241-
$event = new WebSocketMessageEvent($frame->fd, $new_frame, function (int $fd, $data) use ($server) {
242-
if ($data instanceof FrameInterface) {
243-
return $server->push($fd, $data->getData(), $data->getOpcode());
244-
}
245-
return $server->push($fd, $data);
246-
});
247-
$event->setOriginFrame($frame);
248-
$event->setSocketConfig($config);
249-
ob_event_dispatcher()->dispatchWithHandler($event);
244+
try {
245+
ob_logger()->debug('WebSocket message from: ' . $frame->fd);
246+
$new_frame = new \Choir\WebSocket\Frame($frame->data, $frame->opcode, true, true);
247+
$event = new WebSocketMessageEvent($frame->fd, $new_frame, function (int $fd, $data) use ($server) {
248+
if ($data instanceof FrameInterface) {
249+
return $server->push($fd, $data->getData(), $data->getOpcode());
250+
}
251+
return $server->push($fd, $data);
252+
});
253+
$event->setOriginFrame($frame);
254+
$event->setSocketConfig($config);
255+
ob_event_dispatcher()->dispatchWithHandler($event);
256+
} catch (\Throwable $e) {
257+
ExceptionHandler::getInstance()->handle($e);
258+
}
250259
}
251260
}

0 commit comments

Comments
 (0)