/**
* @param ConnectionInterface $conn
*/
public function onConnection(ConnectionInterface $conn)
{
$labels = ['remote' => $conn->getRemoteAddress(), 'request_id' => Uuid::uuid4()->toString()];
$request = new HttpdRequest($conn->getRemoteAddress(), $labels);
$response = new HttpdResponse($conn, $labels);
// Wire request and response event to global observer
$request->subscribe($this->observable);
$response->subscribe($this->observable);
// Remote connection closed, notify everything's done
$conn->on("end", [$request, 'notifyCompleted']);
$conn->on("end", function () use($response, $labels) {
$response->notifyNext(new Event("/httpd/connection/closed", $response, $labels));
$response->notifyCompleted();
});
// No observers we can't do anything
if (!$this->observers) {
$response->sendError("No route defined", 404);
return;
}
$parser = new RequestParser($request);
$conn->on('data', array($parser, 'parse'));
// Head is received we can dispatch route
$request->take(1)->subscribeCallback(function () use($request, $response, $labels) {
$this->dispatch($request, $response, $labels);
});
}