Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Unified Diff: lib/server.dart

Issue 12578002: Add Router.defaultStream Base URL: https://github.com/dart-lang/route.git@master
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | test/server_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+ }
}
}
});
« no previous file with comments | « no previous file | test/server_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698