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 MPSUTF8
import System.IO

run :: Application -> IO ()
run app' = startKibro [("", handle app')]
  where
    
    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'
        ,  hack_errors    = \x -> hPutStr stderr (x.u2b)
        }
        .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