support index

This commit is contained in:
Solene Rapenne 2022-08-17 12:35:44 +02:00
parent 9a145bb042
commit 74803a76ca
2 changed files with 46 additions and 14 deletions

View File

@ -6,14 +6,15 @@ import Network.Mime
import System.Directory (doesFileExist, doesDirectoryExist) import System.Directory (doesFileExist, doesDirectoryExist)
import Text.Regex import Text.Regex
import Text.Regex.PCRE import Text.Regex.PCRE
import Control.Exception
-- check :: FilePath -> IO Bool getFile :: FilePath -> IO (Maybe String)
-- check s = do getFile s = do
-- result <- doesFileExist result <- try (readFile s) :: IO (Either SomeException String)
-- if result case result of
-- then pure True Left ex -> return Nothing
-- else pure False Right ex -> return (pure ex)
-- return components of the url -- return components of the url
-- gemini:// | hostname | uri | ? | query -- gemini:// | hostname | uri | ? | query
@ -43,6 +44,12 @@ data Gemini = MkGemini
{ domain :: String { domain :: String
, file :: String , file :: String
, query :: String , query :: String
}
data Answer = MkAnswer
{ code :: Int
, lang :: String
, content :: String
, mime :: String , mime :: String
} }
@ -59,11 +66,36 @@ parse_to_gemini tab =
{ domain = tab!!0!!2 { domain = tab!!0!!2
, file = tab!!0!!3 , file = tab!!0!!3
, query = tab!!0!!5 , query = tab!!0!!5
, mime = get_mime (tab!!0!!3)
} }
get_reply :: String -> Int -> String -> String create_answer :: Gemini -> String -> String -> IO Answer
get_reply mime return lang create_answer (MkGemini domain file query) language basedir = do
| lang /= "" = "20 " ++ mime ++ "; lang=" ++ lang ++ " \r\n" content <- getFile $ basedir ++ file
| lang == "" = "20 " ++ mime ++ "; \r\n" 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" | otherwise = "50\r\n"

View File

@ -28,6 +28,6 @@ main = do
options <- execParser opts options <- execParser opts
url <- get_request url <- get_request
let request = parse_to_gemini (parse_url url) let request = parse_to_gemini (parse_url url)
content <- read_file pathname answer <- create_answer request (language options) (baseDir options)
putStr (get_reply (mime request) 20 (language options)) putStr (make_reply answer)
putStr content putStr (content answer)