@@ -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