4
4
5
5
use Evenement \EventEmitter ;
6
6
use Psr \Http \Message \ServerRequestInterface ;
7
+ use React \EventLoop \LoopInterface ;
7
8
use React \Http \Message \Response ;
8
9
use React \Http \Message \ServerRequest ;
9
10
use React \Socket \ConnectionInterface ;
@@ -24,12 +25,44 @@ class RequestHeaderParser extends EventEmitter
24
25
{
25
26
private $ maxSize = 8192 ;
26
27
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
+
27
48
public function handle (ConnectionInterface $ conn )
28
49
{
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
+ });
29
58
$ buffer = '' ;
30
59
$ maxSize = $ this ->maxSize ;
31
60
$ 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
+ });
33
66
// append chunk of data to buffer and look for end of request headers
34
67
$ buffer .= $ data ;
35
68
$ endOfHeader = \strpos ($ buffer , "\r\n\r\n" );
@@ -43,6 +76,7 @@ public function handle(ConnectionInterface $conn)
43
76
new \OverflowException ("Maximum header size of {$ maxSize } exceeded. " , Response::STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE ),
44
77
$ conn
45
78
));
79
+ $ loop ->cancelTimer ($ timer );
46
80
return ;
47
81
}
48
82
@@ -67,6 +101,7 @@ public function handle(ConnectionInterface $conn)
67
101
$ exception ,
68
102
$ conn
69
103
));
104
+ $ loop ->cancelTimer ($ timer );
70
105
return ;
71
106
}
72
107
@@ -105,6 +140,7 @@ public function handle(ConnectionInterface $conn)
105
140
if ($ contentLength === 0 ) {
106
141
$ stream ->emit ('end ' );
107
142
$ stream ->close ();
143
+ $ loop ->cancelTimer ($ timer );
108
144
}
109
145
});
110
146
}
0 commit comments