packages feed

warp 2.1.4 → 2.1.4.1

raw patch · 2 files changed

+37/−19 lines, 2 files

Files

Network/Wai/Handler/Warp/Response.hs view
@@ -57,28 +57,35 @@ -- $setup -- >>> :set -XOverloadedStrings +mapRight :: (b -> c) -> Either a b -> Either a c+mapRight f eith = case eith of+    Right x -> Right (f x)+    Left l -> Left l+ ----------------------------------------------------------------  fileRange :: H.Status -> H.ResponseHeaders -> FilePath            -> Maybe FilePart -> Maybe HeaderValue-          -> IO (Either SomeException+          -> IO (Either IOException                         (H.Status, H.ResponseHeaders, Integer, Integer))-fileRange s0 hs0 path mPart mRange = try $ do-    fileSize <- checkFileSize mPart-    let (beg, end, len, isEntire) = checkPartRange fileSize mPart mRange-    let hs1 = addContentLength len hs0-        hs | isEntire  = hs1-           | otherwise = addContentRange beg end fileSize hs1-        s  | isEntire  = s0-           | otherwise = H.status206-    return (s, hs, beg, len)+fileRange s0 hs0 path mPart mRange =+    mapRight (fileRangeSized . fromIntegral . P.fileSize) <$>+        try (P.getFileStatus path)  where-    checkFileSize Nothing = fromIntegral . P.fileSize <$> P.getFileStatus path-    checkFileSize (Just part) = return $ filePartFileSize part+    fileRangeSized :: Integer -> (H.Status, H.ResponseHeaders, Integer, Integer)+    fileRangeSized fileSize =+        let (beg, end, len, isEntire) = checkPartRange fileSize mPart mRange+            hs1 = addContentLength len hs0+            hs | isEntire  = hs1+               | otherwise = addContentRange beg end fileSize hs1+            s  | isEntire  = s0+               | otherwise = H.status206+        in  (s, hs, beg, len) + checkPartRange :: Integer -> Maybe FilePart -> Maybe HeaderValue                -> (Integer, Integer, Integer, Bool)-checkPartRange fileSize mPart mRange = checkPart mPart mRange+checkPartRange fileSize = checkPart   where     checkPart Nothing Nothing = (0, fileSize - 1, fileSize, True)     checkPart Nothing (Just range) = case parseByteRanges range >>= listToMaybe of@@ -184,10 +191,10 @@         ResponseSource _ _ fb       -> RspSource fb needsChunked th         ResponseRaw raw _           -> RspRaw raw leftover' (T.tickle th)     ret = case response of-        ResponseFile _ _ _ _  -> isPersist-        ResponseBuilder _ _ _ -> isKeepAlive-        ResponseSource _ _ _  -> isKeepAlive-        ResponseRaw _ _       -> False+        ResponseFile    {} -> isPersist+        ResponseBuilder {} -> isKeepAlive+        ResponseSource  {} -> isKeepAlive+        ResponseRaw     {} -> False  ---------------------------------------------------------------- @@ -208,7 +215,11 @@ sendRsp conn ver s0 hs0 restore (RspFile path mPart mRange hook) = restore $ do     ex <- fileRange s0 hs path mPart mRange     case ex of-        Left _ -> sendRsp conn ver s2 hs2 id (RspBuilder body True)+        Left _ex ->+#ifdef WARP_DEBUG+          print _ex >>+#endif+          sendRsp conn ver s2 hs2 id (RspBuilder body True)         Right (s, hs1, beg, len) -> do             lheader <- composeHeader ver s hs1             connSendFile conn path beg len hook [lheader]
warp.cabal view
@@ -1,5 +1,5 @@ Name:                warp-Version:             2.1.4+Version:             2.1.4.1 Synopsis:            A fast, light-weight web server for WAI applications. License:             MIT License-file:        LICENSE@@ -31,6 +31,10 @@     Description: Allow use of sendfileFd (not available on GNU/kFreeBSD)     Default:     True +Flag warp-debug+    Description: print debug output. not suitable for production+    Default:     False+ Library   Build-Depends:     base                      >= 3        && < 5                    , array@@ -79,6 +83,9 @@                      Network.Wai.Handler.Warp.Types                      Paths_warp   Ghc-Options:       -Wall++  if flag(warp-debug)+      Cpp-Options:   -DWARP_DEBUG   if (os(linux) || os(freebsd) || os(darwin)) && flag(allow-sendfilefd)       Cpp-Options:   -DSENDFILEFD       Build-Depends: hashable