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)