network-hans-2.6.3.1: src/Network/Socket/ByteString/Lazy.hs
module Network.Socket.ByteString.Lazy(
send
, sendAll
, getContents
, recv
)
where
import Data.ByteString.Lazy(ByteString)
import qualified Data.ByteString.Lazy as L
import Data.Int(Int64)
import Hans.Socket(DataSocket(..))
import Network.Socket.Types(Socket, Direction(..), withTcpSocket)
import Prelude hiding (getContents)
import System.IO.Unsafe(unsafeInterleaveIO)
send :: Socket -> ByteString -> IO Int64
send sock bstr =
withTcpSocket sock ForWrite $ \ tcps ->
fromIntegral `fmap` sWrite tcps bstr
sendAll :: Socket -> ByteString -> IO ()
sendAll sock bstr
| L.length bstr == 0 = return ()
| otherwise =
do sent <- send sock bstr
sendAll sock (L.drop sent bstr)
getContents :: Socket -> IO ByteString
getContents socket = lazyRead
where
lazyRead = unsafeInterleaveIO loop
loop =
do bstr <- recv socket 4096
if L.null bstr
then return L.empty
else do next <- lazyRead
return (bstr `L.append` next)
recv :: Socket -> Int64 -> IO ByteString
recv sock amt =
withTcpSocket sock ForRead $ \ tcps ->
sRead tcps (fromIntegral amt)