@@ -11,8 +11,9 @@ final class MiddlewareRunner
1111{
1212 /**
1313 * @var callable[]
14+ * @internal
1415 */
15- private $ middleware = array ();
16+ public $ middleware = array ();
1617
1718 /**
1819 * @param callable[] $middleware
@@ -32,22 +33,34 @@ public function __invoke(ServerRequestInterface $request)
3233 return Promise \reject (new \RuntimeException ('No middleware to run ' ));
3334 }
3435
35- $ middlewareCollection = $ this ->middleware ;
36- $ middleware = array_shift ($ middlewareCollection );
37-
38- $ cancel = null ;
39- return new Promise \Promise (function ($ resolve , $ reject ) use ($ middleware , $ request , $ middlewareCollection , &$ cancel ) {
40- $ cancel = $ middleware (
41- $ request ,
42- new MiddlewareRunner (
43- $ middlewareCollection
44- )
45- );
46- $ resolve ($ cancel );
47- }, function () use (&$ cancel ) {
48- if ($ cancel instanceof Promise \CancellablePromiseInterface) {
49- $ cancel ->cancel ();
50- }
51- });
36+ $ position = 0 ;
37+
38+ $ that = $ this ;
39+ $ func = function (ServerRequestInterface $ request ) use (&$ func , &$ position , &$ that ) {
40+ $ middleware = $ that ->middleware [$ position ];
41+ $ response = null ;
42+ return new Promise \Promise (function ($ resolve , $ reject ) use ($ middleware , $ request , $ func , &$ response , &$ position ) {
43+ $ position ++;
44+ try {
45+ $ response = $ middleware (
46+ $ request ,
47+ $ func
48+ );
49+ $ resolve ($ response );
50+ } catch (\Exception $ error ) {
51+ $ position --;
52+ $ reject ($ error );
53+ } catch (\Throwable $ error ) {
54+ $ position --;
55+ $ reject ($ error );
56+ }
57+ }, function () use (&$ response ) {
58+ if ($ response instanceof Promise \CancellablePromiseInterface) {
59+ $ response ->cancel ();
60+ }
61+ });
62+ };
63+
64+ return $ func ($ request );
5265 }
53- }
66+ }
0 commit comments