-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
+-- |This is the entry point of Lucu httpd. It listens to a socket and
+-- waits for clients. 'runHttpd' never stops by itself so the only way
+-- to stop it is to raise an exception in the thread running it.
+--
+-- Example:
+--
+-- @
+-- {-\# LANGUAGE OverloadedStrings \#-}
+-- {-\# LANGUAGE QuasiQuotes \#-}
+-- module Main where
+-- import qualified "Data.Collections" as C
+-- import "Network"
+-- import "Network.HTTP.Lucu"
+--
+-- main :: 'IO' ()
+-- main = let config = 'defaultConfig'
+-- tree :: 'ResourceTree'
+-- tree = C.fromList [ ([], 'nonGreedy' helloWorld) ]
+-- in
+-- 'Network.withSocketsDo' '.' 'runHttpd' config '$' 'resourceMap' tree
+--
+-- helloWorld :: 'Network.HTTP.Lucu.Resource'
+-- helloWorld = C.fromList
+-- [ ( 'Network.HTTP.Lucu.GET'
+-- , do 'Network.HTTP.Lucu.setContentType' ['Network.HTTP.Lucu.mimeType'| text/plain |]
+-- 'Network.HTTP.Lucu.putChunk' \"Hello, world!\"
+-- }
+-- @
+runHttpd ∷ HostMapper α ⇒ Config → α → IO ()
+runHttpd cnf hm
+ = do let launchers
+ = catMaybes
+ [ do addr ← cnfServerV4Addr cnf
+ return ( launchListener =≪ listenOn AF_INET addr (cnfServerPort cnf)
+ )
+ , do addr ← cnfServerV6Addr cnf
+ return ( launchListener =≪ listenOn AF_INET6 addr (cnfServerPort cnf)
+ )
+#if defined(HAVE_SSL)
+ , do scnf ← cnfSSLConfig cnf
+ addr ← cnfServerV4Addr cnf
+ return ( do so ← listenOn AF_INET addr (sslServerPort scnf)
+ launchListener (sslContext scnf, so)
+ )
+ , do scnf ← cnfSSLConfig cnf
+ addr ← cnfServerV6Addr cnf
+ return ( do so ← listenOn AF_INET6 addr (sslServerPort scnf)
+ launchListener (sslContext scnf, so)
+ )
+#endif
+ ]
+ sequence_ launchers
+ waitForever