From 5e508a27e9ae10d1592ca0ba051b86dee20352cf Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Wed, 15 May 2024 16:06:21 +0900 Subject: [PATCH 1/3] ensuring to receive 4 bytes. --- warp/Network/Wai/Handler/Warp/Run.hs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/warp/Network/Wai/Handler/Warp/Run.hs b/warp/Network/Wai/Handler/Warp/Run.hs index 858d893a2..2065f87e4 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 = do + bs0 <- connRecv conn + if S.length bs0 >= 4 + then return bs0 + else loop bs0 + loop bs0 = do + bs1 <- connRecv conn + let bs = bs0 `S.append` bs1 + if S.length bs >= 4 + then return bs + else loop bs -- | Set flag FileCloseOnExec flag on a socket (on Unix) -- From eb7b730677864b07dc3cd66f823840fe10f5c795 Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Wed, 22 May 2024 12:56:29 +0900 Subject: [PATCH 2/3] recv4 breaks if "" is received. --- warp/Network/Wai/Handler/Warp/Run.hs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/warp/Network/Wai/Handler/Warp/Run.hs b/warp/Network/Wai/Handler/Warp/Run.hs index 2065f87e4..e0cd4fd62 100644 --- a/warp/Network/Wai/Handler/Warp/Run.hs +++ b/warp/Network/Wai/Handler/Warp/Run.hs @@ -386,7 +386,7 @@ serveConnection conn ii th origAddr transport settings app = do if isHTTP2 transport then return (True, "") else do - bs0 <- recv4 + bs0 <- recv4 "" if "PRI " `S.isPrefixOf` bs0 then return (True, bs0) else return (False, bs0) @@ -396,17 +396,17 @@ serveConnection conn ii th origAddr transport settings app = do else do http1 settings ii conn transport app origAddr th bs where - recv4 = do - bs0 <- connRecv conn - if S.length bs0 >= 4 - then return bs0 - else loop bs0 - loop bs0 = do + recv4 bs0 = do bs1 <- connRecv conn - let bs = bs0 `S.append` bs1 - if S.length bs >= 4 - then return bs - else loop bs + if S.length bs1 == 0 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) -- From 4247e5ef26175ca5714993761452f76d651a548d Mon Sep 17 00:00:00 2001 From: Kazu Yamamoto Date: Thu, 23 May 2024 08:30:50 +0900 Subject: [PATCH 3/3] using null --- warp/Network/Wai/Handler/Warp/Run.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warp/Network/Wai/Handler/Warp/Run.hs b/warp/Network/Wai/Handler/Warp/Run.hs index e0cd4fd62..0cde00d90 100644 --- a/warp/Network/Wai/Handler/Warp/Run.hs +++ b/warp/Network/Wai/Handler/Warp/Run.hs @@ -398,7 +398,7 @@ serveConnection conn ii th origAddr transport settings app = do where recv4 bs0 = do bs1 <- connRecv conn - if S.length bs1 == 0 then + if S.null bs1 then return bs0 else do -- In the case where bs0 is "", (<>) is called unnecessarily.