diff --git a/http-kit.cabal b/http-kit.cabal
--- a/http-kit.cabal
+++ b/http-kit.cabal
@@ -1,5 +1,5 @@
 name:             http-kit
-version:          0.2.2
+version:          0.3.0
 synopsis:         A low-level HTTP library
 description:      A low-level HTTP library that can be used to build more
                   sophisticated applications on top of it.
diff --git a/src/Network/HTTP/Toolkit/Header.hs b/src/Network/HTTP/Toolkit/Header.hs
--- a/src/Network/HTTP/Toolkit/Header.hs
+++ b/src/Network/HTTP/Toolkit/Header.hs
@@ -83,28 +83,26 @@
 readHeaderLines n c = go n
   where
     go limit = do
-      (newLimit, bs) <- readLine c limit
-      if B.null bs then return [] else (bs :) <$> go newLimit
+      bs <- readHeaderLine c limit
+      if B.null bs then return [] else (bs :) <$> go (limit - B.length bs)
 
 -- | The default message header size limit of 65536 bytes (64 KB).
 defaultHeaderSizeLimit :: Limit
 defaultHeaderSizeLimit = 64 * 1024
 
-readLine :: Connection -> Limit -> IO (Limit, ByteString)
-readLine c = fmap (\(n, xs) -> (n, stripCR xs)) . go
+readHeaderLine :: Connection -> Limit -> IO ByteString
+readHeaderLine c = fmap stripCR . go
   where
     go limit = do
+      when (limit < 0) (throwIO HeaderTooLarge)
       bs <- connectionRead c
-      let n = B.length bs
-          newLimit = limit - n
-      when (newLimit < 0) (throwIO HeaderTooLarge)
       case B.break (== '\n') bs of
         (xs, "") -> do
-          (ll, ys) <- go newLimit
-          return (ll, xs `B.append` ys)
+          ys <- go (limit - B.length xs)
+          return (xs `B.append` ys)
         (xs, ys) -> do
           connectionUnread c (B.drop 1 ys)
-          return (newLimit, xs)
+          return xs
     stripCR bs
       | (not . B.null) bs && B.last bs == '\r' = B.init bs
       | otherwise = bs
