module Hack where
import Data.Default
import System.IO
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString as B
type Application = Env -> IO Response
type Middleware = Application -> Application
data RequestMethod =
OPTIONS
| GET
| HEAD
| POST
| PUT
| DELETE
| TRACE
| CONNECT
deriving (Show, Read, Eq)
data Hack_UrlScheme = HTTP | HTTPS deriving (Show, Eq)
type HackErrors = String -> IO ()
instance Show HackErrors where
show _ = "Error Stream"
data Env = Env
{ requestMethod :: RequestMethod
, scriptName :: String
, pathInfo :: String
, queryString :: String
, serverName :: String
, serverPort :: Int
, http :: [(String, String)]
, hackVersion :: [Int]
, hackUrlScheme :: Hack_UrlScheme
, hackInput :: L.ByteString
, hackErrors :: HackErrors
, hackHeaders :: [(String, String)]
, hackCache :: [(B.ByteString, B.ByteString)]
}
deriving (Show)
data Response = Response
{ status :: Int
, headers :: [(String, String)]
, body :: L.ByteString
}
deriving (Show)
instance Default RequestMethod where
def = GET
instance Default Hack_UrlScheme where
def = HTTP
instance Default Response where
def = Response def def L.empty
instance Default Env where
def = Env {
requestMethod = def
, scriptName = def
, pathInfo = def
, queryString = def
, serverName = def
, serverPort = def
, http = def
, hackVersion = currentVersion
, hackUrlScheme = def
, hackInput = L.empty
, hackErrors = defaultErrorStream
, hackHeaders = def
, hackCache = def
}
where
defaultErrorStream = (hPutStr stderr)
currentVersion = [2009, 7, 15]