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,45 @@ class RequestHeaderParser extends EventEmitter
2425{
2526 private $ maxSize = 8192 ;
2627
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 )
43+ {
44+ $ this ->loop = $ loop ;
45+ $ this ->idleConnectionTimeout = $ idleConnectionTimeout ;
46+ }
47+
2748 public function handle (ConnectionInterface $ conn )
2849 {
50+ $ loop = $ this ->loop ;
51+ $ idleConnectionTimeout = $ this ->idleConnectionTimeout ;
52+ $ createTimer = function () use ($ conn , $ loop , $ idleConnectionTimeout ) {
53+ return $ loop ->addTimer ($ idleConnectionTimeout , function () use ($ conn ) {
54+ $ conn ->close ();
55+ });
56+ };
57+ $ timer = $ createTimer ();
58+ $ conn ->on ('close ' , function () use ($ loop , $ timer ) {
59+ $ loop ->cancelTimer ($ timer );
60+ });
2961 $ buffer = '' ;
3062 $ maxSize = $ this ->maxSize ;
3163 $ that = $ this ;
32- $ conn ->on ('data ' , $ fn = function ($ data ) use (&$ buffer , &$ fn , $ conn , $ maxSize , $ that ) {
64+ $ conn ->on ('data ' , $ fn = function ($ data ) use (&$ buffer , &$ fn , $ conn , $ maxSize , $ that , $ loop , &$ timer , $ createTimer ) {
65+ $ loop ->cancelTimer ($ timer );
66+ $ timer = $ createTimer ();
3367 // append chunk of data to buffer and look for end of request headers
3468 $ buffer .= $ data ;
3569 $ endOfHeader = \strpos ($ buffer , "\r\n\r\n" );
@@ -43,6 +77,7 @@ public function handle(ConnectionInterface $conn)
4377 new \OverflowException ("Maximum header size of {$ maxSize } exceeded. " , Response::STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE ),
4478 $ conn
4579 ));
80+ $ loop ->cancelTimer ($ timer );
4681 return ;
4782 }
4883
@@ -67,6 +102,7 @@ public function handle(ConnectionInterface $conn)
67102 $ exception ,
68103 $ conn
69104 ));
105+ $ loop ->cancelTimer ($ timer );
70106 return ;
71107 }
72108
@@ -105,6 +141,7 @@ public function handle(ConnectionInterface $conn)
105141 if ($ contentLength === 0 ) {
106142 $ stream ->emit ('end ' );
107143 $ stream ->close ();
144+ $ loop ->cancelTimer ($ timer );
108145 }
109146 });
110147 }
0 commit comments