scalable-server 0.1.1 → 0.1.2
raw patch · 2 files changed
+9/−11 lines, 2 filesdep +network-enumerator
Dependencies added: network-enumerator
Files
scalable-server.cabal view
@@ -3,7 +3,7 @@ Synopsis: Library for writing fast/scalable TCP-based services Description: Library for writing fast/scalable TCP-based services -Version: 0.1.1+Version: 0.1.2 License: BSD3 @@ -34,6 +34,7 @@ attoparsec >=0.9.1 && < 0.10, enumerator >= 0.4 && < 0.5, attoparsec-enumerator >= 0.2 && < 0.3,+ network-enumerator >= 0.1 && < 0.2, network>=2.3, mtl>=2 && <3, blaze-builder>=0.3 && <0.4
src/Network/Server/ScalableServer.hs view
@@ -7,6 +7,7 @@ RequestProcessor) where import Network.Socket+import Network.Socket.Enumerator (enumSocket) import qualified Network.Socket.ByteString as BinSock import Network.BSD import Control.Exception (finally)@@ -16,10 +17,7 @@ import Control.Concurrent.STM (newTChanIO, writeTChan, readTChan, atomically, TChan) import Data.Enumerator (($$), run_) import qualified Data.Enumerator as E-import Data.Enumerator.Binary (enumHandle) import Data.Attoparsec.Enumerator (iterParser)-import System.IO (hSetBuffering, hClose, BufferMode(..),- IOMode(..), Handle) import Blaze.ByteString.Builder (toByteStringIO, Builder) import Data.Enumerator (yield, continue, Iteratee, Stream(..)) import qualified Data.Attoparsec as Atto@@ -79,19 +77,17 @@ listen s 100 forever $ do (c, _) <- accept s- h <- socketToHandle c ReadMode- hSetBuffering h NoBuffering- forkIO $ connHandler pipe c h+ forkIO $ connHandler pipe c -connHandler :: RequestPipeline a -> Socket -> Handle -> IO ()-connHandler (RequestPipeline reqParse reqProc) s h = do+connHandler :: RequestPipeline a -> Socket -> IO ()+connHandler (RequestPipeline reqParse reqProc) s = do chan <- newTChanIO (do- let enum = enumHandle 32768 h+ let enum = enumSocket 4096 s let parser = iterParser reqParse void $ forkIO $ processRequests chan reqProc s void $ run_ (enum $$ E.sequence parser $$ requestHandler chan s)- ) `finally` ( (atomically $ writeTChan chan Nothing) >> hClose h )+ ) `finally` ( (atomically $ writeTChan chan Nothing) >> sClose s ) requestHandler :: RequestChannel a -> Socket -> Iteratee a IO () requestHandler chan s = do@@ -109,6 +105,7 @@ case next of Just a -> do resp <- proc a -- XXX handle exceptions?+ -- XXX eventually, pipeline to enumerator? toByteStringIO (BinSock.sendAll s) $ resp processRequests chan proc s Nothing -> return ()