7Vars = List (String, String)
9record CGIInfo : Set where
10 CGISt : (GET : Vars) ->
13 (UserAgent : String) ->
15 (Output : String) -> CGIInfo
17add_Headers : String -> CGIInfo -> CGIInfo
18add_Headers str st = record { Headers = Headers st ++ str } st
20add_Output : String -> CGIInfo -> CGIInfo
21add_Output str st = record { Output = Output st ++ str } st
24data CGI : Set -> Set where
25 MkCGI : (CGIInfo -> IO (a, CGIInfo)) -> CGI a
27getAction : CGI a -> CGIInfo -> IO (a, CGIInfo)
28getAction (MkCGI act) = act
30instance Monad CGI where {
31 (>>=) (MkCGI f) k = MkCGI (\s => do v <- f s
32 getAction (k (fst v)) (snd v))
34 return v = MkCGI (\s => return (v, s))
37setInfo : CGIInfo -> CGI ()
38setInfo i = MkCGI (\s => return ((), i))
41getInfo = MkCGI (\s => return (s, s))
45lift op = MkCGI (\st => do { x <- op
49output : String -> CGI ()
50output s = do i <- getInfo
51 setInfo (add_Output s i)
55queryVars = do i <- getInfo
60postVars = do i <- getInfo
65cookieVars = do i <- getInfo
69queryVar : String -> CGI (Maybe String)
70queryVar x = do vs <- queryVars
74getOutput = do i <- getInfo
77getHeaders : CGI String
78getHeaders = do i <- getInfo
83flushHeaders = do o <- getHeaders
88flush = do o <- getOutput
91getVars : List Char -> String -> List (String, String)
92getVars seps query = mapMaybe readVar (split (\x => elem x seps) query)
94 readVar : String -> Maybe (String, String)
95 readVar xs with (split (\x => x == '=') xs)
96 | [k, v] = Just (trim k, trim v)
99getContent : Int -> IO String
100getContent x = getC x "" where
101 getC : Int -> String -> IO String
102 getC 0 acc = return $ reverse acc
103 getC n acc = do x <- getChar
104 getC (n-1) (strCons x acc)
107runCGI : CGI a -> IO a
109 clen_in <- getEnv "CONTENT_LENGTH"
110 let clen = prim__strToInt clen_in
111 content <- getContent clen
112 query <- getEnv "QUERY_STRING"
113 cookie <- getEnv "HTTP_COOKIE"
114 agent <- getEnv "HTTP_USER_AGENT"
116 let get_vars = getVars ['&',';'] query
117 let post_vars = getVars ['&'] content
118 let cookies = getVars [';'] cookie
120 (v, st) <- getAction prog (CGISt get_vars post_vars cookies agent
121 "Content-type: text/html\n"
123 putStrLn (Headers st)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list