*/
class Action extends Observer
{
- private function serveReference(\http\Controller $ctl) {
- $payload = $ctl->getPayload();
+ private function serveReference(\http\Url $url, \http\Controller\Payload $payload) {
$finder = new Finder($this->baseUrl, REFS);
- $path = $finder->find(new \http\Url($ctl->getRequest()->getRequestUrl()));
+ $path = $finder->find($url);
$payload->listing = new RefListing($path,
$finder->glob($path, "/[_a-zA-Z]*.md"));
$payload->title = $payload->listing->getSelf()->formatLink();
}
}
- private function serveInternal(\http\Controller $ctl) {
- $payload = $ctl->getPayload();
+ private function serveInternal(\http\Url $url, \http\Controller\Payload $payload) {
$finder = new Finder($this->baseUrl, ROOT);
- $url = new \http\Url($ctl->getRequest()->getRequestUrl());
$path = $finder->find($url, "");
if ($path->isFile("")) {
$payload->html = $path->toHtml();
- } else if (strcmp($url->path, $this->baseUrl->path)) {
- throw new \http\Controller\Exception(404, "Could not find '$path'");
+ return true;
+ }
+ }
+
+ private function getType($file) {
+ static $inf = null;
+ static $typ = array(".css" => "text/css", ".js" => "applicatin/javascript");
+
+ $ext = strrchr($file, ".");
+ if (isset($typ[$ext])) {
+ return $typ[$ext];
+ }
+
+ if (!$inf) {
+ $inf = new \FINFO(FILEINFO_MIME_TYPE);
+ }
+ return $inf->file($file);
+ }
+
+ private function servePublic(\http\Url $url, \http\Env\Response $res) {
+ $finder = new Finder($this->baseUrl, ROOT."/public");
+ $path = $finder->find($url, "");
+ if ($path->isFile("")) {
+ $res->setHeader("Content-Type", $this->getType($path->getFullPath("")));
+ $res->setBody(new \http\Message\Body(fopen($path->getFullPath(""),"r")));
+ return true;
}
}
function update(\SplSubject $ctl) {
/* @var \http\Controller $ctl */
try {
- $ctl->getPayload()->baseUrl = $this->baseUrl;
-
- if (!$this->serveReference($ctl)) {
- $this->serveInternal($ctl);
+ $pld = $ctl->getPayload();
+ $pld->baseUrl = $this->baseUrl;
+ $url = $this->baseUrl->mod($ctl->getRequest()->getRequestUrl());
+
+ if ($this->serveReference($url, $pld) || $this->serveInternal($url, $pld)) {
+ return;
+ } elseif ($this->servePublic($url, $ctl->getResponse())) {
+ $ctl->detachAll("\\http\\Controller\\Observer\\View");
+ return;
+ }
+
+ /* fallthrough */
+ if (strcmp($url->path, $this->baseUrl->path)) {
+ throw new \http\Controller\Exception(404, "Could not find '$url'");
}
} catch (\Exception $e) {
$ctl->getPayload()->exception = $e;