X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FHttpd.hs;h=2b81de1f88be64d5c12cc51f22be5b867347dbe5;hb=858129cb755aa09da2b7bd758efb8519f2c89103;hp=c5e8f04981ee7845e9049feacbfe0d43121efa77;hpb=a827a5e1ba744d89c5b2396bb195e344ae892306;p=Lucu.git diff --git a/Network/HTTP/Lucu/Httpd.hs b/Network/HTTP/Lucu/Httpd.hs index c5e8f04..2b81de1 100644 --- a/Network/HTTP/Lucu/Httpd.hs +++ b/Network/HTTP/Lucu/Httpd.hs @@ -6,11 +6,13 @@ module Network.HTTP.Lucu.Httpd import Control.Concurrent import Network +import qualified Network.Socket as So 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 System.Posix.Signals -- | This is the entry point of Lucu httpd. It listens to a socket and @@ -47,15 +49,26 @@ import System.Posix.Signals -- > } runHttpd :: Config -> ResTree -> IO () runHttpd cnf tree - = withSocketsDo $ + = cnf `seq` tree `seq` + withSocketsDo $ do installHandler sigPIPE Ignore Nothing so <- listenOn (cnfServerPort cnf) loop so where loop :: Socket -> IO () loop so - = do (h, host, _) <- accept so - tQueue <- newInteractionQueue - readerTID <- forkIO $ requestReader cnf tree h host tQueue - writerTID <- forkIO $ responseWriter cnf h tQueue readerTID + -- 本當は Network.accept を使ひたいが、このアクションは勝手に + -- リモートのIPを逆引きするので、使へない。 + = so `seq` + do (h, addr) <- accept' so + tQueue <- newInteractionQueue + readerTID <- forkIO $ requestReader cnf tree h addr tQueue + writerTID <- forkIO $ responseWriter cnf h tQueue readerTID loop so + + accept' :: Socket -> IO (Handle, So.SockAddr) + accept' soSelf + = soSelf `seq` + do (soPeer, addr) <- So.accept soSelf + hPeer <- So.socketToHandle soPeer ReadWriteMode + return (hPeer, addr)