module Chu2 where open import Data.List using (List; [_]) open import Data.String using (String) open import Data.Product using (Σ; _,_) -- HTTP Field = String KV = Σ Field (\_ → Field) Header = KV Headers = List Header data RequestMethod : Set where OPTIONS : RequestMethod GET : RequestMethod HEAD : RequestMethod POST : RequestMethod PUT : RequestMethod DELETE : RequestMethod TRACE : RequestMethod CONNECT : RequestMethod data Chu2UrlScheme : Set where HTTP HTTPS : Chu2UrlScheme ScriptName = Field PathInfo = Field QueryField = Field ServerName = Field ServerPort = Field HttpHeaders = Headers Chu2Input = Field Chu2Headers = Headers record Env : Set where constructor env field requestMethod : RequestMethod scriptName : ScriptName pathInfo : PathInfo queryField : QueryField serverName : ServerName serverPort : ServerPort httpHeaders : HttpHeaders chu2UrlScheme : Chu2UrlScheme chu2Input : Chu2Input chu2Headers : Chu2Headers data Status : Set where OK : Status Created : Status Accepted : Status NoContent : Status MultipleChoices : Status MovedPermanently : Status SeeOther : Status NotModified : Status MovedTemporarily : Status BadRequest : Status Unauthorized : Status Forbidden : Status NotFound : Status MethodNotAllowed : Status NotAcceptable : Status Conflict : Status Gone : Status PreconditionFailed : Status RequestEntityTooLarge : Status RequestURItooLong : Status UnsupportedMediaType : Status NotImplemented : Status ServiceUnavailable : Status Body = Field record Response : Set where constructor response field status : Status headers : Headers body : Body default-response : Response default-response = record { status = OK ; headers = [("Content-Type", "text/plain; charset=utf-8")] ; body = "Chu2!" } -- Interface open import IO using (IO) open import Data.Unit using (⊤) Application = Env → IO Response Middleware = Application → Application Handler = Application → IO ⊤