support index
This commit is contained in:
parent
9a145bb042
commit
74803a76ca
54
Gemini.hs
54
Gemini.hs
|
@ -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"
|
||||||
|
|
6
Vger.hs
6
Vger.hs
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue