@@ -16,6 +16,11 @@ import Web.SocketIO.Types
16
16
17
17
--------------------------------------------------------------------------------
18
18
import Control.Monad.Trans (liftIO )
19
+ import Blaze.ByteString.Builder (Builder )
20
+ import qualified Blaze.ByteString.Builder as Builder
21
+ import Data.Conduit
22
+ import qualified Data.Conduit.List as CL
23
+ import qualified Data.ByteString as B
19
24
import Network.HTTP.Types (Status , status200 , status403 )
20
25
import Network.HTTP.Types.Header (ResponseHeaders )
21
26
import qualified Network.Wai as Wai
@@ -45,6 +50,26 @@ serverConfig port config handler = do
45
50
-- run it with Warp
46
51
Warp. run port (httpApp vorspann (runConnection env))
47
52
53
+
54
+ banana :: Wai. Request -> (Request -> IO Message ) -> Source IO (Flush Builder )
55
+ banana request runConnection' = sourceRequest request $= CL. mapM runConnection' =$= serializeMessage =$= toFlushBuilder
56
+ where serializeMessage = do
57
+ m <- await
58
+ n <- await
59
+ case (m, n) of
60
+ (Nothing , Nothing ) -> yield (serialize (Framed [] :: Framed Message ))
61
+ (Just m', Nothing ) -> yield (serialize m')
62
+ (Just m', Just n') -> do
63
+ yield (" �" <> serialize size <> " �" <> m'')
64
+ leftover n'
65
+ serializeMessage
66
+ where m'' = serialize m'
67
+ size = B. length m''
68
+ toFlushBuilder = do
69
+ b <- await
70
+ case b of
71
+ Just b' -> yield $ Chunk $ Builder. fromByteString b'
72
+ Nothing -> yield $ Flush
48
73
--------------------------------------------------------------------------------
49
74
-- | Wrapped as a HTTP app
50
75
httpApp :: ResponseHeaders -> (Request -> IO Message ) -> Wai. Application
@@ -53,8 +78,7 @@ httpApp headerFields runConnection' httpRequest = liftIO $ do
53
78
let origin = lookupOrigin httpRequest
54
79
let headerFields' = insertOrigin headerFields origin
55
80
56
- reqs <- parseHTTPRequest httpRequest
57
- mapM runConnection' reqs >>= waiResponse headerFields'
81
+ return $ Wai. responseSource status200 headerFields' (banana httpRequest runConnection')
58
82
59
83
where lookupOrigin req = case lookup " Origin" (Wai. requestHeaders req) of
60
84
Just origin -> origin
0 commit comments