{-# LANGUAGE NoMonomorphismRestriction#-}

module Hack.Handler.Kibro (run) where

import Hack
import Kibro
import Network.CGI hiding (Html)
import Network.URI
import Data.Default
import Prelude hiding ((.), (^))
import MPS

get_env = do
  uri <- requestURI
  request_method' <- requestMethod
  let script_name' = ""
  let path_info' = uri.uriPath
  let query_string' = uri.uriQuery
  server_name' <- serverName
  server_port' <- serverPort
  hack_input' <- getBody
  
  def 
    {  request_method = request_method'.read
    ,  script_name    = script_name'
    ,  path_info      = path_info'
    ,  query_string   = query_string'.remove_question_mark
    ,  server_name    = server_name'
    ,  server_port    = server_port'
    ,  hack_input     = hack_input'
    }
    .return
  where 
    remove_question_mark = dropWhile (is '?')

handle app = do
  env <- get_env
  response <- app env .liftIO
  
  -- set response
  response.headers.mapM_ (splash setHeader)
  response.status.show.setHeader "Status"
  response.body.output

run :: Application -> IO ()
run app = startKibro [("", handle app)]