Chromium Code Reviews| Index: lib/server.dart |
| diff --git a/lib/server.dart b/lib/server.dart |
| index 6f30b77272a5cfe5befb5d9439cb5de467feac6a..7b682cc4290ca98b2818fb0b6d3abe63daa7cb6d 100644 |
| --- a/lib/server.dart |
| +++ b/lib/server.dart |
| @@ -32,6 +32,10 @@ typedef Future<bool> Filter(HttpRequest request); |
| * subsequent filters and request handlers are not run. This way a filter can |
| * prevent further processing, like needed for authentication. |
| * |
| + * Requests not matched by a call to [serve] are sent to the [defaultStream]. |
| + * If there's no subscriber to the defaultStream then a 404 is sent to the |
| + * response. |
| + * |
| * Example: |
| * import 'package:route/server.dart'; |
| * import 'package:route/pattern.dart'; |
| @@ -41,19 +45,30 @@ typedef Future<bool> Filter(HttpRequest request); |
| * router.filter(matchesAny(['/foo', '/bar']), authFilter); |
| * router.serve('/foo').listen(fooHandler); |
| * router.serve('/bar').listen(barHandler); |
| + * router.defaultStream.listen(send404); |
| * }); |
| */ |
| class Router { |
| - final Stream<HttpRequest> incoming; |
| - final Map<Pattern, StreamController> _controllers = new LinkedHashMap(); |
| - final Map<Pattern, Filter> _filters = new LinkedHashMap(); |
| - |
| - Router(this.incoming) { |
| - incoming.listen(_handleRequest); |
| + final Stream<HttpRequest> _incoming; |
| + |
| + final Map<Pattern, StreamController> _controllers = |
| + new LinkedHashMap<Pattern, StreamController>(); |
| + |
| + final Map<Pattern, Filter> _filters = new LinkedHashMap<Pattern, Filter>(); |
| + |
| + final StreamController<HttpRequest> _defaultController = |
| + new StreamController<HttpRequest>(); |
| + |
| + /** |
| + * Create a new Router that listens to the [incoming] stream, usually an |
| + * instance of [HttpServer]. |
| + */ |
| + Router(Stream<HttpRequest> incoming) : _incoming = incoming { |
| + _incoming.listen(_handleRequest); |
| } |
| /** |
| - * Request whose URI matches [url] are sent the the stream created by this\ |
| + * Request whose URI matches [url] are sent the the stream created by this |
|
butlermatt
2013/03/07 13:21:52
double 'the'
|
| * method, and not sent to any other serve streams. |
| */ |
| Stream<HttpRequest> serve(Pattern url) { |
| @@ -74,6 +89,8 @@ class Router { |
| _filters[url] = filter; |
| } |
| + Stream<HttpRequest> get defaultStream => _defaultController.stream; |
| + |
| void _handleRequest(HttpRequest req) { |
| bool cont = true; |
| doWhile(_filters.keys, (Pattern pattern) { |
| @@ -95,7 +112,11 @@ class Router { |
| } |
| } |
| if (!handled) { |
| - send404(req); |
| + if (_defaultController.hasSubscribers) { |
| + _defaultController.add(req); |
| + } else { |
| + send404(req); |
| + } |
| } |
| } |
| }); |