on master help sign in
settingsHost
commit2e1aae0bc6b8a1b5c6d1bcb157271c062bb89dd8 authorMichael <michael@snoyman.com> dateSun 3 Apr 2011, 10:50 (16 years ago) parent7f04e06
1 file changed+20−4
Network/Wai/Handler/Warp.hs+20−4
Network/Wai/Handler/Warp.hs+20−4
@@ -31,6 +31,7 @@ module Network.Wai.Handler.Warp
3131 , Settings
3232 , defaultSettings
3333 , settingsPort
34+ , settingsHost
3435 , settingsOnException
3536 , settingsTimeout
3637 -- * Datatypes
@@ -49,10 +50,13 @@ import qualified Data.ByteString as S
4950import qualified Data.ByteString.Unsafe as SU
5051import qualified Data.ByteString.Char8 as B
5152import qualified Data.ByteString.Lazy as L
52−import Network (listenOn, sClose, PortID(PortNumber), Socket)
53+import Network (sClose, Socket)
5354import Network.Socket
54− ( accept, SockAddr
55+ ( accept, SockAddr (SockAddrInet), Family (AF_INET)
56+ , SocketType (Stream), listen, bindSocket, setSocketOption
57+ , SocketOption (ReuseAddr), iNADDR_ANY, inet_addr, SockAddr (SockAddrInet)
5558 )
59+import qualified Network.Socket
5660import qualified Network.Socket.ByteString as Sock
5761import Control.Exception
5862 ( bracket, finally, Exception, SomeException, catch
@@ -92,6 +96,16 @@ import qualified Control.Concurrent.MVar as MV
9296import Network.Socket (withSocketsDo)
9397#endif
9498
99+bindPort :: Int -> String -> IO Socket
100+bindPort p s = do
101+ sock <- Network.Socket.socket AF_INET Stream 0
102+ h <- if s == "*" then return iNADDR_ANY else inet_addr s
103+ let addr = SockAddrInet (fromIntegral p) h
104+ setSocketOption sock ReuseAddr 1
105+ bindSocket sock addr
106+ listen sock 150
107+ return sock
108+
95109-- | Run an 'Application' on the given port. This calls 'runSettings' with
96110-- 'defaultSettings'.
97111run :: Port -> Application -> IO ()
@@ -104,7 +118,7 @@ runSettings set app = withSocketsDo $ do
104118 var <- MV.newMVar Nothing
105119 let clean = MV.modifyMVar_ var $ \s -> maybe (return ()) sClose s >> return Nothing
106120 _ <- forkIO $ bracket
107− (listenOn $ PortNumber $ fromIntegral $ settingsPort set)
121+ (bindPort (settingsPort set) (settingsHost set))
108122 (const clean)
109123 (\s -> do
110124 MV.modifyMVar_ var (\_ -> return $ Just s)
@@ -113,7 +127,7 @@ runSettings set app = withSocketsDo $ do
113127#else
114128runSettings set =
115129 bracket
116− (listenOn $ PortNumber $ fromIntegral $ settingsPort set)
130+ (bindPort (settingsPort set) (settingsHost set))
117131 sClose .
118132 (flip (runSettingsSocket set))
119133#endif
@@ -406,6 +420,7 @@ iterSocket th sock =
406420-- > defaultSettings { settingsTimeout = 20 }
407421data Settings = Settings
408422 { settingsPort :: Int -- ^ Port to listen on. Default value: 3000
423+ , settingsHost :: String -- ^ Host to bind to, or * for all. Default value: *
409424 , settingsOnException :: SomeException -> IO () -- ^ What to do with exceptions thrown by either the application or server. Default: ignore server-generated exceptions (see 'InvalidRequest') and print application-generated applications to stderr.
410425 , settingsTimeout :: Int -- ^ Timeout value in seconds. Default value: 30
411426 }
@@ -415,6 +430,7 @@ data Settings = Settings
415430defaultSettings :: Settings
416431defaultSettings = Settings
417432 { settingsPort = 3000
433+ , settingsHost = "*"
418434 , settingsOnException = \e ->
419435 case fromException e of
420436 Just x -> go x