wai-websockets 1.1.0 → 1.2.0
raw patch · 2 files changed
+51/−42 lines, 2 filesdep ~conduitdep ~transformersdep ~wai
Dependency ranges changed: conduit, transformers, wai, warp, websockets
Files
- Network/Wai/Handler/WebSockets.hs +22/−13
- wai-websockets.cabal +29/−29
Network/Wai/Handler/WebSockets.hs view
@@ -7,50 +7,59 @@ import Control.Monad.IO.Class (liftIO) import Data.ByteString (ByteString) import Data.Char (toLower)-import Network.Wai (Request, requestHeaders, rawPathInfo, requestHeaders) import qualified Data.ByteString.Char8 as S import qualified Data.Conduit as C import qualified Data.Enumerator as E-import qualified Data.Enumerator.List as EL+import qualified Network.Wai as Wai+import qualified Network.Wai.Handler.Warp as Warp import qualified Network.WebSockets as WS-import Network.Wai.Handler.Warp (Connection (..)) -- | For use with 'settingsIntercept' from the Warp web server. intercept :: WS.Protocol p => (WS.Request -> WS.WebSockets p ())- -> Request- -> Maybe (C.BufferedSource IO ByteString -> Connection -> C.ResourceT IO ())+ -> Wai.Request+ -> Maybe (C.Source (C.ResourceT IO) ByteString -> Warp.Connection -> C.ResourceT IO ()) intercept = interceptWith WS.defaultWebSocketsOptions -- | Variation of 'intercept' which allows custom options. interceptWith :: WS.Protocol p => WS.WebSocketsOptions -> (WS.Request -> WS.WebSockets p ())- -> Request- -> Maybe (C.BufferedSource IO ByteString -> Connection -> C.ResourceT IO ())-interceptWith opts app req = case lookup "upgrade" $ requestHeaders req of+ -> Wai.Request+ -> Maybe (C.Source (C.ResourceT IO) ByteString -> Warp.Connection -> C.ResourceT IO ())+interceptWith opts app req = case lookup "upgrade" $ Wai.requestHeaders req of Just s | S.map toLower s == "websocket" -> Just $ runWebSockets opts req' app | otherwise -> Nothing _ -> Nothing where- req' = WS.RequestHttpPart (rawPathInfo req) (requestHeaders req)+ req' = WS.RequestHttpPart (Wai.rawPathInfo req) (Wai.requestHeaders req)+ (Wai.isSecure req) -- | Internal function to run the WebSocket iteratee using the conduit library runWebSockets :: WS.Protocol p => WS.WebSocketsOptions -> WS.RequestHttpPart -> (WS.Request -> WS.WebSockets p ())- -> C.BufferedSource IO ByteString- -> Connection+ -> C.Source (C.ResourceT IO) ByteString+ -> Warp.Connection -> C.ResourceT IO () runWebSockets opts req app source conn = do step <- liftIO $ E.runIteratee $ WS.runWebSocketsWith opts req app send source C.$$ C.sinkState (E.returnI step) push close where- send = EL.mapM_ (connSendAll conn)- close = const $ return ()+ send = iterConnection conn push iter bs = do step <- liftIO $ E.runIteratee $ E.enumList 1 [bs] E.$$ iter return $ C.StateProcessing $ E.returnI step+ close iter = do+ _ <- liftIO $ E.runIteratee $ E.enumEOF E.$$ iter+ return ()++iterConnection :: Warp.Connection -> E.Iteratee ByteString IO ()+iterConnection c = E.continue go+ where+ go (E.Chunks []) = E.continue go+ go (E.Chunks cs) = E.tryIO (Warp.connSendMany c cs) >> E.continue go+ go E.EOF = E.continue go
wai-websockets.cabal view
@@ -1,5 +1,5 @@ Name: wai-websockets-Version: 1.1.0+Version: 1.2.0 Synopsis: Provide a bridge betweeen WAI and the websockets package. License: BSD3 License-file: LICENSE@@ -17,18 +17,18 @@ flag example Library- Build-Depends: base >= 3 && < 5- , bytestring >= 0.9.1.4 && < 0.10- , conduit >= 0.2- , wai >= 1.1 && < 1.2- , warp >= 1.1 && < 1.2- , enumerator >= 0.4.8 && < 0.5- , network-enumerator >= 0.1.2 && < 0.2- , blaze-builder >= 0.2.1.4 && < 0.4- , case-insensitive >= 0.2- , network >= 2.2.1.5 && < 2.4- , transformers >= 0.2 && < 0.3- , websockets >= 0.5.1 && < 0.6+ Build-Depends: base >= 3 && < 5+ , bytestring >= 0.9.1.4 && < 0.10+ , conduit >= 0.4 && < 0.5+ , wai >= 1.2 && < 1.3+ , enumerator >= 0.4.8 && < 0.5+ , network-enumerator >= 0.1.2 && < 0.2+ , blaze-builder >= 0.2.1.4 && < 0.4+ , case-insensitive >= 0.2+ , network >= 2.2.1.5 && < 2.4+ , transformers >= 0.2 && < 0.4+ , websockets >= 0.6 && < 0.7+ , warp >= 1.2 && < 1.3 Exposed-modules: Network.Wai.Handler.WebSockets ghc-options: -Wall @@ -37,22 +37,22 @@ buildable: True else buildable: False- Build-Depends: base >=3 && < 5,- conduit,- wai-websockets,- websockets,- network-enumerator,- warp,- wai,- wai-app-static,- bytestring,- case-insensitive,- blaze-builder,- enumerator,- transformers,- network,- text,- file-embed+ Build-Depends: base >= 3 && < 5+ , conduit+ , wai-websockets+ , websockets+ , network-enumerator+ , warp+ , wai+ , wai-app-static+ , bytestring+ , case-insensitive+ , blaze-builder+ , enumerator+ , transformers+ , network+ , text+ , file-embed ghc-options: -Wall -threaded main-is: server.lhs