Browse Source

update after PR 711

Maurits van der Schee 3 years ago
parent
commit
317839ee91

+ 0
- 2
README.md View File

@@ -619,8 +619,6 @@ You can enable the following middleware using the "middlewares" config parameter
619 619
 - "joinLimits": Restricts join parameters to prevent database scraping
620 620
 - "customization": Provides handlers for request and response customization
621 621
 - "xml": Translates all input and output from JSON to XML
622
-- "errors": Catches throwables and returns an error response instead of throwing  (enabled by default)\
623
-  Should always be applied after cors middleware, otherwise errors will not have CORS headers sent to the client.
624 622
 
625 623
 The "middlewares" config parameter is a comma separated list of enabled middlewares.
626 624
 You can tune the middleware behavior using middleware specific configuration parameters:

+ 13
- 73
api.php View File

@@ -6893,17 +6893,6 @@ namespace Tqdev\PhpCrudApi\Middleware\Base {
6893 6893
             $this->properties = $properties;
6894 6894
         }
6895 6895
 
6896
-        /**
6897
-         * allows to load middlewares in a specific order
6898
-         * The higher the priority, the earlier the middleware will be called
6899
-         *
6900
-         * @return int
6901
-         */
6902
-        public function getPriority() /* : int */
6903
-        {
6904
-            return 1;
6905
-        }
6906
-
6907 6896
         protected function getArrayProperty(string $key, string $default): array
6908 6897
         {
6909 6898
             return array_filter(array_map('trim', explode(',', $this->getProperty($key, $default))));
@@ -7068,10 +7057,6 @@ namespace Tqdev\PhpCrudApi\Middleware\Router {
7068 7057
                 $this->cache->set('PathTree', $data, $this->ttl);
7069 7058
             }
7070 7059
 
7071
-            uasort($this->middlewares, function (Middleware $a, Middleware $b) {
7072
-                return $a->getPriority() > $b->getPriority() ? 1 : ($a->getPriority() === $b->getPriority() ? 0 : -1);
7073
-            });
7074
-
7075 7060
             return $this->handle($request);
7076 7061
         }
7077 7062
 
@@ -7392,7 +7377,7 @@ namespace Tqdev\PhpCrudApi\Middleware {
7392 7377
     }
7393 7378
 }
7394 7379
 
7395
-// file: src/Tqdev/PhpCrudApi/Middleware/CatchErrorsMiddleware.php
7380
+// file: src/Tqdev/PhpCrudApi/Middleware/CorsMiddleware.php
7396 7381
 namespace Tqdev\PhpCrudApi\Middleware {
7397 7382
 
7398 7383
     use Psr\Http\Message\ResponseInterface;
@@ -7402,9 +7387,10 @@ namespace Tqdev\PhpCrudApi\Middleware {
7402 7387
     use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
7403 7388
     use Tqdev\PhpCrudApi\Middleware\Router\Router;
7404 7389
     use Tqdev\PhpCrudApi\Record\ErrorCode;
7390
+    use Tqdev\PhpCrudApi\ResponseFactory;
7405 7391
     use Tqdev\PhpCrudApi\ResponseUtils;
7406 7392
 
7407
-    class CatchErrorsMiddleware extends Middleware
7393
+    class CorsMiddleware extends Middleware
7408 7394
     {
7409 7395
         private $debug;
7410 7396
 
@@ -7414,45 +7400,6 @@ namespace Tqdev\PhpCrudApi\Middleware {
7414 7400
             $this->debug = $debug;
7415 7401
         }
7416 7402
 
7417
-        public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
7418
-        {
7419
-            $response = null;
7420
-            try {
7421
-                $response = $next->handle($request);
7422
-            } catch (\Throwable $e) {
7423
-                $response = $this->responder->error(ErrorCode::ERROR_NOT_FOUND, $e->getMessage());
7424
-                if ($this->debug) {
7425
-                    $response = ResponseUtils::addExceptionHeaders($response, $e);
7426
-                }
7427
-            }
7428
-            return $response;
7429
-        }
7430
-
7431
-        /**
7432
-         * High priority, should always be one of the very first middlewares to be loaded
7433
-         * Only cors middleware should be loaded earlier
7434
-         *
7435
-         * @return int
7436
-         */
7437
-        public function getPriority()
7438
-        {
7439
-            return 998;
7440
-        }
7441
-    }
7442
-}
7443
-
7444
-// file: src/Tqdev/PhpCrudApi/Middleware/CorsMiddleware.php
7445
-namespace Tqdev\PhpCrudApi\Middleware {
7446
-
7447
-    use Psr\Http\Message\ResponseInterface;
7448
-    use Psr\Http\Message\ServerRequestInterface;
7449
-    use Psr\Http\Server\RequestHandlerInterface;
7450
-    use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
7451
-    use Tqdev\PhpCrudApi\Record\ErrorCode;
7452
-    use Tqdev\PhpCrudApi\ResponseFactory;
7453
-
7454
-    class CorsMiddleware extends Middleware
7455
-    {
7456 7403
         private function isOriginAllowed(string $origin, string $allowedOrigins): bool
7457 7404
         {
7458 7405
             $found = false;
@@ -7497,7 +7444,15 @@ namespace Tqdev\PhpCrudApi\Middleware {
7497 7444
                     $response = $response->withHeader('Access-Control-Expose-Headers', $exposeHeaders);
7498 7445
                 }
7499 7446
             } else {
7500
-                $response = $next->handle($request);
7447
+                $response = null;
7448
+                try {
7449
+                    $response = $next->handle($request);
7450
+                } catch (\Throwable $e) {
7451
+                    $response = $this->responder->error(ErrorCode::ERROR_NOT_FOUND, $e->getMessage());
7452
+                    if ($this->debug) {
7453
+                        $response = ResponseUtils::addExceptionHeaders($response, $e);
7454
+                    }
7455
+                }
7501 7456
             }
7502 7457
             if ($origin) {
7503 7458
                 $allowCredentials = $this->getProperty('allowCredentials', 'true');
@@ -7508,16 +7463,6 @@ namespace Tqdev\PhpCrudApi\Middleware {
7508 7463
             }
7509 7464
             return $response;
7510 7465
         }
7511
-
7512
-        /**
7513
-         * load early in the routing stack. should be loaded before catc herrors middleware,
7514
-         * otherwise cors headers will be missing
7515
-         * @return int
7516
-         */
7517
-        public function getPriority()
7518
-        {
7519
-            return 999;
7520
-        }
7521 7466
     }
7522 7467
 }
7523 7468
 
@@ -10716,7 +10661,6 @@ namespace Tqdev\PhpCrudApi {
10716 10661
     use Tqdev\PhpCrudApi\GeoJson\GeoJsonService;
10717 10662
     use Tqdev\PhpCrudApi\Middleware\AuthorizationMiddleware;
10718 10663
     use Tqdev\PhpCrudApi\Middleware\BasicAuthMiddleware;
10719
-    use Tqdev\PhpCrudApi\Middleware\CatchErrorsMiddleware;
10720 10664
     use Tqdev\PhpCrudApi\Middleware\CorsMiddleware;
10721 10665
     use Tqdev\PhpCrudApi\Middleware\CustomizationMiddleware;
10722 10666
     use Tqdev\PhpCrudApi\Middleware\DbAuthMiddleware;
@@ -10760,14 +10704,13 @@ namespace Tqdev\PhpCrudApi {
10760 10704
             $reflection = new ReflectionService($db, $cache, $config->getCacheTime());
10761 10705
             $responder = new JsonResponder();
10762 10706
             $router = new SimpleRouter($config->getBasePath(), $responder, $cache, $config->getCacheTime(), $config->getDebug());
10763
-            new CatchErrorsMiddleware($router, $responder, [], $config->getDebug());
10764 10707
             foreach ($config->getMiddlewares() as $middleware => $properties) {
10765 10708
                 switch ($middleware) {
10766 10709
                     case 'sslRedirect':
10767 10710
                         new SslRedirectMiddleware($router, $responder, $properties);
10768 10711
                         break;
10769 10712
                     case 'cors':
10770
-                        new CorsMiddleware($router, $responder, $properties);
10713
+                        new CorsMiddleware($router, $responder, $properties, $config->getDebug());
10771 10714
                         break;
10772 10715
                     case 'firewall':
10773 10716
                         new FirewallMiddleware($router, $responder, $properties);
@@ -10814,9 +10757,6 @@ namespace Tqdev\PhpCrudApi {
10814 10757
                     case 'xml':
10815 10758
                         new XmlMiddleware($router, $responder, $properties, $reflection);
10816 10759
                         break;
10817
-                    case 'errors':
10818
-                        new CatchErrorsMiddleware($router, $responder, [], $config->getDebug());
10819
-                        break;
10820 10760
                 }
10821 10761
             }
10822 10762
             foreach ($config->getControllers() as $controller) {

+ 1
- 6
src/Tqdev/PhpCrudApi/Api.php View File

@@ -18,7 +18,6 @@ use Tqdev\PhpCrudApi\Database\GenericDB;
18 18
 use Tqdev\PhpCrudApi\GeoJson\GeoJsonService;
19 19
 use Tqdev\PhpCrudApi\Middleware\AuthorizationMiddleware;
20 20
 use Tqdev\PhpCrudApi\Middleware\BasicAuthMiddleware;
21
-use Tqdev\PhpCrudApi\Middleware\CatchErrorsMiddleware;
22 21
 use Tqdev\PhpCrudApi\Middleware\CorsMiddleware;
23 22
 use Tqdev\PhpCrudApi\Middleware\CustomizationMiddleware;
24 23
 use Tqdev\PhpCrudApi\Middleware\DbAuthMiddleware;
@@ -62,14 +61,13 @@ class Api implements RequestHandlerInterface
62 61
         $reflection = new ReflectionService($db, $cache, $config->getCacheTime());
63 62
         $responder = new JsonResponder();
64 63
         $router = new SimpleRouter($config->getBasePath(), $responder, $cache, $config->getCacheTime(), $config->getDebug());
65
-        new CatchErrorsMiddleware($router, $responder, [], $config->getDebug());
66 64
         foreach ($config->getMiddlewares() as $middleware => $properties) {
67 65
             switch ($middleware) {
68 66
                 case 'sslRedirect':
69 67
                     new SslRedirectMiddleware($router, $responder, $properties);
70 68
                     break;
71 69
                 case 'cors':
72
-                    new CorsMiddleware($router, $responder, $properties);
70
+                    new CorsMiddleware($router, $responder, $properties, $config->getDebug());
73 71
                     break;
74 72
                 case 'firewall':
75 73
                     new FirewallMiddleware($router, $responder, $properties);
@@ -116,9 +114,6 @@ class Api implements RequestHandlerInterface
116 114
                 case 'xml':
117 115
                     new XmlMiddleware($router, $responder, $properties, $reflection);
118 116
                     break;
119
-                case 'errors':
120
-                    new CatchErrorsMiddleware($router, $responder, $properties, $config->getDebug());
121
-                    break;
122 117
             }
123 118
         }
124 119
         foreach ($config->getControllers() as $controller) {

+ 0
- 11
src/Tqdev/PhpCrudApi/Middleware/Base/Middleware.php View File

@@ -19,17 +19,6 @@ abstract class Middleware implements MiddlewareInterface
19 19
         $this->properties = $properties;
20 20
     }
21 21
 
22
-    /**
23
-     * allows to load middlewares in a specific order
24
-     * The higher the priority, the earlier the middleware will be called
25
-     *
26
-     * @return int
27
-     */
28
-    public function getPriority() /* : int */
29
-    {
30
-        return 1;
31
-    }
32
-
33 22
     protected function getArrayProperty(string $key, string $default): array
34 23
     {
35 24
         return array_filter(array_map('trim', explode(',', $this->getProperty($key, $default))));

+ 0
- 49
src/Tqdev/PhpCrudApi/Middleware/CatchErrorsMiddleware.php View File

@@ -1,49 +0,0 @@
1
-<?php
2
-
3
-namespace Tqdev\PhpCrudApi\Middleware;
4
-
5
-use Psr\Http\Message\ResponseInterface;
6
-use Psr\Http\Message\ServerRequestInterface;
7
-use Psr\Http\Server\RequestHandlerInterface;
8
-use Tqdev\PhpCrudApi\Controller\Responder;
9
-use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
10
-use Tqdev\PhpCrudApi\Middleware\Router\Router;
11
-use Tqdev\PhpCrudApi\Record\ErrorCode;
12
-use Tqdev\PhpCrudApi\ResponseUtils;
13
-
14
-
15
-class CatchErrorsMiddleware extends Middleware
16
-{
17
-    private $debug;
18
-
19
-    public function __construct(Router $router, Responder $responder, array $properties, bool $debug)
20
-    {
21
-        parent::__construct($router, $responder, $properties);
22
-        $this->debug = $debug;
23
-    }
24
-
25
-    public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
26
-    {
27
-        $response = null;
28
-        try {
29
-            $response = $next->handle($request);
30
-        } catch (\Throwable $e) {
31
-            $response = $this->responder->error(ErrorCode::ERROR_NOT_FOUND, $e->getMessage());
32
-            if ($this->debug) {
33
-                $response = ResponseUtils::addExceptionHeaders($response, $e);
34
-            }
35
-        }
36
-        return $response;
37
-    }
38
-
39
-    /**
40
-     * High priority, should always be one of the very first middlewares to be loaded
41
-     * Only cors middleware should be loaded earlier
42
-     *
43
-     * @return int
44
-     */
45
-    public function getPriority()
46
-    {
47
-        return 998;
48
-    }
49
-}

+ 20
- 11
src/Tqdev/PhpCrudApi/Middleware/CorsMiddleware.php View File

@@ -5,12 +5,23 @@ namespace Tqdev\PhpCrudApi\Middleware;
5 5
 use Psr\Http\Message\ResponseInterface;
6 6
 use Psr\Http\Message\ServerRequestInterface;
7 7
 use Psr\Http\Server\RequestHandlerInterface;
8
+use Tqdev\PhpCrudApi\Controller\Responder;
8 9
 use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
10
+use Tqdev\PhpCrudApi\Middleware\Router\Router;
9 11
 use Tqdev\PhpCrudApi\Record\ErrorCode;
10 12
 use Tqdev\PhpCrudApi\ResponseFactory;
13
+use Tqdev\PhpCrudApi\ResponseUtils;
11 14
 
12 15
 class CorsMiddleware extends Middleware
13 16
 {
17
+    private $debug;
18
+
19
+    public function __construct(Router $router, Responder $responder, array $properties, bool $debug)
20
+    {
21
+        parent::__construct($router, $responder, $properties);
22
+        $this->debug = $debug;
23
+    }
24
+
14 25
     private function isOriginAllowed(string $origin, string $allowedOrigins): bool
15 26
     {
16 27
         $found = false;
@@ -55,7 +66,15 @@ class CorsMiddleware extends Middleware
55 66
                 $response = $response->withHeader('Access-Control-Expose-Headers', $exposeHeaders);
56 67
             }
57 68
         } else {
58
-            $response = $next->handle($request);
69
+            $response = null;
70
+            try {
71
+                $response = $next->handle($request);
72
+            } catch (\Throwable $e) {
73
+                $response = $this->responder->error(ErrorCode::ERROR_NOT_FOUND, $e->getMessage());
74
+                if ($this->debug) {
75
+                    $response = ResponseUtils::addExceptionHeaders($response, $e);
76
+                }
77
+            }
59 78
         }
60 79
         if ($origin) {
61 80
             $allowCredentials = $this->getProperty('allowCredentials', 'true');
@@ -66,14 +85,4 @@ class CorsMiddleware extends Middleware
66 85
         }
67 86
         return $response;
68 87
     }
69
-
70
-    /**
71
-     * load early in the routing stack. should be loaded before catc herrors middleware,
72
-     * otherwise cors headers will be missing
73
-     * @return int
74
-     */
75
-    public function getPriority()
76
-    {
77
-        return 999;
78
-    }
79 88
 }

+ 0
- 4
src/Tqdev/PhpCrudApi/Middleware/Router/SimpleRouter.php View File

@@ -96,10 +96,6 @@ class SimpleRouter implements Router
96 96
             $this->cache->set('PathTree', $data, $this->ttl);
97 97
         }
98 98
 
99
-        uasort($this->middlewares, function (Middleware $a, Middleware $b) {
100
-            return $a->getPriority() > $b->getPriority() ? 1 : ($a->getPriority() === $b->getPriority() ? 0 : -1);
101
-        });
102
-
103 99
         return $this->handle($request);
104 100
     }
105 101
 

Loading…
Cancel
Save