1616use Pusher \Pusher ;
1717use Ratchet \ConnectionInterface ;
1818use Ratchet \Http \HttpServerInterface ;
19+ use React \Promise \PromiseInterface ;
1920use Symfony \Bridge \PsrHttpMessage \Factory \HttpFoundationFactory ;
2021use Symfony \Component \HttpKernel \Exception \HttpException ;
2122
@@ -30,7 +31,7 @@ abstract class Controller implements HttpServerInterface
3031 /** @var int */
3132 protected $ contentLength ;
3233
33- /** @var \BeyondCode\LaravelWebSockets\WebSockets\Channels\ ChannelManager */
34+ /** @var ChannelManager */
3435 protected $ channelManager ;
3536
3637 public function __construct (ChannelManager $ channelManager )
@@ -46,7 +47,11 @@ public function onOpen(ConnectionInterface $connection, RequestInterface $reques
4647
4748 $ this ->requestBuffer = (string ) $ request ->getBody ();
4849
49- $ this ->checkContentLength ($ connection );
50+ if (! $ this ->verifyContentLength ()) {
51+ return ;
52+ }
53+
54+ $ this ->handleRequest ($ connection );
5055 }
5156
5257 protected function findContentLength (array $ headers ): int
@@ -60,31 +65,53 @@ public function onMessage(ConnectionInterface $from, $msg)
6065 {
6166 $ this ->requestBuffer .= $ msg ;
6267
63- $ this ->checkContentLength ($ from );
68+ if (! $ this ->verifyContentLength ()) {
69+ return ;
70+ }
71+
72+ $ this ->handleRequest ($ from );
73+ }
74+
75+ protected function verifyContentLength ()
76+ {
77+ return strlen ($ this ->requestBuffer ) === $ this ->contentLength ;
6478 }
6579
66- protected function checkContentLength (ConnectionInterface $ connection )
80+ protected function handleRequest (ConnectionInterface $ connection )
6781 {
68- if (strlen ($ this ->requestBuffer ) === $ this ->contentLength ) {
69- $ serverRequest = (new ServerRequest (
70- $ this ->request ->getMethod (),
71- $ this ->request ->getUri (),
72- $ this ->request ->getHeaders (),
73- $ this ->requestBuffer ,
74- $ this ->request ->getProtocolVersion ()
75- ))->withQueryParams (QueryParameters::create ($ this ->request )->all ());
82+ $ serverRequest = (new ServerRequest (
83+ $ this ->request ->getMethod (),
84+ $ this ->request ->getUri (),
85+ $ this ->request ->getHeaders (),
86+ $ this ->requestBuffer ,
87+ $ this ->request ->getProtocolVersion ()
88+ ))->withQueryParams (QueryParameters::create ($ this ->request )->all ());
89+
90+ $ laravelRequest = Request::createFromBase ((new HttpFoundationFactory )->createRequest ($ serverRequest ));
7691
77- $ laravelRequest = Request::createFromBase ((new HttpFoundationFactory )->createRequest ($ serverRequest ));
92+ $ this
93+ ->ensureValidAppId ($ laravelRequest ->appId )
94+ ->ensureValidSignature ($ laravelRequest );
7895
79- $ this
80- ->ensureValidAppId ($ laravelRequest ->appId )
81- ->ensureValidSignature ($ laravelRequest );
96+ // Invoke the controller action
97+ $ response = $ this ($ laravelRequest );
8298
83- $ response = $ this ($ laravelRequest );
99+ // Allow for async IO in the controller action
100+ if ($ response instanceof PromiseInterface) {
101+ $ response ->then (function ($ response ) use ($ connection ) {
102+ $ this ->sendAndClose ($ connection , $ response );
103+ });
84104
85- $ connection ->send (JsonResponse::create ($ response ));
86- $ connection ->close ();
105+ return ;
87106 }
107+
108+ $ this ->sendAndClose ($ connection , $ response );
109+ }
110+
111+ protected function sendAndClose (ConnectionInterface $ connection , $ response )
112+ {
113+ $ connection ->send (JsonResponse::create ($ response ));
114+ $ connection ->close ();
88115 }
89116
90117 public function onClose (ConnectionInterface $ connection )
@@ -122,7 +149,7 @@ protected function ensureValidSignature(Request $request)
122149 /*
123150 * The `auth_signature` & `body_md5` parameters are not included when calculating the `auth_signature` value.
124151 *
125- * The `appId`, `appKey` & `channelName` parameters are actually route paramaters and are never supplied by the client.
152+ * The `appId`, `appKey` & `channelName` parameters are actually route parameters and are never supplied by the client.
126153 */
127154 $ params = Arr::except ($ request ->query (), ['auth_signature ' , 'body_md5 ' , 'appId ' , 'appKey ' , 'channelName ' ]);
128155
0 commit comments