strip fragment and userinfo only from gemini urls
[diohsc.git] / Request.hs
blob9ad5d68acea6cde19ea4433b08ecf9e9e3215aff
1 -- This file is part of Diohsc
2 -- Copyright (C) 2020 Martin Bays <mbays@sdf.org>
3 --
4 -- This program is free software: you can redistribute it and/or modify
5 -- it under the terms of version 3 of the GNU General Public License as
6 -- published by the Free Software Foundation, or any later version.
7 --
8 -- You should have received a copy of the GNU General Public License
9 -- along with this program. If not, see http://www.gnu.org/licenses/.
11 {-# LANGUAGE Safe #-}
13 module Request where
15 import Data.List (elemIndices)
16 import Data.Maybe (fromMaybe)
17 import Safe (lastMay, readMay)
19 import URI (URI, escapePathString, nullUri, parseAbsoluteUri)
21 data Host = Host {hostName :: String, hostPort :: Int}
22 deriving (Eq,Ord,Show)
24 showHost :: Host -> String
25 showHost (Host name port) = name ++ ":" ++ show port
27 parseHost :: String -> Maybe Host
28 parseHost s = do
29 i <- lastMay $ elemIndices ':' s
30 (hostname, ':':portStr) <- return $ splitAt i s
31 Host hostname <$> readMay portStr
34 data Request
35 = NetworkRequest {requestHost :: Host, networkRequestUri :: URI}
36 | LocalFileRequest {requestPath :: FilePath}
37 deriving (Eq,Ord,Show)
39 requestUri :: Request -> URI
40 requestUri (NetworkRequest _ uri) = uri
41 requestUri (LocalFileRequest abspath) =
42 fromMaybe nullUri . parseAbsoluteUri $ "file://" <> escapePathString abspath