@@ -29,6 +29,7 @@ module Network.Wai.Parse
2929#endif
3030 ) where
3131
32+import qualified Data.ByteString.Search as Search
3233import qualified Data.ByteString as S
3334import qualified Data.ByteString.Lazy as L
3435import qualified Data.ByteString.Char8 as S8
@@ -252,8 +253,14 @@ data Bound = FoundBound S.ByteString S.ByteString
252253 deriving (Eq, Show)
253254
254255findBound :: S.ByteString -> S.ByteString -> Bound
255−findBound b bs = go [0..S.length bs - 1]
256+findBound b bs = handleBreak $ Search.breakOn b bs
256257 where
258+ handleBreak (h, t)
259+ | S.null t = go [lowBound..S.length bs - 1]
260+ | otherwise = FoundBound h $ S.drop (S.length b) t
261+
262+ lowBound = max 0 $ S.length bs - S.length b
263+
257264 go [] = NoBound
258265 go (i:is)
259266 | mismatch [0..S.length b - 1] [i..S.length bs - 1] = go is