warp 2.1.5 → 2.1.5.1
raw patch · 5 files changed
+36/−20 lines, 5 files
Files
- Network/Wai/Handler/Warp/Recv.hs +2/−1
- Network/Wai/Handler/Warp/Run.hs +7/−18
- Network/Wai/Handler/Warp/Windows.hs +24/−0
- test/RunSpec.hs +1/−0
- warp.cabal +2/−1
Network/Wai/Handler/Warp/Recv.hs view
@@ -21,6 +21,7 @@ #ifdef mingw32_HOST_OS import GHC.IO.FD (FD(..), readRawBufferPtr)+import Network.Wai.Handler.Warp.Windows #endif ----------------------------------------------------------------@@ -47,7 +48,7 @@ #endif receiveloop sock buf size = do #ifdef mingw32_HOST_OS- bytes <- fmap fromIntegral $ readRawBufferPtr "recv" (FD sock 1) buf 0 size+ bytes <- windowsThreadBlockHack $ fmap fromIntegral $ readRawBufferPtr "recv" (FD sock 1) buf 0 size #else bytes <- c_recv sock buf size 0 #endif
Network/Wai/Handler/Warp/Run.hs view
@@ -23,7 +23,7 @@ #define bindPortTCP bindPort #endif import Network (sClose, Socket)-import Network.Socket (accept, SockAddr)+import Network.Socket (accept, withSocketsDo, SockAddr) import qualified Network.Socket.ByteString as Sock import Network.Wai import qualified Network.Wai.Handler.Warp.Date as D@@ -40,9 +40,7 @@ import Data.IORef (IORef, newIORef, readIORef, writeIORef) #if WINDOWS-import qualified Control.Concurrent.MVar as MV-import Network.Socket (withSocketsDo)-import Control.Concurrent (forkIO)+import Network.Wai.Handler.Warp.Windows #else import System.Posix.IO (FdOption(CloseOnExec), setFdOption) import Network.Socket (fdSocket)@@ -77,26 +75,13 @@ -- | Run an 'Application' with the given 'Settings'. runSettings :: Settings -> Application -> IO ()-#if WINDOWS-runSettings set app = withSocketsDo $ do- var <- MV.newMVar Nothing- let clean = MV.modifyMVar_ var $ \s -> maybe (return ()) sClose s >> return Nothing- void . forkIO $ bracket- (bindPortTCP (settingsPort set) (settingsHost set))- (const clean)- (\s -> do- MV.modifyMVar_ var (\_ -> return $ Just s)- runSettingsSocket set s app)- forever (threadDelay maxBound) `finally` clean-#else-runSettings set app =+runSettings set app = withSocketsDo $ bracket (bindPortTCP (settingsPort set) (settingsHost set)) sClose (\socket -> do setSocketCloseOnExec socket runSettingsSocket set socket app)-#endif -- | Same as 'runSettings', but uses a user-supplied socket instead of opening -- one. This allows the user to provide, for example, Unix named socket, which@@ -109,7 +94,11 @@ runSettingsConnection set getConn app where getConn = do+#if WINDOWS+ (s, sa) <- windowsThreadBlockHack $ accept socket+#else (s, sa) <- accept socket+#endif setSocketCloseOnExec s conn <- socketConnection s return (conn, sa)
+ Network/Wai/Handler/Warp/Windows.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE CPP #-}+module Network.Wai.Handler.Warp.Windows+ ( windowsThreadBlockHack+ ) where++#if WINDOWS+import Control.Exception+import Control.Concurrent.MVar+import Control.Concurrent+import Control.Monad++windowsThreadBlockHack :: IO a -> IO a+windowsThreadBlockHack act = + do+ var <- newEmptyMVar :: IO (MVar (Either SomeException a))+ void . forkIO $ try act >>= putMVar var+ res <- takeMVar var+ case res of+ Left e -> throwIO e+ Right r -> return r+#else+windowsThreadBlockHack :: IO a -> IO a+windowsThreadBlockHack = id+#endif
test/RunSpec.hs view
@@ -77,6 +77,7 @@ nextPort :: I.IORef Int nextPort = unsafePerformIO $ I.newIORef 5000+{-# NOINLINE nextPort #-} getPort :: IO Int getPort = do
warp.cabal view
@@ -1,5 +1,5 @@ Name: warp-Version: 2.1.5+Version: 2.1.5.1 Synopsis: A fast, light-weight web server for WAI applications. License: MIT License-file: LICENSE@@ -81,6 +81,7 @@ Network.Wai.Handler.Warp.Settings Network.Wai.Handler.Warp.Thread Network.Wai.Handler.Warp.Types+ Network.Wai.Handler.Warp.Windows Paths_warp Ghc-Options: -Wall