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,23 +25,53 @@ class RequestHeaderParser extends EventEmitter
2425{
2526 private $ maxSize = 8192 ;
2627
28+ /**
29+ * @var LoopInterface
30+ */
31+ private $ loop ;
32+
2733 /** @var Clock */
2834 private $ clock ;
2935
36+ /**
37+ * @var float
38+ */
39+ private $ idleConnectionTimeout ;
40+
3041 /** @var array<string|int,array<string,string>> */
3142 private $ connectionParams = array ();
3243
33- public function __construct (Clock $ clock )
44+ /**
45+ * @param LoopInterface $loop
46+ * @param float $idleConnectionTimeout
47+ */
48+ public function __construct (LoopInterface $ loop , Clock $ clock , $ idleConnectionTimeout )
3449 {
50+ $ this ->loop = $ loop ;
3551 $ this ->clock = $ clock ;
52+ $ this ->idleConnectionTimeout = $ idleConnectionTimeout ;
3653 }
3754
3855 public function handle (ConnectionInterface $ conn )
3956 {
57+ $ loop = $ this ->loop ;
58+ $ idleConnectionTimeout = $ this ->idleConnectionTimeout ;
59+ $ that = $ this ;
60+ $ idleConnectionTimeoutHandler = function () use ($ that , $ conn ) {
61+ $ that ->emit ('error ' , array (
62+ new \RuntimeException ('Request timed out ' , Response::STATUS_REQUEST_TIMEOUT ),
63+ $ conn
64+ ));
65+ $ conn ->close ();
66+ };
67+ $ timer = $ loop ->addTimer ($ idleConnectionTimeout , $ idleConnectionTimeoutHandler );
68+ $ conn ->on ('close ' , function () use ($ loop , &$ timer ) {
69+ $ loop ->cancelTimer ($ timer );
70+ });
4071 $ buffer = '' ;
4172 $ maxSize = $ this ->maxSize ;
42- $ that = $ this ;
43- $ conn -> on ( ' data ' , $ fn = function ( $ data ) use (& $ buffer , & $ fn , $ conn , $ maxSize , $ that ) {
73+ $ conn -> on ( ' data ' , $ fn = function ( $ data ) use (& $ buffer , & $ fn , $ conn , $ maxSize , $ that , $ loop , & $ timer , $ idleConnectionTimeout , $ idleConnectionTimeoutHandler ) {
74+ $ loop -> cancelTimer ( $ timer );
4475 // append chunk of data to buffer and look for end of request headers
4576 $ buffer .= $ data ;
4677 $ endOfHeader = \strpos ($ buffer , "\r\n\r\n" );
@@ -59,6 +90,7 @@ public function handle(ConnectionInterface $conn)
5990
6091 // ignore incomplete requests
6192 if ($ endOfHeader === false ) {
93+ $ timer = $ loop ->addTimer ($ idleConnectionTimeout , $ idleConnectionTimeoutHandler );
6294 return ;
6395 }
6496
0 commit comments