packages feed

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 ()