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