module Network.HTTP.Lucu.Httpd
- ( ResourceTable
- , mkResourceTable -- [ ([String], Resource ()) ] -> ResourceTable
- , runHttpd -- Config -> ResourceTable -> IO ()
+ ( runHttpd -- Config -> ResTree -> IO ()
)
where
import Control.Concurrent
+import Control.Concurrent.STM
import qualified Data.ByteString.Lazy.Char8 as B
import Data.ByteString.Lazy.Char8 (ByteString)
-import Data.Map as M
-import Data.Map (Map)
import Network
import Network.HTTP.Lucu.Config
-import Network.HTTP.Lucu.Parser
-import Network.HTTP.Lucu.Request
+import Network.HTTP.Lucu.Interaction
+import Network.HTTP.Lucu.RequestReader
import Network.HTTP.Lucu.Resource
-import Network.HTTP.Lucu.Response
+import Network.HTTP.Lucu.ResponseWriter
import System.IO
-type ResourceTable = Map [String] (Resource ())
-
-
-mkResourceTable :: [ ([String], Resource ()) ] -> ResourceTable
-mkResourceTable = M.fromList
-
-
-runHttpd :: Config -> ResourceTable -> IO ()
+runHttpd :: Config -> ResTree -> IO ()
runHttpd cnf table
= withSocketsDo $
do so <- listenOn (cnfServerPort cnf)
where
loop :: Socket -> IO ()
loop so
- = do (h, host, port) <- accept so
- forkIO $ service h host port
+ = do (h, host, _) <- accept so
+ tQueue <- newInteractionQueue
+ readerTID <- forkIO $ requestReader cnf table h host tQueue
+ writerTID <- forkIO $ responseWriter cnf h tQueue readerTID
loop so
-
-
-service :: Handle -> HostName -> PortNumber -> IO ()
-service h host port
- = do input <- B.hGetContents h
- loop input
- where
- loop :: ByteString -> IO ()
- loop input = case parse requestP input of
- Nothing
- -> fail "FIXME"
- Just (req, input')
- -> print req