packages feed

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"
      ]