pkg/shelf: only catch errors in createMiddleware if an errorHandler is provided
BUG= https://code.google.com/p/dart/issues/detail?id=21294
R=nweiz@google.com
Review URL: https://codereview.chromium.org//657543004
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/shelf@41111 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d49e252..f74d437 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.6-dev
+
+* Fixed `createMiddleware` to only catch errors in `errorHandler` is provided.
+
## 0.5.5+1
* Updated `Request.change` to include the original `onHijack` callback if one
diff --git a/lib/src/middleware.dart b/lib/src/middleware.dart
index 228761d..b81b70d 100644
--- a/lib/src/middleware.dart
+++ b/lib/src/middleware.dart
@@ -54,17 +54,21 @@
if (responseHandler == null) responseHandler = (response) => response;
+ var onError = null;
+ if (errorHandler != null) {
+ onError = (error, stackTrace) {
+ if (error is HijackException) throw error;
+ return errorHandler(error, stackTrace);
+ };
+ }
+
return (Handler innerHandler) {
return (request) {
return syncFuture(() => requestHandler(request)).then((response) {
if (response != null) return response;
return syncFuture(() => innerHandler(request))
- .then((response) => responseHandler(response),
- onError: (error, stackTrace) {
- if (error is HijackException) throw error;
- return errorHandler(error, stackTrace);
- });
+ .then((response) => responseHandler(response), onError: onError);
});
};
};
diff --git a/pubspec.yaml b/pubspec.yaml
index 955b4fa..7bf73f1 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: shelf
-version: 0.5.5+1
+version: 0.5.6-dev
author: Dart Team <misc@dartlang.org>
description: Web Server Middleware for Dart
homepage: http://www.dartlang.org
diff --git a/test/create_middleware_test.dart b/test/create_middleware_test.dart
index ee01d07..a743dd5 100644
--- a/test/create_middleware_test.dart
+++ b/test/create_middleware_test.dart
@@ -203,9 +203,21 @@
expect(makeSimpleRequest(handler), throwsA('bad handler'));
});
+ test('error thrown by inner handler without a middleware errorHandler is '
+ 'rethrown', () {
+ var middleware = createMiddleware();
+
+ var handler = const Pipeline().addMiddleware(middleware)
+ .addHandler((request) {
+ throw 'bad handler';
+ });
+
+ expect(makeSimpleRequest(handler), throwsA('bad handler'));
+ });
+
test("doesn't handle HijackException", () {
var middleware = createMiddleware(errorHandler: (error, stack) {
- expect(false, "error handler shouldn't be called");
+ fail("error handler shouldn't be called");
});
var handler = const Pipeline().addMiddleware(middleware)