9
9
use Ratchet \ConnectionInterface ;
10
10
use Illuminate \Http \JsonResponse ;
11
11
use GuzzleHttp \Psr7 \ServerRequest ;
12
+ use Illuminate \Support \Collection ;
12
13
use Ratchet \Http \HttpServerInterface ;
13
14
use Psr \Http \Message \RequestInterface ;
14
15
use BeyondCode \LaravelWebSockets \Apps \App ;
19
20
20
21
abstract class Controller implements HttpServerInterface
21
22
{
23
+ /** @var string */
24
+ protected $ requestBuffer = '' ;
25
+
26
+ /** @var RequestInterface */
27
+ protected $ request ;
28
+
29
+ /** @var int */
30
+ protected $ contentLength ;
31
+
22
32
/** @var \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager */
23
33
protected $ channelManager ;
24
34
@@ -29,28 +39,51 @@ public function __construct(ChannelManager $channelManager)
29
39
30
40
public function onOpen (ConnectionInterface $ connection , RequestInterface $ request = null )
31
41
{
32
- $ serverRequest = (new ServerRequest (
33
- $ request ->getMethod (),
34
- $ request ->getUri (),
35
- $ request ->getHeaders (),
36
- $ request ->getBody (),
37
- $ request ->getProtocolVersion ()
38
- ))->withQueryParams (QueryParameters::create ($ request )->all ());
42
+ $ this ->request = $ request ;
39
43
40
- $ laravelRequest = Request:: createFromBase (( new HttpFoundationFactory )-> createRequest ( $ serverRequest ));
44
+ $ this -> contentLength = $ this -> findContentLength ( $ request -> getHeaders ( ));
41
45
42
- $ this
43
- ->ensureValidAppId ($ laravelRequest ->appId )
44
- ->ensureValidSignature ($ laravelRequest );
46
+ $ this ->requestBuffer = (string )$ request ->getBody ();
45
47
46
- $ response = $ this ($ laravelRequest );
48
+ $ this ->checkContentLength ($ connection );
49
+ }
47
50
48
- $ connection ->send (JsonResponse::create ($ response ));
49
- $ connection ->close ();
51
+ protected function findContentLength (array $ headers ): int
52
+ {
53
+ return Collection::make ($ headers )->first (function ($ values , $ header ) {
54
+ return strtolower ($ header ) === 'content-length ' ;
55
+ });
50
56
}
51
57
52
58
public function onMessage (ConnectionInterface $ from , $ msg )
53
59
{
60
+ $ this ->requestBuffer .= $ msg ;
61
+
62
+ $ this ->checkContentLength ();
63
+ }
64
+
65
+ protected function checkContentLength (ConnectionInterface $ connection )
66
+ {
67
+ if (strlen ($ this ->requestBuffer ) === $ this ->contentLength ) {
68
+ $ serverRequest = (new ServerRequest (
69
+ $ this ->request ->getMethod (),
70
+ $ this ->request ->getUri (),
71
+ $ this ->request ->getHeaders (),
72
+ $ this ->requestBuffer ,
73
+ $ this ->request ->getProtocolVersion ()
74
+ ))->withQueryParams (QueryParameters::create ($ this ->request )->all ());
75
+
76
+ $ laravelRequest = Request::createFromBase ((new HttpFoundationFactory )->createRequest ($ serverRequest ));
77
+
78
+ $ this
79
+ ->ensureValidAppId ($ laravelRequest ->appId )
80
+ ->ensureValidSignature ($ laravelRequest );
81
+
82
+ $ response = $ this ($ laravelRequest );
83
+
84
+ $ connection ->send (JsonResponse::create ($ response ));
85
+ $ connection ->close ();
86
+ }
54
87
}
55
88
56
89
public function onClose (ConnectionInterface $ connection )
0 commit comments