From 74803a76caa1f1679f315b6137c95b8f74368924 Mon Sep 17 00:00:00 2001 From: Solene Rapenne Date: Wed, 17 Aug 2022 12:35:44 +0200 Subject: [PATCH] support index --- Gemini.hs | 54 +++++++++++++++++++++++++++++++++++++++++++----------- Vger.hs | 6 +++--- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/Gemini.hs b/Gemini.hs index 9f455b5..e85615c 100644 --- a/Gemini.hs +++ b/Gemini.hs @@ -6,14 +6,15 @@ import Network.Mime import System.Directory (doesFileExist, doesDirectoryExist) import Text.Regex import Text.Regex.PCRE +import Control.Exception --- check :: FilePath -> IO Bool --- check s = do --- result <- doesFileExist --- if result --- then pure True --- else pure False +getFile :: FilePath -> IO (Maybe String) +getFile s = do + result <- try (readFile s) :: IO (Either SomeException String) + case result of + Left ex -> return Nothing + Right ex -> return (pure ex) -- return components of the url -- gemini:// | hostname | uri | ? | query @@ -43,6 +44,12 @@ data Gemini = MkGemini { domain :: String , file :: String , query :: String + } + +data Answer = MkAnswer + { code :: Int + , lang :: String + , content :: String , mime :: String } @@ -59,11 +66,36 @@ parse_to_gemini tab = { domain = tab!!0!!2 , file = tab!!0!!3 , query = tab!!0!!5 - , mime = get_mime (tab!!0!!3) } -get_reply :: String -> Int -> String -> String -get_reply mime return lang - | lang /= "" = "20 " ++ mime ++ "; lang=" ++ lang ++ " \r\n" - | lang == "" = "20 " ++ mime ++ "; \r\n" +create_answer :: Gemini -> String -> String -> IO Answer +create_answer (MkGemini domain file query) language basedir = do + content <- getFile $ basedir ++ file + case content of + Just x -> return (MkAnswer + { code = 20 + , lang = language + , mime = get_mime file + , content = x + }) + Nothing -> do + content' <- getFile $ basedir ++ file ++ "/index.gmi" + case content' of + Just y -> return (MkAnswer + { code = 20 + , lang = language + , mime = get_mime $ file ++ "/index.gmi" + , content = y + }) + Nothing -> return (MkAnswer + { code = 50 + , lang = language + , mime = "" + , content = "error ici " ++ basedir ++ file ++ "/index.gmi" + }) + +make_reply :: Answer -> String +make_reply (MkAnswer code lang content mime) + | lang /= "" = (show code) ++ " " ++ mime ++ "; lang=" ++ lang ++ " \r\n" + | lang == "" = (show code) ++ " " ++ mime ++ "; \r\n" | otherwise = "50\r\n" diff --git a/Vger.hs b/Vger.hs index efce4f2..614510b 100644 --- a/Vger.hs +++ b/Vger.hs @@ -28,6 +28,6 @@ main = do options <- execParser opts url <- get_request let request = parse_to_gemini (parse_url url) - content <- read_file pathname - putStr (get_reply (mime request) 20 (language options)) - putStr content + answer <- create_answer request (language options) (baseDir options) + putStr (make_reply answer) + putStr (content answer)