where
import Control.Concurrent
-import Network
-import qualified Network.Socket as So
+import Network hiding (accept)
import Network.HTTP.Lucu.Config
import Network.HTTP.Lucu.Interaction
import Network.HTTP.Lucu.RequestReader
import Network.HTTP.Lucu.Resource.Tree
import Network.HTTP.Lucu.ResponseWriter
-import System.IO
+import Network.HTTP.Lucu.SocketLike
import System.Posix.Signals
-- |This is the entry point of Lucu httpd. It listens to a socket and
runHttpd :: Config -> ResTree -> [FallbackHandler] -> IO ()
runHttpd cnf tree fbs
= withSocketsDo $
- do installHandler sigPIPE Ignore Nothing
- so <- listenOn (cnfServerPort cnf)
- loop so
- where
- loop :: Socket -> IO ()
- loop so
- -- 本當は Network.accept を使ひたいが、このアクションは勝手に
- -- リモートのIPを逆引きするので、使へない。
- = do (h, addr) <- accept' so
- tQueue <- newInteractionQueue
- readerTID <- forkIO $ requestReader cnf tree fbs h addr tQueue
- writerTID <- forkIO $ responseWriter cnf h tQueue readerTID
- loop so
+ do _ <- installHandler sigPIPE Ignore Nothing
- accept' :: Socket -> IO (Handle, So.SockAddr)
- accept' soSelf
- = do (soPeer, addr) <- So.accept soSelf
- hPeer <- So.socketToHandle soPeer ReadWriteMode
- return (hPeer, addr)
+ case cnfSSLConfig cnf of
+ Nothing
+ -> return ()
+ Just scnf
+ -> do so <- listenOn (sslServerPort scnf)
+ _loopTID <- forkIO $ httpLoop (sslContext scnf, so)
+ return ()
+
+ httpLoop =<< listenOn (cnfServerPort cnf)
+ where
+ httpLoop :: SocketLike s => s -> IO ()
+ httpLoop so
+ = do (h, addr) <- accept so
+ tQueue <- newInteractionQueue
+ readerTID <- forkIO $ requestReader cnf tree fbs h addr tQueue
+ _writerTID <- forkIO $ responseWriter cnf h tQueue readerTID
+ httpLoop so