fix: mount remove trailing slash requirement (#146)
fix: mount remove trailing slash requirement
diff --git a/pkgs/shelf_router/CHANGELOG.md b/pkgs/shelf_router/CHANGELOG.md
index 0dc5d5b..a8c0eb0 100644
--- a/pkgs/shelf_router/CHANGELOG.md
+++ b/pkgs/shelf_router/CHANGELOG.md
@@ -1,3 +1,7 @@
+## v1.1.2
+
+ * Remove trailing slash requirement when using `mount`.
+
## v1.1.1
* Fix `Router.routeNotFound` to enable multiple `read()` calls on it.
diff --git a/pkgs/shelf_router/lib/src/router.dart b/pkgs/shelf_router/lib/src/router.dart
index 460ec26..9460788 100644
--- a/pkgs/shelf_router/lib/src/router.dart
+++ b/pkgs/shelf_router/lib/src/router.dart
@@ -148,16 +148,24 @@
///
/// In this case prefix may not contain any parameters, nor
void mount(String prefix, Handler handler) {
- if (!prefix.startsWith('/') || !prefix.endsWith('/')) {
- throw ArgumentError.value(
- prefix, 'prefix', 'must start and end with a slash');
+ if (!prefix.startsWith('/')) {
+ throw ArgumentError.value(prefix, 'prefix', 'must start with a slash');
}
// first slash is always in request.handlerPath
final path = prefix.substring(1);
- all(prefix + '<path|[^]*>', (Request request) {
- return handler(request.change(path: path));
- });
+ if (prefix.endsWith('/')) {
+ all(prefix + '<path|[^]*>', (Request request) {
+ return handler(request.change(path: path));
+ });
+ } else {
+ all(prefix, (Request request) {
+ return handler(request.change(path: path));
+ });
+ all(prefix + '/<path|[^]*>', (Request request) {
+ return handler(request.change(path: path + '/'));
+ });
+ }
}
/// Route incoming requests to registered handlers.
diff --git a/pkgs/shelf_router/pubspec.yaml b/pkgs/shelf_router/pubspec.yaml
index 5e93b19..99a1e46 100644
--- a/pkgs/shelf_router/pubspec.yaml
+++ b/pkgs/shelf_router/pubspec.yaml
@@ -1,5 +1,5 @@
name: shelf_router
-version: 1.1.1
+version: 1.1.2
description: |
A convinent request router for the shelf web-framework, with support for
URL-parameters, nested routers and routers generated from source annotations.
diff --git a/pkgs/shelf_router/test/router_test.dart b/pkgs/shelf_router/test/router_test.dart
index 6f9b316..f664f56 100644
--- a/pkgs/shelf_router/test/router_test.dart
+++ b/pkgs/shelf_router/test/router_test.dart
@@ -148,6 +148,36 @@
expect(await get('/api/hello?ok'), 'middleware');
});
+ test('mount(Router) does not require a trailing slash', () async {
+ var api = Router();
+ api.get('/', (Request request) {
+ return Response.ok('Hello World!');
+ });
+
+ api.get('/user/<user>/info', (Request request, String user) {
+ return Response.ok('Hello $user');
+ });
+
+ var app = Router();
+ app.get('/hello', (Request request) {
+ return Response.ok('hello-world');
+ });
+
+ app.mount('/api', api);
+
+ app.all('/<_|[^]*>', (Request request) {
+ return Response.ok('catch-all-handler');
+ });
+
+ server.mount(app);
+
+ expect(await get('/hello'), 'hello-world');
+ expect(await get('/api'), 'Hello World!');
+ expect(await get('/api/'), 'Hello World!');
+ expect(await get('/api/user/jonasfj/info'), 'Hello jonasfj');
+ expect(await get('/api/user/jonasfj/info-wrong'), 'catch-all-handler');
+ });
+
test('responds with 404 if no handler matches', () {
var api = Router()..get('/hello', (request) => Response.ok('Hello'));
server.mount(api);