diff --git a/warp/Network/Wai/Handler/Warp/Run.hs b/warp/Network/Wai/Handler/Warp/Run.hs index 858d893a2..0cde00d90 100644 --- a/warp/Network/Wai/Handler/Warp/Run.hs +++ b/warp/Network/Wai/Handler/Warp/Run.hs @@ -386,8 +386,8 @@ serveConnection conn ii th origAddr transport settings app = do if isHTTP2 transport then return (True, "") else do - bs0 <- connRecv conn - if S.length bs0 >= 4 && "PRI " `S.isPrefixOf` bs0 + bs0 <- recv4 "" + if "PRI " `S.isPrefixOf` bs0 then return (True, bs0) else return (False, bs0) if settingsHTTP2Enabled settings && h2 @@ -395,6 +395,18 @@ serveConnection conn ii th origAddr transport settings app = do http2 settings ii conn transport app origAddr th bs else do http1 settings ii conn transport app origAddr th bs + where + recv4 bs0 = do + bs1 <- connRecv conn + if S.null bs1 then + return bs0 + else do + -- In the case where bs0 is "", (<>) is called unnecessarily. + -- But we adopt this logic for simplicity. + let bs2 = bs0 <> bs1 + if S.length bs2 >= 4 + then return bs2 + else recv4 bs2 -- | Set flag FileCloseOnExec flag on a socket (on Unix) --