From: Michael Wallner Date: Fri, 20 Dec 2013 15:19:03 +0000 (+0100) Subject: cli server fixes X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=88eccca8a8f42b9432dd35ad78d7b3fa999b21b1;p=mdref%2Fmdref cli server fixes --- diff --git a/mdref/Action.php b/mdref/Action.php index 18f6069..5737cfe 100644 --- a/mdref/Action.php +++ b/mdref/Action.php @@ -9,10 +9,9 @@ use http\Controller\Observer; */ 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(); @@ -25,15 +24,37 @@ class Action extends Observer } } - 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; } } @@ -44,10 +65,20 @@ class Action extends Observer 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;