diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml
index 264fd455..8712f48d 100644
--- a/.idea/libraries/Dart_Packages.xml
+++ b/.idea/libraries/Dart_Packages.xml
@@ -47,7 +47,7 @@
-
+
@@ -68,14 +68,14 @@
-
+
-
+
@@ -96,7 +96,7 @@
-
+
@@ -138,7 +138,7 @@
-
+
@@ -170,6 +170,13 @@
+
+
+
+
+
+
+
@@ -208,7 +215,7 @@
-
+
@@ -222,14 +229,21 @@
-
+
+
+
+
+
+
+
+
-
+
@@ -243,14 +257,14 @@
-
+
-
+
@@ -268,6 +282,13 @@
+
+
+
+
+
+
+
@@ -278,21 +299,21 @@
-
+
-
+
-
+
@@ -327,7 +348,7 @@
-
+
@@ -355,14 +376,21 @@
-
+
+
+
+
+
+
+
+
-
+
@@ -383,7 +411,7 @@
-
+
@@ -403,55 +431,59 @@
-
+
-
-
+
+
-
+
-
+
+
-
+
-
-
+
+
+
-
-
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
+
-
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 580b63af..6877262e 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,11 +1,16 @@
-
+
+
+
+
-
-
-
+
+
+
+
+
@@ -33,8 +38,8 @@
-
-
+
+
@@ -42,6 +47,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -64,11 +81,21 @@
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -86,54 +113,22 @@
-
-
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -151,8 +146,6 @@
- streamFil`
- g
group('
group(
group\'
@@ -168,7 +161,6 @@
group\('[^']+'
group\('[^']+',
group\('[^']+', (
- group\('[^']+',
group\('[^']+', \
group\('[^']+', \()
group\('[^']+', \(
@@ -176,11 +168,14 @@
group\('[^']+', \(\) as
group\('[^']+', \(\) a
group\('[^']+', \(\)
- group\('[^']+', \(\)
group\('[^']+', \(\)\s
group\('[^']+', \(\)\s*
group\('[^']+', \(\)\s*a
group\('[^']+', \(\)\s*as
+ _hand
+ _handle
+ handleContaine
+ _handlerC
_isClosed
@@ -229,7 +224,6 @@
-
@@ -245,17 +239,20 @@
-
-
-
-
+
+
+
+
+
+
+
@@ -347,10 +344,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
@@ -379,7 +430,7 @@
-
+
@@ -466,6 +517,16 @@
false
+
+
+
+
+
+
+
+
+
+
@@ -537,31 +598,33 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -605,7 +668,8 @@
-
+
+
1481237183504
@@ -814,39 +878,39 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
@@ -863,14 +927,13 @@
-
+
-
@@ -883,6 +946,7 @@
+
@@ -893,7 +957,6 @@
-
@@ -918,27 +981,14 @@
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -964,7 +1014,6 @@
-
@@ -993,7 +1042,6 @@
-
@@ -1001,7 +1049,6 @@
-
@@ -1009,9 +1056,6 @@
-
-
-
@@ -1078,7 +1122,6 @@
-
@@ -1118,7 +1161,6 @@
-
@@ -1151,7 +1193,6 @@
-
@@ -1162,7 +1203,6 @@
-
@@ -1180,19 +1220,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1200,15 +1227,6 @@
-
-
-
-
-
-
-
-
-
@@ -1216,7 +1234,6 @@
-
@@ -1224,15 +1241,6 @@
-
-
-
-
-
-
-
-
-
@@ -1240,25 +1248,22 @@
-
-
-
-
+
-
+
-
+
@@ -1274,23 +1279,12 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
@@ -1301,19 +1295,13 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
@@ -1327,15 +1315,80 @@
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b44c2ec5..94a98d92 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 1.0.9+1
+* Closed [#162](https://github.com/angel-dart/framework/issues/162), fixing a caching bug
+that would cause multiple requests to the same URL to fail.
+* Resolved dependency injection of primitives (namely `String`), no longer triggering
+errors about `String has no constructor`, etc.
+
# 1.0.9
* Closed [#161](https://github.com/angel-dart/framework/issues/161). `addCreated`/`addUpdatedAt` no longer
crash when `serialize` is `false`.
diff --git a/lib/src/http/controller.dart b/lib/src/http/controller.dart
index beb760dd..811df1de 100644
--- a/lib/src/http/controller.dart
+++ b/lib/src/http/controller.dart
@@ -10,6 +10,8 @@ import 'response_context.dart';
import 'routable.dart';
import 'server.dart' show Angel, preInject;
+const List _primitiveTypes = const [String, int, num, double, Null];
+
/// Contains a list of the data required for a DI-enabled method to run.
///
/// This improves performance by removing the necessity to reflect a method
@@ -186,11 +188,11 @@ RequestHandler handleContained(handler, InjectionRequest injection) {
requirement.last is Type) {
String key = requirement.first;
Type type = requirement.last;
-
if (req.params.containsKey(key) ||
req.injections.containsKey(key) ||
req.properties.containsKey(key) ||
- req.app.properties.containsKey(key)) {
+ req.app.properties.containsKey(key) ||
+ _primitiveTypes.contains(type)) {
inject(key);
} else
inject(type);
diff --git a/lib/src/http/server.dart b/lib/src/http/server.dart
index 0f6dc170..53a445eb 100644
--- a/lib/src/http/server.dart
+++ b/lib/src/http/server.dart
@@ -10,6 +10,7 @@ export 'package:container/container.dart';
import 'package:flatten/flatten.dart';
import 'package:json_god/json_god.dart' as god;
import 'package:meta/meta.dart';
+import 'package:tuple/tuple.dart';
import '../safe_stream_controller.dart';
import 'angel_base.dart';
import 'angel_http_exception.dart';
@@ -28,8 +29,8 @@ final RegExp _straySlashes = new RegExp(r'(^/+)|(/+$)');
typedef Future ServerGenerator(InternetAddress address, int port);
/// Handles an [AngelHttpException].
-typedef Future AngelErrorHandler(AngelHttpException err, RequestContext req,
- ResponseContext res);
+typedef Future AngelErrorHandler(
+ AngelHttpException err, RequestContext req, ResponseContext res);
/// A function that configures an [Angel] server in some way.
typedef Future AngelConfigurer(Angel app);
@@ -37,16 +38,16 @@ typedef Future AngelConfigurer(Angel app);
/// A powerful real-time/REST/MVC server class.
class Angel extends AngelBase {
final SafeCtrl _afterProcessed =
- new SafeCtrl.broadcast();
+ new SafeCtrl.broadcast();
final SafeCtrl _beforeProcessed =
- new SafeCtrl.broadcast();
+ new SafeCtrl.broadcast();
final SafeCtrl _fatalErrorStream =
- new SafeCtrl.broadcast();
+ new SafeCtrl.broadcast();
final SafeCtrl _onController =
- new SafeCtrl.broadcast();
+ new SafeCtrl.broadcast();
final List _children = [];
- final Map _handlerCache = {};
+ final Map> _handlerCache = {};
Router _flattened;
bool _isProduction;
@@ -213,17 +214,17 @@ class Angel extends AngelBase {
await service.close();
});
- for (var plugin in justBeforeStop)
- await plugin(this);
+ for (var plugin in justBeforeStop) await plugin(this);
return server;
}
@override
- void dumpTree({callback(String tree),
- String header: 'Dumping route tree:',
- String tab: ' ',
- bool showMatchers: false}) {
+ void dumpTree(
+ {callback(String tree),
+ String header: 'Dumping route tree:',
+ String tab: ' ',
+ bool showMatchers: false}) {
if (isProduction) {
if (_flattened == null) _flattened = flatten(this);
@@ -232,8 +233,8 @@ class Angel extends AngelBase {
header: header?.isNotEmpty == true
? header
: (isProduction
- ? 'Dumping flattened route tree:'
- : 'Dumping route tree:'),
+ ? 'Dumping flattened route tree:'
+ : 'Dumping route tree:'),
tab: tab ?? ' ',
showMatchers: showMatchers == true);
} else {
@@ -242,8 +243,8 @@ class Angel extends AngelBase {
header: header?.isNotEmpty == true
? header
: (isProduction
- ? 'Dumping flattened route tree:'
- : 'Dumping route tree:'),
+ ? 'Dumping flattened route tree:'
+ : 'Dumping route tree:'),
tab: tab ?? ' ',
showMatchers: showMatchers == true);
}
@@ -264,8 +265,8 @@ class Angel extends AngelBase {
_serializer = serializer;
}
- Future getHandlerResult(handler, RequestContext req,
- ResponseContext res) async {
+ Future getHandlerResult(
+ handler, RequestContext req, ResponseContext res) async {
/*if (handler is RequestMiddleware) {
var result = await handler(req, res);
@@ -303,8 +304,8 @@ class Angel extends AngelBase {
}
/// Runs some [handler]. Returns `true` if request execution should continue.
- Future executeHandler(handler, RequestContext req,
- ResponseContext res) async {
+ Future executeHandler(
+ handler, RequestContext req, ResponseContext res) async {
var result = await getHandlerResult(handler, req, res);
if (result is bool) {
@@ -326,7 +327,7 @@ class Angel extends AngelBase {
}
Future createResponseContext(HttpResponse response,
- [RequestContext correspondingRequest]) =>
+ [RequestContext correspondingRequest]) =>
new Future.value(
new ResponseContext(response, this, correspondingRequest)
..serializer = (_serializer ?? god.serialize)
@@ -403,27 +404,25 @@ class Angel extends AngelBase {
if (requestedUrl.isEmpty) requestedUrl = '/';
- var pipeline = _handlerCache.putIfAbsent(requestedUrl, () {
- Router r =
- isProduction ? (_flattened ?? (_flattened = flatten(this))) : this;
+ var tuple = _handlerCache.putIfAbsent(requestedUrl, () {
+ Router r = isProduction ? (_flattened ??= flatten(this)) : this;
var resolved =
- r.resolveAll(requestedUrl, requestedUrl, method: req.method);
-
- for (var result in resolved)
- req.params.addAll(result.allParams);
-
- if (resolved.isNotEmpty) {
- var route = resolved.first.route;
- req.inject(Match, route.match(requestedUrl));
- }
-
- var m = new MiddlewarePipeline(resolved);
- req.inject(MiddlewarePipeline, m);
-
- return new List.from(before)
- ..addAll(m.handlers)..addAll(after);
+ r.resolveAll(requestedUrl, requestedUrl, method: req.method);
+ return new Tuple3(
+ new MiddlewarePipeline(resolved),
+ resolved.fold