diff --git a/Network/Wai/Handler/Warp.hs b/Network/Wai/Handler/Warp.hs
--- a/Network/Wai/Handler/Warp.hs
+++ b/Network/Wai/Handler/Warp.hs
@@ -221,6 +221,7 @@
     | BadFirstLine String
     | NonHttp
     | IncompleteHeaders
+    | ConnectionClosedByPeer
     | OverLargeHeader
     deriving (Show, Typeable, Eq)
 instance Exception InvalidRequest
@@ -499,7 +500,7 @@
 
 takeHeaders :: E.Iteratee ByteString IO [ByteString]
 takeHeaders = do
-  !x <- forceHead
+  !x <- forceHead ConnectionClosedByPeer
   takeHeaders' 0 id id x
 
 {-# INLINE takeHeaders #-}
@@ -517,7 +518,7 @@
        -- no newline.  prepend entire bs to next line
        !Nothing -> {-# SCC "takeHeaders'.noNewline" #-} do
          let !len' = len + bsLen
-         !more <- forceHead 
+         !more <- forceHead IncompleteHeaders
          takeHeaders' len' lines (prepend . (:) bs) more
        Just !nl -> {-# SCC "takeHeaders'.newline" #-} do
          let !end = nl 
@@ -546,15 +547,15 @@
               !more <- {-# SCC "takeHeaders'.more" #-} 
                        if start < bsLen
                           then return $! SU.unsafeDrop start bs
-                          else forceHead
+                          else forceHead IncompleteHeaders
               {-# SCC "takeHeaders'.takeMore" #-} takeHeaders' len' lines' id more
 {-# INLINE takeHeaders' #-}
 
-forceHead :: E.Iteratee ByteString IO ByteString
-forceHead = do
+forceHead :: InvalidRequest -> E.Iteratee ByteString IO ByteString
+forceHead err = do
   !mx <- EL.head
   case mx of
-       !Nothing -> E.throwError IncompleteHeaders
+       !Nothing -> E.throwError err
        Just !x -> return x
 {-# INLINE forceHead #-}
 
diff --git a/warp.cabal b/warp.cabal
--- a/warp.cabal
+++ b/warp.cabal
@@ -1,5 +1,5 @@
 Name:                warp
-Version:             0.4.4
+Version:             0.4.5
 Synopsis:            A fast, light-weight web server for WAI applications.
 License:             BSD3
 License-file:        LICENSE
