@@ -68,7 +68,6 @@ import Data.Time
6868import Data.Time.Clock.POSIX
6969import System.Locale (defaultTimeLocale)
7070
71−import Data.List (sortBy)
7271import Data.FileEmbed (embedFile)
7372
7473import qualified Data.Text as T
@@ -252,39 +251,33 @@ checkPieces fileLookup indices pieces cache req
252251 | T.null $ piecePretty (last pieces) -> (False, True)
253252 | otherwise -> (True, False)
254253
255− if not isFile then uncached isFile isFolder
256− else
257− case cache of
258− ETag ioLookup -> do
259− -- No support for If-Match
260− let mlastEtag = lookup "If-None-Match" (W.requestHeaders req)
261− metag <- ioLookup fp
262− case debug (metag, mlastEtag) of
263− (Just hash, Just lastHash) | hash == lastHash -> return NotModified
264− _ -> trace "ETAG: no cache match" uncached isFile isFolder
265− Forever isStaticFile ->
266− if isStaticFile fp (S8.drop 1 $ W.rawQueryString req) &&
267− (isJust $ lookup "If-Modified-Since" (W.requestHeaders req)) &&
268− (isNothing $ lookup "If-Unmodified-Since" (W.requestHeaders req))
269− then return NotModified
270− else trace "Static: no cache match" uncached isFile isFolder
271− NoCache -> trace "NoCache" uncached isFile isFolder
272−
273−
254+ fl <- fileLookup pieces
255+ case (fl, isFile) of
256+ (FLDoesNotExist, _) -> return NotFound
257+ (FLFile file, True) -> handleCache file cache
258+ (FLFile{}, False) -> return $ Redirect $ init pieces
259+ (FLFolder folder@(Folder contents), _) -> do
260+ case checkIndices $ map feName $ filter feIsFile contents of
261+ Just index -> return $ Redirect $ setLast pieces $ Piece (T.unpack index) index
262+ Nothing ->
263+ if isFolder
264+ then return $ DirectoryResponse folder
265+ else return $ Redirect $ pieces ++ [Piece "" ""]
274266 where
275− uncached isFile isFolder = do
276− fl <- fileLookup pieces
277− case (fl, isFile) of
278− (FLDoesNotExist, _) -> return NotFound
279− (FLFile file, True) -> return $ FileResponse file
280− (FLFile{}, False) -> return $ Redirect $ init pieces
281− (FLFolder folder@(Folder contents), _) -> do
282− case checkIndices $ map feName $ filter feIsFile contents of
283− Just index -> return $ Redirect $ setLast pieces $ Piece (T.unpack index) index
284− Nothing ->
285− if isFolder
286− then return $ DirectoryResponse folder
287− else return $ Redirect $ pieces ++ [Piece "" ""]
267+ handleCache file NoCache = trace "NoCache" $ return (FileResponse file)
268+ handleCache file (ETag ioLookup) = do
269+ -- No support for If-Match
270+ let mlastEtag = lookup "If-None-Match" (W.requestHeaders req)
271+ metag <- ioLookup file
272+ case debug (metag, mlastEtag) of
273+ (Just hash, Just lastHash) | hash == lastHash -> return NotModified
274+ _ -> trace "ETAG: no cache match" (return $ FileResponse file)
275+ handleCache file (Forever isStaticFile) = do
276+ if isStaticFile file (S8.drop 1 $ W.rawQueryString req) &&
277+ (isJust $ lookup "If-Modified-Since" (W.requestHeaders req)) &&
278+ (isNothing $ lookup "If-Unmodified-Since" (W.requestHeaders req))
279+ then return NotModified
280+ else trace "Static: no cache match" (return $ FileResponse file)
288281
289282 setLast [] x = [x]
290283 setLast [Piece "" ""] x = [x]
@@ -517,12 +510,14 @@ staticAppPieces ss@StaticSettings{} pieces req = liftIO $ do
517510 Redirect pieces' -> do
518511 let loc = (ssMkRedirect ss) pieces' $ toByteString (H.encodePathSegments $ map piecePretty pieces')
519512
513+ {- FIXME seems unnecessary
520514 let loc' =
521515 -- relativeDirFromPieces pieces = T.concat $ map (const "../") (drop 1 pieces) -- last piece is not a dir
522516 -- (ssMkRedirect ss) pieces' $ encodePathInfo pieces' []
523517 toByteString $
524518 foldr mappend (H.encodePathSegments $ map piecePretty pieces') -- FIXME is this correct?
525519 $ map (const $ copyByteString "../") $ drop 1 pieces
520+ -}
526521 return $ W.responseLBS H.status301
527522 [ ("Content-Type", "text/plain")
528523 , ("Location", loc)