diff --git a/CHANGELOG.md b/CHANGELOG.md index f54e3b1f..894af546 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.0.0-alpha.22 +* Update pipeline handling mechanism, and inject a `MiddlewarePipelineIterator`. + * This allows routes to know where in the resolution process they exist, at runtime. + # 2.0.0-alpha.21 * Update for `angel_route@3.0.4` compatibility. * Add `readAsBytes` and `readAsString` to `UploadedFile`. diff --git a/lib/src/core/driver.dart b/lib/src/core/driver.dart index 5e43226d..5ffce8d1 100644 --- a/lib/src/core/driver.dart +++ b/lib/src/core/driver.dart @@ -99,10 +99,10 @@ abstract class Driver< Tuple4, ParseResult, MiddlewarePipeline> resolveTuple() { - Router r = app.optimizedRouter; + var r = app.optimizedRouter; var resolved = r.resolveAbsolute(path, method: req.method, strip: false); - var pipeline = new MiddlewarePipeline(resolved); + var pipeline = new MiddlewarePipeline(resolved); return new Tuple4( pipeline.handlers, resolved.fold>( @@ -116,11 +116,16 @@ abstract class Driver< var tuple = app.isProduction ? app.handlerCache.putIfAbsent(cacheKey, resolveTuple) : resolveTuple(); + var line = tuple.item4 as MiddlewarePipeline; + var it = MiddlewarePipelineIterator(line); req.params.addAll(tuple.item2); req.container ..registerSingleton(tuple.item4) + ..registerSingleton>(line) + ..registerSingleton(it) + ..registerSingleton>(it) ..registerSingleton>(tuple.item3) ..registerSingleton(tuple.item3); @@ -129,24 +134,8 @@ abstract class Driver< .registerSingleton(new Stopwatch()..start()); } - if (tuple.item1.isEmpty) { - print(req.uri); - print('${req.path} => ${tuple.item1}'); - } - - var pipeline = tuple.item1; - var it = pipeline.iterator; - - var runPipeline = pipeline.isEmpty - ? null - : Future.doWhile(() => !it.moveNext() - ? new Future.value(false) - : app.executeHandler(it.current, req, res)); - - return runPipeline == null - ? sendResponse(request, response, req, res) - : runPipeline - .then((_) => sendResponse(request, response, req, res)); + return runPipeline(it, req, res, app) + .then((_) => sendResponse(request, response, req, res)); } if (useZone == false) { @@ -355,4 +344,21 @@ abstract class Driver< return closeResponse(response).then(_cleanup); }); } + + /// Runs a [MiddlewarePipeline]. + static Future runPipeline( + MiddlewarePipelineIterator it, + RequestContextType req, + ResponseContextType res, + Angel app) async { + while (it.moveNext()) { + var current = it.current.handlers.iterator; + + while (current.moveNext()) { + var result = await app.executeHandler(current.current, req, res); + if (result != true) break; + } + } + } } diff --git a/lib/src/core/server.dart b/lib/src/core/server.dart index c404d077..af9cc062 100644 --- a/lib/src/core/server.dart +++ b/lib/src/core/server.dart @@ -41,7 +41,7 @@ class Angel extends Routable { Tuple4, ParseResult, MiddlewarePipeline>> handlerCache = new HashMap(); - Router _flattened; + Router _flattened; bool _isProduction; Angel _parent; @@ -62,7 +62,7 @@ class Angel extends Routable { Map get preContained => _preContained; /// Returns the [flatten]ed version of this router in production. - Router get optimizedRouter => _flattened ?? this; + Router get optimizedRouter => _flattened ?? this; /// Determines whether to allow HTTP request method overrides. bool allowMethodOverrides = true; diff --git a/pubspec.yaml b/pubspec.yaml index b3d19163..af4db52c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_framework -version: 2.0.0-alpha.21 +version: 2.0.0-alpha.22 description: A high-powered HTTP server with dependency injection, routing and much more. author: Tobe O homepage: https://github.com/angel-dart/angel_framework