packages feed

chu2-2012.11.20: src/Chu2.agda

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 ⊤