0 | module Network.URL.HTTP.Parser
11 | import Network.URL.HTTP.Data
12 | import Network.URL.Internal.StringParser
13 | import Network.URL.Internal.Predicate
14 | import Data.String.Parser
17 | validaId : Char -> Bool
18 | validaId = anyPass [isAlphaNum, (== '+'), (== '-'), (== '.')]
21 | parserScheme : Parser String
23 | schemeHead <- letter
24 | schemeTail <- takeWhile validaId
26 | pure $
singleton schemeHead ++ schemeTail
29 | parserHost : Parser String
36 | validatePort : Int -> Maybe Int
37 | validatePort p = if p >= 0 && p <= 65535 then Just p else Nothing
40 | parserPort : Parser Int
44 | case validatePort p of
45 | Just validPort => pure validPort
46 | Nothing => fail "Port number must be between 0 and 65535"
49 | parserPathItem : Parser String
52 | s <- takeWhile $
allPass [(/= '/'), (/= '?'), (/= '#')]
56 | parserPath : Parser String
58 | s <- some parserPathItem
62 | parserQueryItem : Parser QueryParam
63 | parserQueryItem = do
64 | s <- sepBy1 (takeWhile $
allPass [(/= '#'), (/= '&'), (/= '=')]) (token "=")
66 | (k ::: Nil) => pure (k, "")
67 | (k ::: vs) => pure (k, joinBy "" vs)
71 | parserQuery : Parser (List QueryParam)
74 | l <- sepBy1 parserQueryItem $
token "&"
78 | parserFragment : Parser String
81 | takeWhile (\t => True)
84 | url : Parser HTTPURL
86 | scheme <- parserScheme
87 | content <- parserHost
88 | port <- optional parserPort
89 | path <- option "/" parserPath
90 | query <- option [] parserQuery
91 | fragment <- optional parserFragment
93 | pure $
MkHTTPURL scheme content port path query fragment
97 | parse : String -> Maybe HTTPURL
98 | parse str = case parse url str of
99 | Right (j,_) => Just j
103 | stringify : HTTPURL -> String
104 | stringify (MkHTTPURL scheme host port path query fragment) = scheme
105 | ++ "://" ++ host ++ port'
106 | ++ path ++ query' ++ fragment'
109 | port' = case port of
111 | (Just p) => ":" ++ show p
114 | query' = case query of
116 | xs => "?" ++ (joinBy "&" $
map (\(a,b) => a ++ "=" ++ b) xs)
119 | fragment' = case fragment of
121 | (Just f) => "#" ++ f