Skip to content
This repository was archived by the owner on Mar 18, 2021. It is now read-only.

Commit 40dc2d8

Browse files
Added query param handling and one test; requires more tests
1 parent 2dad1f6 commit 40dc2d8

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

lib/http_controller.dart

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ abstract class HttpController {
132132
(attr) => attr.reflectee is Route, orElse: () => null);
133133
if (routeAttrs != null) {
134134
var params = (decl as MethodMirror).parameters
135+
.where((pm) => !pm.isOptional)
135136
.map((pm) => MirrorSystem.getName(pm.simpleName))
136137
.toList();
137138
Route r = new Route.fromRoute(routeAttrs.reflectee, params);
@@ -177,6 +178,7 @@ abstract class HttpController {
177178
reflect(this).type.declarations[handlerMethodSymbol] as MethodMirror;
178179

179180
return handlerMirror.parameters
181+
.where((methodParmeter) => !methodParmeter.isOptional)
180182
.map((methodParameter) {
181183
var value = this.resourceRequest.pathParameters[MirrorSystem.getName(methodParameter.simpleName)];
182184
var parameterType = methodParameter.type;
@@ -185,14 +187,37 @@ abstract class HttpController {
185187
}).toList();
186188
}
187189

190+
Map<String, dynamic> _queryParametersForRequest(ResourceRequest req, Symbol handlerMethodSymbol) {
191+
var queryParams = req.request.uri.queryParameters;
192+
if(queryParams.length == 0) {
193+
return null;
194+
}
195+
196+
var optionalParams = (reflect(this).type.declarations[handlerMethodSymbol] as MethodMirror)
197+
.parameters.where((methodParameter) => methodParameter.isOptional).toList();
198+
199+
var retMap = {};
200+
queryParams.forEach((k, v) {
201+
var keySymbol = new Symbol(k);
202+
var matchingParameter = optionalParams.firstWhere((p) => p.simpleName == keySymbol, orElse: () => null);
203+
if(matchingParameter != null) {
204+
retMap[keySymbol] = v;
205+
}
206+
});
207+
208+
return retMap;
209+
}
210+
188211
Future process() async {
189212
try {
190213
var methodSymbol = _routeMethodSymbolForRequest(resourceRequest);
191214
var handlerParameters = _parametersForRequest(resourceRequest, methodSymbol);
215+
var handlerQueryParameters = _queryParametersForRequest(resourceRequest, methodSymbol);
216+
192217
requestBody = await _readRequestBodyForRequest(resourceRequest);
193218

194219
Future<Response> eventualResponse =
195-
reflect(this).invoke(methodSymbol, handlerParameters).reflectee;
220+
reflect(this).invoke(methodSymbol, handlerParameters, handlerQueryParameters).reflectee;
196221

197222
var response = await eventualResponse;
198223

lib/resource_request.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ class ResourceRequest {
1212
/// all of the request information provided by the client.
1313
final HttpRequest request;
1414

15-
1615
/// The response object of this [ResourceRequest].
1716
///
1817
/// To respond to a request, this object must be written to. It is the same

test/controller_tests.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,16 @@ void main() {
8989
expect(res.statusCode, 415);
9090
});
9191

92+
test("Query parameters get delivered if exposed as optional params", () async {
93+
serve(new QController(), null);
94+
95+
var res = await http.get("http://localhost:4040/a?opt=x");
96+
97+
expect(res.body, "\"OK\"");
98+
99+
res = await http.get("http://localhost:4040/a");
100+
expect(res.body, "\"NOT\"");
101+
});
92102

93103

94104
}
@@ -124,4 +134,14 @@ class TController extends HttpController {
124134

125135
return new Response.ok(body);
126136
}
137+
}
138+
139+
class QController extends HttpController {
140+
@httpGet
141+
Future<Response> getOne({String opt: null}) async {
142+
if(opt == null) {
143+
return new Response.ok("NOT");
144+
}
145+
return new Response.ok("OK");
146+
}
127147
}

0 commit comments

Comments
 (0)