diff --git a/src/RequestHeaderParser.php b/src/RequestHeaderParser.php index 39bc127a..26f652ae 100644 --- a/src/RequestHeaderParser.php +++ b/src/RequestHeaderParser.php @@ -26,9 +26,8 @@ public function feed($data) if (false !== strpos($this->buffer, "\r\n\r\n")) { list($request, $bodyBuffer) = $this->parseRequest($this->buffer); - + $this->buffer = ''; $this->emit('headers', array($request, $bodyBuffer)); - $this->removeAllListeners(); } } diff --git a/src/Response.php b/src/Response.php index 13b22211..1d954952 100644 --- a/src/Response.php +++ b/src/Response.php @@ -107,7 +107,7 @@ public function write($data) return $flushed; } - public function end($data = null) + public function end($data = null, $keepAlive = false) { if (null !== $data) { $this->write($data); @@ -117,9 +117,12 @@ public function end($data = null) $this->conn->write("0\r\n\r\n"); } - $this->emit('end'); + $this->emit('end', array($keepAlive)); $this->removeAllListeners(); - $this->conn->end(); + + if (!$keepAlive) { + $this->conn->end(); + } } public function close() diff --git a/src/Server.php b/src/Server.php index 4bf6cc28..77a51bfd 100644 --- a/src/Server.php +++ b/src/Server.php @@ -16,7 +16,6 @@ public function __construct(SocketServerInterface $io) $this->io = $io; $this->io->on('connection', function ($conn) { - // TODO: http 1.1 keep-alive // TODO: chunked transfer encoding (also for outgoing data) // TODO: multipart parsing @@ -25,8 +24,6 @@ public function __construct(SocketServerInterface $io) // attach remote ip to the request as metadata $request->remoteAddress = $conn->getRemoteAddress(); - $this->handleRequest($conn, $request, $bodyBuffer); - $conn->removeListener('data', array($parser, 'feed')); $conn->on('end', function () use ($request) { $request->emit('end'); @@ -40,13 +37,18 @@ public function __construct(SocketServerInterface $io) $request->on('resume', function () use ($conn) { $conn->emit('resume'); }); + + $this->handleRequest($conn, $parser, $request, $bodyBuffer); }); $conn->on('data', array($parser, 'feed')); + $conn->on('end', function () use ($parser) { + $parser->removeAllListeners(); + }); }); } - public function handleRequest(ConnectionInterface $conn, Request $request, $bodyBuffer) + public function handleRequest(ConnectionInterface $conn, RequestHeaderParser $parser, Request $request, $bodyBuffer) { $response = new Response($conn); $response->on('close', array($request, 'close')); @@ -57,6 +59,19 @@ public function handleRequest(ConnectionInterface $conn, Request $request, $body return; } + $response->on('end', function ($keepAlive) use ($conn, $parser) { + $conn->removeAllListeners(); // stop data being sent to this Request instance + if ($keepAlive) { + $conn->on('data', array($parser, 'feed')); // resume sending data to RequestHeaderParser + $conn->on('end', function () use ($parser) { + $parser->removeAllListeners(); + }); + } + else { + $parser->removeAllListeners(); + } + }); + $this->emit('request', array($request, $response)); $request->emit('data', array($bodyBuffer)); }