cli server fixes
authorMichael Wallner <mike@php.net>
Fri, 20 Dec 2013 15:19:03 +0000 (16:19 +0100)
committerMichael Wallner <mike@php.net>
Fri, 20 Dec 2013 15:19:03 +0000 (16:19 +0100)
mdref/Action.php

index 18f60691b21b0d96a1176f43ac760509355b4c70..5737cfeba629a4ebff203efa560b660cdf83994b 100644 (file)
@@ -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;