44
55use Evenement \EventEmitter ;
66use Psr \Http \Message \ServerRequestInterface ;
7+ use React \EventLoop \LoopInterface ;
78use React \Http \Message \Response ;
89use React \Http \Message \ServerRequest ;
910use React \Socket \ConnectionInterface ;
@@ -24,12 +25,51 @@ class RequestHeaderParser extends EventEmitter
2425{
2526 private $ maxSize = 8192 ;
2627
27- public function handle (ConnectionInterface $ conn )
28+ /**
29+ * @var LoopInterface
30+ */
31+ private $ loop ;
32+
33+ /**
34+ * @var float
35+ */
36+ private $ idleConnectionTimeout ;
37+
38+ /**
39+ * @param LoopInterface $loop
40+ * @param float $idleConnectionTimeout
41+ */
42+ public function __construct (LoopInterface $ loop , $ idleConnectionTimeout )
2843 {
44+ $ this ->loop = $ loop ;
45+ $ this ->idleConnectionTimeout = $ idleConnectionTimeout ;
46+ }
47+
48+ /**
49+ * @param bool $firstRequest
50+ */
51+ public function handle (ConnectionInterface $ conn , $ firstRequest = true )
52+ {
53+ $ loop = $ this ->loop ;
54+ $ idleConnectionTimeout = $ this ->idleConnectionTimeout ;
55+ $ createTimer = function () use ($ conn , $ loop , $ idleConnectionTimeout , $ firstRequest ) {
56+ return $ loop ->addTimer ($ idleConnectionTimeout , function () use ($ conn , $ firstRequest ) {
57+ if ($ firstRequest ) {
58+ $ conn ->write ("HTTP/1.0 " . Response::STATUS_REQUEST_TIMEOUT . " Request Timed Out \r\n" );
59+ }
60+ $ conn ->close ();
61+ });
62+ };
63+ $ timer = $ createTimer ();
64+ $ conn ->on ('close ' , function () use ($ loop , $ timer ) {
65+ $ loop ->cancelTimer ($ timer );
66+ });
2967 $ buffer = '' ;
3068 $ maxSize = $ this ->maxSize ;
3169 $ that = $ this ;
32- $ conn ->on ('data ' , $ fn = function ($ data ) use (&$ buffer , &$ fn , $ conn , $ maxSize , $ that ) {
70+ $ conn ->on ('data ' , $ fn = function ($ data ) use (&$ buffer , &$ fn , $ conn , $ maxSize , $ that , $ loop , &$ timer , $ createTimer ) {
71+ $ loop ->cancelTimer ($ timer );
72+ $ timer = $ createTimer ();
3373 // append chunk of data to buffer and look for end of request headers
3474 $ buffer .= $ data ;
3575 $ endOfHeader = \strpos ($ buffer , "\r\n\r\n" );
@@ -43,6 +83,7 @@ public function handle(ConnectionInterface $conn)
4383 new \OverflowException ("Maximum header size of {$ maxSize } exceeded. " , Response::STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE ),
4484 $ conn
4585 ));
86+ $ loop ->cancelTimer ($ timer );
4687 return ;
4788 }
4889
@@ -67,6 +108,7 @@ public function handle(ConnectionInterface $conn)
67108 $ exception ,
68109 $ conn
69110 ));
111+ $ loop ->cancelTimer ($ timer );
70112 return ;
71113 }
72114
@@ -105,6 +147,7 @@ public function handle(ConnectionInterface $conn)
105147 if ($ contentLength === 0 ) {
106148 $ stream ->emit ('end ' );
107149 $ stream ->close ();
150+ $ loop ->cancelTimer ($ timer );
108151 }
109152 });
110153 }
0 commit comments