X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FHttpd.hs;h=4d724eb92843f6f9d1fd6c97dc46cef553aaa376;hb=1ead053df6a792edafa9d714c4c038a8a9c3ad16;hp=595403abd0364f1a2e70c79088d9138d38eeaf90;hpb=3eb69879d3b336c7c3e613c0ce4bfb3c67989ff3;p=Lucu.git diff --git a/Network/HTTP/Lucu/Httpd.hs b/Network/HTTP/Lucu/Httpd.hs index 595403a..4d724eb 100644 --- a/Network/HTTP/Lucu/Httpd.hs +++ b/Network/HTTP/Lucu/Httpd.hs @@ -1,5 +1,6 @@ {-# LANGUAGE - UnicodeSyntax + CPP + , UnicodeSyntax #-} -- |The entry point of Lucu httpd. module Network.HTTP.Lucu.Httpd @@ -20,19 +21,16 @@ import Network.HTTP.Lucu.RequestReader import Network.HTTP.Lucu.Resource.Tree import Network.HTTP.Lucu.ResponseWriter import Network.HTTP.Lucu.SocketLike as SL -import System.Posix.Signals +import Prelude.Unicode -- |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. -- --- Note that 'runHttpd' automatically makes SIGPIPE be ignored by --- calling @'installHandler' 'sigPIPE' 'Ignore' 'Nothing'@. This can --- hardly cause a problem though. --- -- Example: -- -- > {-# LANGUAGE OverloadedStrings #-} +-- > {-# LANGUAGE QuasiQuotes #-} -- > module Main where -- > import Network.HTTP.Lucu -- > @@ -42,19 +40,25 @@ import System.Posix.Signals -- > in -- > runHttpd config resourcees [] -- > --- > helloWorld :: ResourceDef +-- > helloWorld :: Resource -- > helloWorld = emptyResource { -- > resGet --- > = Just $ do setContentType $ parseMIMEType "text/plain" +-- > = Just $ do setContentType [mimeType| text/plain |] -- > putChunk "Hello, world!" -- > } runHttpd ∷ Config → ResTree → [FallbackHandler] → IO () runHttpd cnf tree fbs = withSocketsDo $ - do void $ installHandler sigPIPE Ignore Nothing - let launchers + do let launchers = catMaybes - [ do scnf ← cnfSSLConfig cnf + [ 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) @@ -64,12 +68,7 @@ runHttpd cnf tree fbs return ( do so ← listenOn AF_INET6 addr (sslServerPort scnf) launchListener (sslContext scnf, so) ) - , do addr ← cnfServerV4Addr cnf - return ( launchListener =≪ listenOn AF_INET addr (cnfServerPort cnf) - ) - , do addr ← cnfServerV6Addr cnf - return ( launchListener =≪ listenOn AF_INET6 addr (cnfServerPort cnf) - ) +#endif ] sequence_ launchers waitForever @@ -78,8 +77,8 @@ runHttpd cnf tree fbs launchListener so = do p ← SL.socketPort so -- FIXME: Don't throw away the thread ID as we can't - -- kill it later then. [1] - void $ forkIO $ httpLoop p so + -- kill it later then. + void ∘ forkIO $ httpLoop p so listenOn ∷ Family → HostName → ServiceName → IO Socket listenOn fam host srv