@@ -329,12 +329,6 @@ data Folder = Folder
329 , folderContents :: [Either Folder File] -- FIXME remove?
329 , folderContents :: [Either Folder File] -- FIXME remove?
332−data FolderEntry = FolderEntry -- FIXME remove
335− --, feGetMetaData :: IO (Maybe MetaData)
338data File = File
332data File = File
339 { fileGetSize :: Int
333 { fileGetSize :: Int
340 , fileToResponse :: H.Status -> H.ResponseHeaders -> W.Response
334 , fileToResponse :: H.Status -> H.ResponseHeaders -> W.Response
@@ -374,24 +368,27 @@ defaultStaticSettings = StaticSettings
374 , ssMaxAge = MaxAgeSeconds $ 60 * 60
368 , ssMaxAge = MaxAgeSeconds $ 60 * 60
371+fileHelper :: FilePath -> T.Text -> IO File
372+fileHelper fp name = do
373+ fs <- getFileStatus fp
375+ { fileGetSize = fromIntegral $ fileSize fs
376+ , fileToResponse = \s h -> W.ResponseFile s h fp Nothing
378+ , fileGetHash = Just $ do
379+ -- FIXME replace lazy IO with enumerators
380+ -- FIXME let's use a dictionary to cache these values?
383+ , fileGetModified = Just $ modificationTime fs
377fileSystemLookup :: FilePath -> Pieces -> IO FileLookup
386fileSystemLookup :: FilePath -> Pieces -> IO FileLookup
378fileSystemLookup prefix pieces = do
387fileSystemLookup prefix pieces = do
379 let fp = pathFromPieces prefix pieces
388 let fp = pathFromPieces prefix pieces
380 fe <- doesFileExist fp
389 fe <- doesFileExist fp
383− fs <- getFileStatus fp
384− return $ Just $ Right File
385− { fileGetSize = fromIntegral $ fileSize fs
386− , fileToResponse = \s h -> W.ResponseFile s h fp Nothing
387− , fileName = piecePretty $ last pieces
391+ then fmap (Just . Right) $ fileHelper fp (piecePretty $ last pieces)
388− , fileGetHash = Just $ do
389− -- FIXME replace lazy IO with enumerators
390− -- FIXME let's use a dictionary to cache these values?
393− , fileGetModified = Just $ modificationTime fs
396 de <- doesDirectoryExist fp
393 de <- doesDirectoryExist fp
@@ -404,19 +401,7 @@ fileSystemLookup prefix pieces = do
404 let fp' = fp ++ '/' : name
401 let fp' = fp ++ '/' : name
405 fe' <- doesFileExist fp'
402 fe' <- doesFileExist fp'
407− then do
404+ then fmap Right $ fileHelper fp' name'
408− fs <- getFileStatus fp'
410− { fileGetSize = fromIntegral $ fileSize fs
411− , fileToResponse = \s h -> W.ResponseFile s h fp' Nothing
413− , fileGetHash = Just $ do
414− -- FIXME replace lazy IO with enumerators
415− -- FIXME let's use a dictionary to cache these values?
418− , fileGetModified = Just $ modificationTime fs
420 else return $ Left $ Folder name' [])
405 else return $ Left $ Folder name' [])
421 return $ Just $ Left $ Folder (error "413") entries
406 return $ Just $ Left $ Folder (error "413") entries
422 else return Nothing
407 else return Nothing
@@ -543,14 +528,6 @@ staticAppPieces ss pieces req = liftIO $ do
543 Redirect pieces' -> do
528 Redirect pieces' -> do
544 let loc = (ssMkRedirect ss) pieces' $ toByteString (H.encodePathSegments $ map piecePretty pieces')
529 let loc = (ssMkRedirect ss) pieces' $ toByteString (H.encodePathSegments $ map piecePretty pieces')
546− {- FIXME seems unnecessary
548− -- relativeDirFromPieces pieces = T.concat $ map (const "../") (drop 1 pieces) -- last piece is not a dir
549− -- (ssMkRedirect ss) pieces' $ encodePathInfo pieces' []
551− foldr mappend (H.encodePathSegments $ map piecePretty pieces') -- FIXME is this correct?
552− $ map (const $ copyByteString "../") $ drop 1 pieces
554 return $ W.responseLBS H.status301
531 return $ W.responseLBS H.status301
555 [ ("Content-Type", "text/plain")
532 [ ("Content-Type", "text/plain")
556 , ("Location", loc)
533 , ("Location", loc)
@@ -561,21 +538,6 @@ staticAppPieces ss pieces req = liftIO $ do
561 NotFound -> return $ W.responseLBS H.status404
538 NotFound -> return $ W.responseLBS H.status404
562 [ ("Content-Type", "text/plain")
539 [ ("Content-Type", "text/plain")
563 ] "File not found"
540 ] "File not found"
566− -- expires header: formatTime "%a, %d-%b-%Y %X GMT"
567− setCacheHeaders :: CacheSettings -> File -> IO H.ResponseHeaders
568− setCacheHeaders (Forever isStaticFile) fp = return $
569− if isStaticFile fp (S8.drop 1 $ W.rawQueryString req)
570− then [("Cache-Control", S8.append "max-age=" $ S8.pack $ show oneYear)]
572− setCacheHeaders NoCache _ = return []
573− setCacheHeaders (ETag ioLookup) fp = do
575− return $ case etag of
576− Just hash -> [("ETag", hash)]
581The problem is that the System.Directory functions are a lie: they
543The problem is that the System.Directory functions are a lie: they
@@ -628,7 +590,7 @@ defaultListing pieces (Folder _ contents) = do
628 , "a { text-decoration: none }"
590 , "a { text-decoration: none }"
630 H.body $ do
592 H.body $ do
631− H.h1 $ showFolder $ map (T.unpack . piecePretty) $ filter (not . T.null . piecePretty) pieces -- FIXME don't unpack
593+ H.h1 $ showFolder $ map piecePretty $ filter (not . T.null . piecePretty) pieces
632 renderDirectoryContentsTable haskellSrc folderSrc fps''
594 renderDirectoryContentsTable haskellSrc folderSrc fps''
634 image x = T.unpack $ T.concat [(relativeDirFromPieces pieces), ".hidden/", x, ".png"]
596 image x = T.unpack $ T.concat [(relativeDirFromPieces pieces), ".hidden/", x, ".png"]