28 if B.null packet then return [] else |
28 if B.null packet then return [] else |
29 do packets <- takePacks |
29 do packets <- takePacks |
30 return (B.splitWith (== '\n') packet : packets) |
30 return (B.splitWith (== '\n') packet : packets) |
31 |
31 |
32 listenLoop :: Socket -> Chan CoreMessage -> ClientIndex -> IO () |
32 listenLoop :: Socket -> Chan CoreMessage -> ClientIndex -> IO () |
33 listenLoop sock chan ci = recieveWithBufferLoop B.empty |
33 listenLoop sock chan ci = receiveWithBufferLoop B.empty |
34 where |
34 where |
35 recieveWithBufferLoop recvBuf = do |
35 receiveWithBufferLoop recvBuf = do |
36 recvBS <- recv sock 4096 |
36 recvBS <- recv sock 4096 |
37 unless (B.null recvBS) $ do |
37 unless (B.null recvBS) $ do |
38 let (packets, newrecvBuf) = bs2Packets $ B.append recvBuf recvBS |
38 let (packets, newrecvBuf) = bs2Packets $ B.append recvBuf recvBS |
39 forM_ packets sendPacket |
39 forM_ packets sendPacket |
40 recieveWithBufferLoop newrecvBuf |
40 receiveWithBufferLoop newrecvBuf |
41 |
41 |
42 sendPacket packet = writeChan chan $ ClientMessage (ci, packet) |
42 sendPacket packet = writeChan chan $ ClientMessage (ci, packet) |
43 |
43 |
44 clientRecvLoop :: Socket -> Chan CoreMessage -> Chan [B.ByteString] -> ClientIndex -> (forall a. IO a -> IO a) -> IO () |
44 clientRecvLoop :: Socket -> Chan CoreMessage -> Chan [B.ByteString] -> ClientIndex -> (forall a. IO a -> IO a) -> IO () |
45 clientRecvLoop s chan clChan ci restore = |
45 clientRecvLoop s chan clChan ci restore = |
46 (myThreadId >>= |
46 (myThreadId >>= |
47 \t -> (restore $ forkIO (clientSendLoop s t clChan ci) >> |
47 (\t -> (restore $ forkIO (clientSendLoop s t clChan ci) >> |
48 listenLoop s chan ci >> return "Connection closed") |
48 listenLoop s chan ci >> return "Connection closed") |
49 `Exception.catch` (\(e :: ShutdownThreadException) -> return . B.pack . show $ e) |
49 `Exception.catch` (\(e :: ShutdownThreadException) -> return . B.pack . show $ e) |
50 `Exception.catch` (\(e :: Exception.IOException) -> return . B.pack . show $ e) |
50 `Exception.catch` (\(e :: Exception.IOException) -> return . B.pack . show $ e) |
51 `Exception.catch` (\(e :: Exception.SomeException) -> return . B.pack . show $ e) |
51 `Exception.catch` (\(e :: Exception.SomeException) -> return . B.pack . show $ e) |
|
52 ) |
52 >>= clientOff) `Exception.finally` remove |
53 >>= clientOff) `Exception.finally` remove |
53 where |
54 where |
54 clientOff msg = writeChan chan $ ClientMessage (ci, ["QUIT", msg]) |
55 clientOff msg = writeChan chan $ ClientMessage (ci, ["QUIT", msg]) |
55 remove = do |
56 remove = do |
56 clientOff "Client is in some weird state" |
57 clientOff "Client is in some weird state" |