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,44 @@ 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+ $ timer = $ loop ->addTimer ($ idleConnectionTimeout , function () use ($ conn ) {
53+ $ conn ->close ();
54+ });
55+ $ conn ->on ('close ' , function () use ($ loop , $ timer ) {
56+ $ loop ->cancelTimer ($ timer );
57+ });
2958 $ buffer = '' ;
3059 $ maxSize = $ this ->maxSize ;
3160 $ that = $ this ;
32- $ conn ->on ('data ' , $ fn = function ($ data ) use (&$ buffer , &$ fn , $ conn , $ maxSize , $ that ) {
61+ $ conn ->on ('data ' , $ fn = function ($ data ) use (&$ buffer , &$ fn , $ conn , $ maxSize , $ that , $ loop , &$ timer , $ idleConnectionTimeout ) {
62+ $ loop ->cancelTimer ($ timer );
63+ $ timer = $ loop ->addTimer ($ idleConnectionTimeout , function () use ($ conn ) {
64+ $ conn ->end ("HTTP/1.1 " . Response::STATUS_REQUEST_TIMEOUT . " Request Timed Out \r\n" );
65+ });
3366 // append chunk of data to buffer and look for end of request headers
3467 $ buffer .= $ data ;
3568 $ endOfHeader = \strpos ($ buffer , "\r\n\r\n" );
@@ -43,6 +76,7 @@ public function handle(ConnectionInterface $conn)
4376 new \OverflowException ("Maximum header size of {$ maxSize } exceeded. " , Response::STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE ),
4477 $ conn
4578 ));
79+ $ loop ->cancelTimer ($ timer );
4680 return ;
4781 }
4882
@@ -52,6 +86,7 @@ public function handle(ConnectionInterface $conn)
5286 }
5387
5488 // request headers received => try to parse request
89+ $ loop ->cancelTimer ($ timer );
5590 $ conn ->removeListener ('data ' , $ fn );
5691 $ fn = null ;
5792
0 commit comments