-runHttpd :: Config -> ResTree -> IO ()
-runHttpd cnf tree
- = cnf `seq` tree `seq`
- withSocketsDo $
- do installHandler sigPIPE Ignore Nothing
- so <- listenOn (cnfServerPort cnf)
- loop so
+runHttpd :: Config -> ResTree -> [FallbackHandler] -> IO ()
+runHttpd cnf tree fbs
+ = withSocketsDo $
+ do _ <- installHandler sigPIPE Ignore Nothing
+
+ -- FIXME: TERRIBLE CODE. NEED MAJOR REWRITE.
+ case cnfSSLConfig cnf of
+ Nothing
+ -> return ()
+ Just scnf
+ -> do case cnfServerV4Addr cnf of
+ Nothing
+ -> return ()
+ Just v4addr
+ -> do so <- listenOn AF_INET v4addr (sslServerPort scnf)
+ p <- socketPort so
+ -- FIXME: Don't throw away the thread
+ -- ID as we can't kill it later
+ -- then. [1]
+ _ <- forkIO $ httpLoop p (sslContext scnf, so)
+ return ()
+
+ case cnfServerV6Addr cnf of
+ Nothing
+ -> return ()
+ Just v6addr
+ -> do so <- listenOn AF_INET6 v6addr (sslServerPort scnf)
+ p <- socketPort so
+ -- FIXME: [1]
+ _ <- forkIO $ httpLoop p (sslContext scnf, so)
+ return ()
+
+ case cnfServerV4Addr cnf of
+ Nothing
+ -> return ()
+ Just v4addr
+ -> do so <- listenOn AF_INET v4addr (cnfServerPort cnf)
+ p <- socketPort so
+ -- FIXME: [1]
+ _ <- forkIO $ httpLoop p so
+ return ()
+
+ case cnfServerV6Addr cnf of
+ Nothing
+ -> return ()
+ Just v6addr
+ -> do so <- listenOn AF_INET6 v6addr (cnfServerPort cnf)
+ p <- socketPort so
+ -- FIXME: [1]
+ _ <- forkIO $ httpLoop p so
+ return ()
+
+ waitForever