private function respond($fileInfo, Request $request, Response $response)
{
// If the file doesn't exist don't bother to do anything else so the
// HTTP server can send a 404 and/or allow handlers further down the chain
// a chance to respond.
if (empty($fileInfo->exists)) {
return;
}
switch ($request->getMethod()) {
case "GET":
case "HEAD":
break;
case "OPTIONS":
$response->setStatus(HTTP_STATUS["OK"]);
$response->setHeader("Allow", "GET, HEAD, OPTIONS");
$response->setHeader("Accept-Ranges", "bytes");
$response->setHeader("Aerys-Generic-Response", "enable");
return;
default:
$response->setStatus(HTTP_STATUS["METHOD_NOT_ALLOWED"]);
$response->setHeader("Allow", "GET, HEAD, OPTIONS");
$response->setHeader("Aerys-Generic-Response", "enable");
return;
}
$precondition = $this->checkPreconditions($request, $fileInfo->mtime, $fileInfo->etag);
switch ($precondition) {
case self::PRECOND_NOT_MODIFIED:
$response->setStatus(HTTP_STATUS["NOT_MODIFIED"]);
$lastModifiedHttpDate = \gmdate('D, d M Y H:i:s', $fileInfo->mtime) . " GMT";
$response->setHeader("Last-Modified", $lastModifiedHttpDate);
if ($fileInfo->etag) {
$response->setHeader("Etag", $fileInfo->etag);
}
$response->end();
return;
case self::PRECOND_FAILED:
$response->setStatus(HTTP_STATUS["PRECONDITION_FAILED"]);
$response->end();
return;
case self::PRECOND_IF_RANGE_FAILED:
// Return this so the resulting generator will be auto-resolved
return $this->doNonRangeResponse($fileInfo, $response);
}
if (!($rangeHeader = $request->getHeader("Range"))) {
// Return this so the resulting generator will be auto-resolved
return $this->doNonRangeResponse($fileInfo, $response);
}
if ($range = $this->normalizeByteRanges($fileInfo->size, $rangeHeader)) {
// Return this so the resulting generator will be auto-resolved
return $this->doRangeResponse($range, $fileInfo, $response);
}
// If we're still here this is the only remaining response we can send
$response->setStatus(HTTP_STATUS["REQUESTED_RANGE_NOT_SATISFIABLE"]);
$response->setHeader("Content-Range", "*/{$fileInfo->size}");
$response->end();
}