diff --git a/lib/src/tree.dart b/lib/src/tree.dart index 17a25c2..ea77340 100644 --- a/lib/src/tree.dart +++ b/lib/src/tree.dart @@ -18,7 +18,7 @@ class AppRouteMatch { // properties AppRoute route; - Map parameters = {}; + Map parameters = {}; } class RouteTreeNodeMatch { @@ -26,7 +26,7 @@ class RouteTreeNodeMatch { RouteTreeNodeMatch(this.node); RouteTreeNodeMatch.fromMatch(RouteTreeNodeMatch match, this.node) { - parameters = {}; + parameters = {}; if (match != null) { parameters.addAll(match.parameters); } @@ -34,7 +34,7 @@ class RouteTreeNodeMatch { // properties RouteTreeNode node; - Map parameters = {}; + Map parameters = {}; } class RouteTreeNode { @@ -121,7 +121,7 @@ class RouteTree { List nextNodes = []; for (RouteTreeNode node in nodesToCheck) { String pathPart = checkComponent; - Map queryMap; + Map queryMap; if (checkComponent.contains("?")) { var splitParam = checkComponent.split("?"); pathPart = splitParam[0]; @@ -211,13 +211,26 @@ class RouteTree { return component.startsWith(":"); } - Map parseQueryString(String query) { + Map parseQueryString(String query) { var search = new RegExp('([^&=]+)=?([^&]*)'); var params = new Map(); if (query.startsWith('?')) query = query.substring(1); decode(String s) => Uri.decodeComponent(s.replaceAll('+', ' ')); for (Match match in search.allMatches(query)) { - params[decode(match.group(1))] = decode(match.group(2)); + String key = decode(match.group(1)); + String value = decode(match.group(2)); + if (params.containsKey(key)) { + dynamic paramValue = params[key]; + if (paramValue is List) { + paramValue.add(value); + } else if (paramValue is String) { + params[key] = [paramValue, value]; + } else { + params[key] = value; + } + } else { + params[key] = value; + } } return params; } diff --git a/test/parser_test.dart b/test/parser_test.dart index 5394c7f..94012a6 100644 --- a/test/parser_test.dart +++ b/test/parser_test.dart @@ -46,4 +46,17 @@ void main() { })); }); + testWidgets("Router correctly parses array parameters", (WidgetTester tester) async { + String path = "/users/create?name=luke&phrase=hello%20world&number=7&number=10&number=13"; + String route = "/users/create"; + Router router = new Router(); + router.define(route, handler: null); + AppRouteMatch match = router.match(path); + expect(match?.parameters, equals({ + "name" : "luke", + "phrase" : "hello world", + "number" : ["7", "10", "13"], + })); + }); + } \ No newline at end of file