Bladeren bron

dev 2020-10

Max F 5 jaren geleden
bovenliggende
commit
580c62ffe3

+ 9 - 6
src/App.php

@@ -9,7 +9,6 @@ use \KarmaFW\Database\Sql\SqlDb;
 
 use \KarmaFW\App\Request;
 use \KarmaFW\App\Response;
-use \KarmaFW\App\ResponseError;
 use \KarmaFW\App\Pipe;
 use \KarmaFW\App\Container;
 
@@ -105,22 +104,26 @@ class App
 	public function handle($request)
 	{
 		try {
-			$response = new Response;
+			$response = new Response(200, [], null);
 			$pipe = new Pipe($this->middlewares);
 
 			$response = $pipe->next($request, $response);
 
 		} catch (\Exception $e) {
-            $content = null;
+            $error_code = $e->getCode();
+            $error_message = $e->getMessage();
+
+            error_log("[App] Error " . $error_code . " : " . $error_message);
 
+            $content = null;
             if (ENV == 'dev') {
-                $title = "App CATCHED EXCEPTION";
+                $title = "App CATCHED EXCEPTION CODE " . $error_code;
                 $message = '<pre>' . print_r($e, true) . '</pre>';
-                $content = '<title>' . $title . '</title><h1>' . $title . '</h1><p>' . $message . '</p>';
+                $content = '<title>' . $title . '</title><h1>' . $title . '</h1><h2>' . $error_message . '</h2><p>' . $message . '</p>';
             }
 
             //throw $e;
-            return new ResponseError(500, $content); 
+            $response->setStatus(500)->setHtml($content);
 		}
 
 		return $response;

+ 16 - 8
src/App/Middlewares/ErrorHandler.php

@@ -4,8 +4,6 @@ namespace KarmaFW\App\Middlewares;
 
 use \KarmaFW\App\Request;
 use \KarmaFW\App\Response;
-use \KarmaFW\App\ResponseError;
-use \KarmaFW\App\ResponseError404;
 
 
 class ErrorHandler
@@ -36,24 +34,34 @@ class ErrorHandler
             $response = $next($request, $response);
 
         } catch (\Throwable $e) {
-            $code = $e->getCode();
+            $error_code = $e->getCode();
             $error_message = $e->getMessage();
 
+
+            $is_response = is_a($e, Response::class);
+            if ($is_response) {
+                // exception is in reality a Response
+                return $e;
+            }
+
             /*
-            if ($code == 404) {
-                return new ResponseError404($error_message);
+            if ($error_code == 404) {
+                // case moved to UrlRouter
+                $response->setStatus(404)->setHtml($error_message);
             }
             */
 
             if (! $this->use_internal_handler) {
                 throw $e;
             }
+
+            $http_code = (500 <= $error_code && $error_code <= 599) ? $error_code : 500;
             
-            error_log("[UrlRouter] Error 500 : " . $error_message);
+            error_log("[UrlRouter] Error " . $error_code . " : " . $error_message);
 
 
             if (ENV == 'dev') {
-                $title = "ErrorHandler CATCHED EXCEPTION";
+                $title = "ErrorHandler CATCHED EXCEPTION CODE " . $error_code;
                 $message = '<pre>' . print_r($e, true) . '</pre>';
                 $response_content = '<title>' . $title . '</title><h1>' . $title . '</h1><h2>' . $error_message . '</h2><p>' . $message . '</p>';
 
@@ -63,7 +71,7 @@ class ErrorHandler
                 $response_content = '<title>' . $title . '</title><h1>' . $title . '</h1><p>' . $message . '</p>';
             }
 
-            return new ResponseError(500, $response_content);
+            $response->setStatus($http_code)->setHtml($response_content);
         }
 
         return $response;

+ 9 - 0
src/App/Middlewares/GzipEncoding.php

@@ -13,6 +13,15 @@ class GzipEncoding
 	{
 		$response = $next($request, $response);
 
+
+        $content_type = $response->getContentType();
+        $content_type_short = explode(';', $content_type)[0];
+
+        if ($content_type_short !== 'text/html') {
+            return $response;
+        }
+
+
 		$content = (string) gzencode($response->getBody());
 
 		if (strlen($content) > 1000) {

+ 1 - 0
src/App/Middlewares/MinimifierHtml.php

@@ -28,6 +28,7 @@ class MinimifierHtml
         
         $content_type = $response->getContentType();
         $content_type_short = explode(';', $content_type)[0];
+//pre($response->getContentType(), 1, 'content_type:');
 
         if ($content_type_short !== 'text/html') {
             return $response;

+ 7 - 0
src/App/Middlewares/UrlPrefixRouter.php

@@ -9,8 +9,15 @@ use \KarmaFW\App\Response;
 class UrlPrefixRouter
 {
 	
+	public function __construct()
+	{
+		// TODO
+	}
+
+
 	public function __invoke(Request $request, Response $response, callable $next)
 	{
+		// TODO
 
 		return $next($request, $response);
 	}

+ 10 - 12
src/App/Middlewares/UrlRouter.php

@@ -4,8 +4,6 @@ namespace KarmaFW\App\Middlewares;
 
 use \KarmaFW\App\Request;
 use \KarmaFW\App\Response;
-use \KarmaFW\App\ResponseError;
-use \KarmaFW\App\ResponseError404;
 use \KarmaFW\App\ResponseRedirect;
 use \KarmaFW\App\ResponseFile;
 use \KarmaFW\Routing\Router;
@@ -47,28 +45,28 @@ class UrlRouter
 			$response = $next($request, $response);
 
 		} catch (\Throwable $e) {
-			$code = $e->getCode();
+			$error_code = $e->getCode();
 			$error_message = $e->getMessage();
-			$is_response = is_a($e, Response::class);
 
+			$is_response = is_a($e, Response::class);
 			if ($is_response) {
 				// exception is in reality a Response
 				return $e;
 			}
 
-			if (in_array($code, [301, 302, 310])) {
-				// if $code is a redirection
+			if (in_array($error_code, [301, 302, 310])) {
+				// if $error_code is a redirection
 				$url = $error_message;
-				return new ResponseRedirect($url, $code);
+				return new ResponseRedirect($url, $error_code);
 			}
 
 			// ERROR 404
-			if ($code == 404) {
-				// if $code is a 404 page not found
+			if ($error_code == 404) {
+				// if $error_code is a 404 page not found
 				if (empty($error_message)) {
 					$error_message = '<title>Not Found</title><h1>Not Found</h1>';
 				}
-				return new ResponseError404($error_message);
+				return $response->setStatus(404)->setHtml($error_message);
 			}
 
 
@@ -83,7 +81,7 @@ class UrlRouter
 
 
             if (ENV == 'dev') {
-                $title = "UrlRouter CATCHED EXCEPTION";
+                $title = "UrlRouter CATCHED EXCEPTION CODE " . $error_code;
                 $message = '<pre>' . print_r($e, true) . '</pre>';
                 $response_content = '<title>' . $title . '</title><h1>' . $title . '</h1><h2>' . $error_message . '</h2><p>' . $message . '</p>';
 
@@ -95,7 +93,7 @@ class UrlRouter
 
 
 			// else => error 500
-			return new ResponseError(500, $response_content);
+			$response->setStatus(500)->setHtml($response_content);
 		}
 
 		return $response;

+ 1 - 1
src/App/Pipe.php

@@ -15,7 +15,7 @@ class Pipe
     protected $services = [];
 
 
-    public function __construct($services=[])
+    public function __construct(array $services=[])
     {
         $this->services = $services;
     }

+ 54 - 9
src/App/Response.php

@@ -62,16 +62,14 @@ class Response extends \Exception
 	];
 
 
-	public function __construct($status=200, array $headers=[], $body=null, $version='1.1', $reason=null) // Psr7
+	public function __construct($status=200, array $headers=[], $body=null, $version='1.1', $reason=null)
 	{
 		$this->body = $body;
 		$this->setStatus($status);
-		$this->setheaders($headers);
+		$this->setHeaders($headers);
 
         $this->protocol = $version;
 	}
-	//public ResponseText::__construct($body=null, $content_type='text/plain', $status=200) { return Response($status, ['Content-Type' => $content_type], $body); }
-	//public ResponseHtml::__construct($body=null, $status=200) { return ResponseText($body, 'html', $status); }
 
 
 	public function getStatus()
@@ -79,6 +77,17 @@ class Response extends \Exception
 		return $this->status;
 	}
 
+	public function getProtocol()
+	{
+		return $this->protocol;
+	}
+
+	public function setProtocol($protocol)
+	{
+		$this->protocol = $protocol;
+		return $this;
+	}
+
 	public function getReasonPhrase()
 	{
 		return $this->reasonPhrase;
@@ -90,6 +99,8 @@ class Response extends \Exception
 
 		$reasonPhrase = ! empty(self::http_status_codes[$status]) ? self::http_status_codes[$status] : "Unknown status";
 		$this->reasonPhrase = $reasonPhrase;
+
+		return $this;
 	}
 
 	public function getContentType()
@@ -100,6 +111,7 @@ class Response extends \Exception
 	public function setContentType($content_type)
 	{
 		$this->content_type = $content_type;
+		return $this;
 	}
 
 	public function getTemplatePath()
@@ -110,6 +122,7 @@ class Response extends \Exception
 	public function setTemplatePath($template_path)
 	{
 		$this->template_path = $template_path;
+		return $this;
 	}
 
 	public function getTemplateData()
@@ -120,6 +133,7 @@ class Response extends \Exception
 	public function setTemplateData($template_data)
 	{
 		$this->template_data = $template_data;
+		return $this;
 	}
 
 	public function getContent()
@@ -138,25 +152,49 @@ class Response extends \Exception
 		return strlen($this->body);
 	}
 
+	public function setBody($body)
+	{
+		$this->body = $body;
+		return $this;
+	}
+
 	public function setContent($body)
 	{
 		// DEPRECATED
 		return $this->setBody($body);
 	}
 
-	public function setBody($body)
+	public function setHtml($body, $status=200, $content_type='text/html')
 	{
-		$this->body = $body;
+		return $this->setBody($body)
+				->setContentType($content_type)
+				->setStatus($status);
+	}
+	
+	public function setJson($body, $status=200, $content_type='application/json')
+	{
+		return $this->setBody($body)
+				->setContentType($content_type)
+				->setStatus($status);
+	}
+
+	public function setCsv($body, $status=200, $content_type='text/csv')
+	{
+		return $this->setBody($body)
+				->setContentType($content_type)
+				->setStatus($status);
 	}
 
 	public function append($body)
 	{
 		$this->body .= $body;
+		return $this;
 	}
 
 	public function prepend($body)
 	{
 		$this->body = $body . $this->body;
+		return $this;
 	}
 
 	public function getHeaders()
@@ -164,7 +202,7 @@ class Response extends \Exception
 		return $this->headers;
 	}
 
-	public function setheaders($headers)
+	public function setHeaders($headers)
 	{
 		//return $this->headers = $headers;
 		$this->headers = [];
@@ -179,12 +217,14 @@ class Response extends \Exception
 			}
 			$this->addHeader($k, $v);
 		}
+		return $this;
 	}
 
 	public function addHeader($key, $value)
 	{
 		$key = ucwords(strtolower($key), " -\t\r\n\f\v");
 		$this->headers[$key] = $value;
+		return $this;
 	}
 
 
@@ -205,9 +245,10 @@ class Response extends \Exception
 		}
 
 		if (! empty($this->status)) {
-			$reasonPhrase = empty($this->reasonPhrase) ? "Unknown http status" : $this->reasonPhrase;
-			header('HTTP/1.0 ' . $this->status . ' ' . $reasonPhrase);
+			$reasonPhrase = empty($this->reasonPhrase) ? "Unknown http status" : trim($this->reasonPhrase);
 			$this->headers['X-Status'] = $this->status . ' ' . $reasonPhrase;
+			
+			header('HTTP/1.0 ' . $this->status . ' ' . $reasonPhrase);
 		}
 
 		if (empty($this->headers['Content-Type']) && ! empty($this->content_type)) {
@@ -223,6 +264,8 @@ class Response extends \Exception
 		}
 
 		$this->headers_sent = true;
+
+		return $this;
 	}
 
 
@@ -237,6 +280,8 @@ class Response extends \Exception
 		if (strlen($this->body) > 0) {
 			echo $this->body;
 		}
+
+		return $this;
 	}
 
 }

+ 20 - 4
src/App/ResponseError.php

@@ -2,17 +2,21 @@
 
 namespace KarmaFW\App;
 
+throw new \Exception("DEPRECATED", 1);
 
-class ResponseError extends ResponseText
+class ResponseError extends Response
 {
 	protected $status = 500;
 	protected $reasonPhrase = 'Server Error';
 
 
-	public function __construct($status=500, $body=null, $content_type='text/html')
+	public function __construct($body=null, $status=500, $headers=[], $content_type='text/html')
 	{
-		parent::__construct($body, $status, $content_type);
+		parent::__construct($status, $headers, $body);
 
+		$this->setContentType($content_type);
+
+		/*
 		if (is_null($body)) {
 			$this->body = '<html>';
 			$this->body .= '<head><title>' . $this->status . " " . $this->reasonPhrase . '</title></head>';
@@ -21,8 +25,20 @@ class ResponseError extends ResponseText
 			$this->body .= '</body>';
 			$this->body .= '</html>';
 		}
+		*/
+	}
 
-		$this->setStatus($status);
+	public function getDefaultBody()
+	{
+		$body = '<html>';
+		$body .= '<head><title>' . $this->status . " " . $this->reasonPhrase . '</title></head>';
+		$body .= '<body>';
+		$body .= '<h1>Error ' . $this->status . " : " . $this->reasonPhrase . '</h1>';
+		$body .= '</body>';
+		$body .= '</html>';
+
+		return $body;
 	}
 
+
 }

+ 4 - 3
src/App/ResponseError404.php

@@ -2,16 +2,17 @@
 
 namespace KarmaFW\App;
 
+throw new \Exception("DEPRECATED", 1);
 
 class ResponseError404 extends ResponseError
 {
 	protected $status = 404;
-	protected $status_name = 'Not Found';
+	protected $reasonPhrase = 'Not Found';
 
 
-	public function __construct($body=null, $content_type='text/html')
+	public function __construct($body=null, $headers=[], $content_type='text/html')
 	{
-		parent::__construct($this->status, $body, $content_type);
+		parent::__construct($body, $this->status, $headers, $content_type);
 	}
 
 }

+ 12 - 5
src/App/ResponseFile.php

@@ -10,9 +10,9 @@ class ResponseFile extends Response
 	protected $file_path;
 
 
-	public function __construct($file_path)
+	public function __construct($file_path, $status=200)
 	{
-		parent::__construct('', null);
+		parent::__construct('', $status);
 
 		$this->file_path = $file_path;
 	}
@@ -32,16 +32,23 @@ class ResponseFile extends Response
 
 		if (! is_file($this->file_path)) {
 			// File not found
-			$this->headers['Content-Length'] = 0;
+			$this->setStatus(404);
+			$this->setContentType('text/html'); // or application/json
+			//$this->headers['Content-Length'] = 0;
+			// TODO: return $this->fork( ResponseError404 );
 
 		} else {
-			$content_type = mime_content_type($this->file_path);
+			$content_type = $this->getContentType();
+			if (empty($content_type)) {
+				$content_type = mime_content_type($this->file_path);
+			}
 			if (empty($content_type)) {
 				$content_type = "application/octet-stream";
 			}
 
 			$this->headers['Content-Length'] = filesize($this->file_path);
-			$this->headers['Content-Type'] = $content_type;
+			//$this->headers['Content-Type'] = $content_type;
+			$this->setContentType($content_type);
 			$this->headers['Content-Transfer-Encoding'] = "Binary";
 			$this->headers['Content-disposition'] = 'attachment; filename="' . basename($this->file_path) . '"';
 		}

+ 7 - 3
src/App/ResponseHtml.php

@@ -2,13 +2,17 @@
 
 namespace KarmaFW\App;
 
+throw new \Exception("DEPRECATED", 1);
 
-class ResponseHtml extends ResponseText
+
+class ResponseHtml extends Response
 {
 
-	public function __construct($body=null, $status=200)
+	public function __construct($body=null, $status=200, $headers=[], $content_type='text/html')
 	{
-		parent::__construct($body, $status, 'text/html');
+		parent::__construct($status, $headers, $body);
+
+		$this->setContentType($content_type);
 	}
 
 }

+ 3 - 0
src/App/ResponseRedirect.php

@@ -5,6 +5,9 @@ namespace KarmaFW\App;
 use KarmaFW\App;
 
 
+throw new \Exception("DEPRECATED", 1);
+
+
 class ResponseRedirect extends Response
 {
 	protected $redirect_url = null;

+ 5 - 4
src/App/ResponseText.php

@@ -2,16 +2,17 @@
 
 namespace KarmaFW\App;
 
+throw new \Exception("DEPRECATED", 1);
 
-class ResponseText extends Response
+
+class ResponseHtml extends ResponseThrowable
 {
 
-	public function __construct($body=null, $status=200, $content_type='text/plain', $headers=[])
+	public function __construct($body=null, $status=200, $headers=[], $content_type='text/plain')
 	{
-		//$headers['Content-Type'] = $content_type;
 		parent::__construct($status, $headers, $body);
 
-		$this->content_type = $content_type;
+		$this->setContentType($content_type);
 	}
 
 }

+ 6 - 7
src/Controllers/MinimifierController.php

@@ -7,7 +7,6 @@ use \KarmaFW\App\Middlewares\MinimifierJs;
 use \KarmaFW\App\Middlewares\MinimifierCss;
 
 use \KarmaFW\App\ResponseRedirect;
-use \KarmaFW\App\ResponseError404;
 
 
 class MinimifierController extends WebAppController
@@ -33,13 +32,13 @@ class MinimifierController extends WebAppController
 
 			if ($file_path != realpath($file_path) || substr($file_path, -3) != '.js') {
 				// file path invalid or not a js file
-				return new ResponseError404;
+				return $this->response->setStatus(404)->setHtml('');
 				//return new ResponseRedirect($file_url);
 			}
 
 			if (! is_file($file_path)) {
 				// file not found
-				return new ResponseError404;
+				return $this->response->setStatus(404)->setHtml('');
 				//return new ResponseRedirect($file_url);
 
 			} else {
@@ -69,7 +68,7 @@ class MinimifierController extends WebAppController
 
 		} else {
 			// Error document root not found
-			return new ResponseError404;
+			return $this->response->setStatus(404)->setHtml('');
 			//return new ResponseRedirect($file_url);
 		}
 	}
@@ -95,13 +94,13 @@ class MinimifierController extends WebAppController
 
 			if ($file_path != realpath($file_path) || substr($file_path, -4) != '.css') {
 				// file path invalid or not a css file
-				return new ResponseError404;
+				return $this->response->setStatus(404)->setHtml('');
 				//return new ResponseRedirect($file_url);
 			}
 
 			if (! is_file($file_path)) {
 				// file not found
-				return new ResponseError404;
+				return $this->response->setStatus(404)->setHtml('');
 				//return new ResponseRedirect($file_url);
 
 			} else {
@@ -131,7 +130,7 @@ class MinimifierController extends WebAppController
 
 		} else {
 			// Error document root not found
-			return new ResponseError404;
+			return $this->response->setStatus(404)->setHtml('');
 			//return new ResponseRedirect($file_url);
 		}
 	}

+ 5 - 7
src/Routing/Router.php

@@ -5,8 +5,6 @@ namespace KarmaFW\Routing;
 use \KarmaFW\WebApp;
 use \KarmaFW\App\Request;
 use \KarmaFW\App\Response;
-use \KarmaFW\App\ResponseError;
-use \KarmaFW\App\ResponseError404;
 
 
 class Router
@@ -228,7 +226,7 @@ class Router
 				if (empty($callback)) {
 					// route found but no callback defined
 					//return 0;
-					return new ResponseError404("<h1>Page not Found</h1><p>Warning: route found but no callback defined</p>");
+					return $response->setStatus(404)->setHtml('<h1>Page not Found</h1><p>Warning: route found but no callback defined</p>');
 
 				} else if (is_callable($callback)) {
 					// OK !
@@ -239,7 +237,7 @@ class Router
 				} else {
 					// route found but callback is not callable
 					//return null;
-					return new ResponseError404("<h1>Page not Found</h1><p>Warning: route callback is not callable</p>");
+					return $response->setStatus(404)->setHtml('<h1>Page not Found</h1><p>Warning: route callback is not callable</p>');
 				}
 
 			}
@@ -248,7 +246,7 @@ class Router
 
 		// no matching route
 		//return false;
-		return new ResponseError404("<h1>Page not Found</h1><p>Warning: no matching route</p>");
+		return $response->setStatus(404)->setHtml('<h1>Page not Found</h1><p>Warning: no matching route</p>');
 	}
 
 
@@ -274,10 +272,10 @@ class Router
 			$response = $route_response;
 
 		} else if ($route_response) {
-			return new ResponseError(500, "<h1>Server Error</h1><p>Error: \$response is not a Response</p>");
+			return $response->setStatus(404)->setHtml('<h1>Server Error</h1><p>Error: \$response is not a Response</p>');
 
 		} else {
-			//return new ResponseError(500, "<h1>Server Error</h1><p>Error: \$response is empty</p>");
+			return $response->setStatus(404)->setHtml('<h1>Server Error</h1><p>Error: \$response is empty</p>');
 		}
 
 		return $response;

+ 13 - 2
src/Templates/PhpTemplate.php

@@ -100,7 +100,7 @@ class PhpTemplate
 	}
 
 
-	public function fetch($tpl, $extra_vars=[], $layout=null, $options=[])
+	public function fetch($tpl=null, $extra_vars=[], $layout=null, $options=[])
 	{
 		$tpl_dirs = [];
 
@@ -241,7 +241,7 @@ class PhpTemplate
 		}
 	}
 
-	public function display($tpl, $extra_vars=[], $layout=null, $options=[])
+	public function display($tpl=null, $extra_vars=[], $layout=null, $options=[])
 	{
 		echo $this->fetch($tpl, $extra_vars, $layout, $options);
 	}
@@ -257,6 +257,17 @@ class PhpTemplate
 		$this->variables[$var_name] = $var_value;
 	}
 
+	public function getTplPath()
+	{
+		return $this->tpl_path;
+	}
+
+	public function setTplPath($tpl_path)
+	{
+		$this->tpl_path = $tpl_path;
+		return $this;
+	}
+
 	public function assign($var_name, $var_value=null)
 	{
 		if (is_array($var_name)) {

+ 20 - 11
src/helpers/helpers_default.php

@@ -1,30 +1,39 @@
 <?php
 
-use \KarmaFW\App\ResponseError;
+use \KarmaFW\App\Response;
 use \KarmaFW\Routing\Router;
 
 
 if (! function_exists('pre')) {
 	function pre($var, $exit = false, $prefix = '') {
-		echo "<pre>";
+		$out = '';
+
+		$out .= "<pre>";
 		if (!empty($prefix)) {
-			echo $prefix;
+			$out .= $prefix;
 		}
 		if (is_null($var)) {
-			echo "NULL";
+			$out .= "NULL";
 		} else if ($var === true) {
-			echo "TRUE";
+			$out .= "TRUE";
 		} else if ($var === false) {
-			echo "FALSE";
+			$out .= "FALSE";
 		} else if (is_string($var)) {
-			echo '"' . $var . '"';
+			$out .= '"' . $var . '"';
 		} else {
-			print_r($var);
+			$out .= print_r($var, true);
 		}
-		echo "</pre>";
+		$out .= "</pre>";
+
 
 		if ($exit) {
-			exit;
+			//exit; 
+
+			//throw new ResponseHtml($out, 503);
+			throw new \Exception($out, 503);
+
+		} else {
+			echo $out;
 		}
 	}
 }
@@ -56,7 +65,7 @@ if (! function_exists('errorHttp')) {
 		$content .= '</body>';
 		$content .= '</html>';
 
-		return new ResponseError($error_code, $content);
+		throw new \Exception($content, $error_code);
 	}
 }