From 1cb5cdb0bfd14a87fbf96171f25279aeede77c99 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Tue, 9 Mar 2010 00:51:48 -0500 Subject: [PATCH] Clean up range outputting. Signed-off-by: Anders Kaseorg --- StaticCat.hs | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/StaticCat.hs b/StaticCat.hs index f7e4ad8..25be388 100644 --- a/StaticCat.hs +++ b/StaticCat.hs @@ -108,6 +108,23 @@ checkRange mTime size = do Just (a, b) | a <= b -> return $ Just (a, b) _ -> throwExceptionCGI BadRange +outputAll :: Handle -> FileOffset -> CGI CGIResult +outputAll h size = do + setHeader "Content-Length" $ show size + outputFPS =<< liftIO (B.hGetContents h) + +outputRange :: Handle -> FileOffset -> Maybe (FileOffset, FileOffset) -> CGI CGIResult +outputRange h size Nothing = outputAll h size +outputRange h size (Just (a, b)) = do + let len = b - a + 1 + + setStatus 206 "Partial Content" + setHeader "Content-Range" $ + "bytes " ++ show a ++ "-" ++ show b ++ "/" ++ show size + setHeader "Content-Length" $ show len + liftIO $ hSeek h AbsoluteSeek (fromIntegral a) + outputFPS =<< liftIO (B.hGet h (fromIntegral len)) + serveFile :: FilePath -> CGI CGIResult serveFile file = (`catchExceptionCGI` outputMyError) $ do checkExtension file @@ -127,19 +144,8 @@ serveFile file = (`catchExceptionCGI` outputMyError) $ do size = fileSize status checkModified mTime - checkRange mTime size >>= maybe - (do - setHeader "Content-Length" $ show size - outputFPS =<< (liftIO $ B.hGetContents h)) - (\(a, b) -> do - let len = b - a + 1 - - setStatus 206 "Partial Content" - setHeader "Content-Range" $ - "bytes " ++ show a ++ "-" ++ show b ++ "/" ++ show size - setHeader "Content-Length" $ show len - liftIO $ hSeek h AbsoluteSeek (fromIntegral a) - outputFPS =<< (liftIO $ B.hGet h (fromIntegral len))) + range <- checkRange mTime size + outputRange h size range main :: IO () main = runCGI $ handleErrors $ serveFile =<< pathTranslated -- 2.45.0