hsp-0.2: CGI/CGIEnv.hs
module CGI.CGIEnv (
CGIEnv,
CGIVariable,
getCGIVars
) where
import System.Environment (getEnv)
import System.IO.Error (isDoesNotExistError)
import Control.Exception (Exception(..), catch, throw)
import Prelude hiding (catch)
type CGIEnv = ([CGIVariable],RequestBody)
type CGIVariable = (VariableName, Value)
type VariableName = String
type Value = String
type RequestBody = String
getCGIVars :: IO CGIEnv
getCGIVars = do f <- mapM getCGIVar cgiVars
s <- getContents
return (f,s)
getCGIVar :: VariableName -> IO CGIVariable
getCGIVar name
= do vv <- catch (getEnv name) handleException
return $ (name, vv)
where
handleException :: Exception -> IO Value
handleException (IOException e)
| isDoesNotExistError e = return ""
handleException e = throw e
cgiVars :: [VariableName]
cgiVars
= [
-- environment variables as specified by CGI/1.1
"SERVER_SOFTWARE"
, "SERVER_NAME"
, "GATEWAY_INTERFACE"
, "SERVER_PROTOCOL"
, "SERVER_PORT"
, "REQUEST_METHOD"
, "PATH_INFO"
, "PATH_TRANSLATED"
, "SCRIPT_NAME"
, "QUERY_STRING"
, "REMOTE_HOST"
, "REMOTE_ADDR"
, "AUTH_TYPE"
, "REMOTE_USER"
, "REMOTE_IDENT"
, "CONTENT_TYPE"
, "CONTENT_LENGTH"
-- environment variables for general HTTP headers, rfc2616
, "HTTP_CACHE_CONTROL"
, "HTTP_CONNECTION"
, "HTTP_DATE"
, "HTTP_PRAGMA"
, "HTTP_TRAILER"
, "HTTP_TRANSFER_ENCODING"
, "HTTP_UPGRADE"
, "HTTP_VIA"
, "HTTP_WARNING"
-- environment variables for request HTTP headers, rfc2616
, "HTTP_ACCEPT"
, "HTTP_ACCEPT_CHARSET"
, "HTTP_ACCEPT_ENCODING"
, "HTTP_ACCECPT_LANGUAGE"
, "HTTP_AUTHORIZATION"
, "HTTP_EXPECT"
, "HTTP_FROM"
, "HTTP_HOST"
, "HTTP_IF_MATCH"
, "HTTP_IF_MODIFIED_SINCE"
, "HTTP_IF_NONE_MATCH"
, "HTTP_IF_RANGE"
, "HTTP_IF_UNMODIFIED_SINCE"
, "HTTP_MAX_FORWARDS"
, "HTTP_PROXY_AUTHORIZATION"
, "HTTP_RANGE"
, "HTTP_REFERER"
, "HTTP_TE"
, "HTTP_USER_AGENT"
-- environment variable for request HTTP header "Cookie", rfc 2109
, "HTTP_COOKIE"
]