module Network.HTTP.Lucu.Httpd ( ResourceTable , mkResourceTable -- [ ([String], Resource ()) ] -> ResourceTable , runHttpd -- Config -> ResourceTable -> IO () ) where import Control.Concurrent 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.Resource import Network.HTTP.Lucu.Response import System.IO type ResourceTable = Map [String] (Resource ()) mkResourceTable :: [ ([String], Resource ()) ] -> ResourceTable mkResourceTable = M.fromList runHttpd :: Config -> ResourceTable -> IO () runHttpd cnf table = withSocketsDo $ do so <- listenOn (cnfServerPort cnf) loop so where loop :: Socket -> IO () loop so = do (h, host, port) <- accept so forkIO $ service h host port 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