courier 0.1.0.12 → 0.1.0.13
raw patch · 5 files changed
+57/−52 lines, 5 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
Files
- changes.md +4/−0
- courier.cabal +3/−3
- src/Network/Transport/Sockets.hs +18/−9
- src/Network/Transport/TCP.hs +13/−17
- src/Network/Transport/UDP.hs +19/−23
changes.md view
@@ -1,3 +1,7 @@+0.1.0.13++ * Explicitly removed support for 7.4; 7.6 now required.+ 0.1.0.12 * Fixed a long-standing issue concerning inconsistent failures. Turns out, on operating
courier.cabal view
@@ -1,5 +1,5 @@ name: courier-version: 0.1.0.12+version: 0.1.0.13 synopsis: A message-passing library for simplifying network applications description: Inspired by Erlang's simple message-passing facilities, courier provides roughly similar capabilities. Applications simply create one or more endpoints, @@ -52,11 +52,11 @@ Control.Concurrent.Mailbox Network.RPC - ghc-options: -Wall+ ghc-options: -Wall -fno-state-hack other-modules: Network.Transport.Sockets Network.Transport.Internal- build-depends: base >=4 && <5,+ build-depends: base >=4.6 && <5, async, bytestring, cereal,
src/Network/Transport/Sockets.hs view
@@ -48,7 +48,8 @@ parseSocketAddress, lookupAddresses,- lookupAddress+ lookupAddress,+ lookupWildcardAddress ) where @@ -235,18 +236,26 @@ else h port p = p -lookupAddresses :: (HostName,ServiceName) -> IO [SockAddr]-lookupAddresses hostAndPort = - let (host,port) = hostAndPort+lookupAddresses :: Family -> SocketType -> Address -> IO [SockAddr]+lookupAddresses family socketType address =+ let (host,port) = parseSocketAddress address hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_CANONNAME, AI_NUMERICSERV] }- in do + in do addresses <- getAddrInfo (Just hints) (Just host) (Just port)- return $ map addrAddress $ filter (\addrinfo -> addrFamily addrinfo == AF_INET) addresses+ return $ map addrAddress $ filter (\addrInfo -> addrFamily addrInfo == family && addrSocketType addrInfo == socketType) addresses -lookupAddress :: (HostName,ServiceName) -> IO SockAddr-lookupAddress hostAndPort = do- addresses <- lookupAddresses hostAndPort+lookupAddress :: Family -> SocketType -> Address -> IO SockAddr+lookupAddress family socketType address = do+ addresses <- lookupAddresses family socketType address return $ addresses !! 0++lookupWildcardAddress :: Family -> SocketType -> Address -> IO SockAddr+lookupWildcardAddress family socketType address = do+ sockAddr <- lookupAddress family socketType address+ case sockAddr of+ SockAddrInet port _ -> return $ SockAddrInet port iNADDR_ANY+ SockAddrInet6 port flow _ scope -> return $ SockAddrInet6 port flow iN6ADDR_ANY scope+ _ -> return sockAddr type SocketSend = Socket -> B.ByteString -> IO ()
src/Network/Transport/TCP.hs view
@@ -53,6 +53,12 @@ tcpScheme :: Scheme tcpScheme = "tcp" +lookupTCPAddress :: Address -> IO NS.SockAddr+lookupTCPAddress address = lookupAddress NS.AF_INET NS.Stream address++lookupWildcardTCPAddress :: Address -> IO NS.SockAddr+lookupWildcardTCPAddress address = lookupWildcardAddress NS.AF_INET NS.Stream address+ {-| Create a new 'Transport' suitable for sending messages over TCP/IP. There can be multiple instances of these 'Transport's: 'Network.Endpoints.Endpoint' using@@ -107,14 +113,12 @@ unbind = tcpUnbind address } where- tcpListen address sock = do + tcpListen address sock = do catchExceptions (do- let (_,port) = parseSocketAddress address- portnums <- NS.getAddrInfo - (Just NS.defaultHints {NS.addrFlags = [NS.AI_PASSIVE,NS.AI_NUMERICSERV]}) Nothing (Just port) NS.setSocketOption sock NS.NoDelay 1 NS.setSocketOption sock NS.ReuseAddr 1- NS.bind sock (NS.addrAddress $ head portnums)+ sockAddr <- lookupWildcardTCPAddress address+ NS.bind sock sockAddr NS.listen sock 2048) -- TODO think about a configurable backlog (\e -> do warningM _log $ "Listen error on port " ++ address ++ ": " ++ (show (e :: SomeException))@@ -162,24 +166,16 @@ newTCPConnection :: Address -> IO Connection newTCPConnection address = do sock <- atomically $ newEmptyTMVar- let (host,port) = parseSocketAddress address return Connection { connAddress = address, connSocket = sock, connConnect = do socket <- NS.socket NS.AF_INET NS.Stream NS.defaultProtocol- sockAddrs <- NS.getAddrInfo - (Just NS.defaultHints {NS.addrFlags = [NS.AI_NUMERICSERV,NS.AI_ADDRCONFIG]}) (Just host) (Just port)- let ipv4Addrs = filter (\sockAddr ->- (NS.addrFamily sockAddr == NS.AF_INET)- && (NS.addrSocketType sockAddr == NS.Stream))- sockAddrs- infoM _log $ "Socket addresses are " ++ (show sockAddrs)- infoM _log $ "IPv4 addresses are " ++ (show ipv4Addrs)- infoM _log $ "Initiating socket connection to " ++ (show $ head ipv4Addrs)- NS.connect socket $ NS.addrAddress $ head ipv4Addrs+ sockAddr <- lookupTCPAddress address+ NS.connect socket sockAddr+ -- NS.connect socket $ NS.addrAddress $ head ipv4Addrs atomically $ putTMVar sock socket- infoM _log $ "Initiated socket connection to " ++ (show $ head ipv4Addrs)+ -- infoM _log $ "Initiated socket connection to " ++ (show $ head ipv4Addrs) return socket, connSend = tcpSend address, connReceive = receiveSocketBytes,
src/Network/Transport/UDP.hs view
@@ -45,7 +45,7 @@ import qualified Data.Map as M import qualified Data.Set as S -import qualified Network.Socket as N+import qualified Network.Socket as NS import Network.Socket.ByteString(sendAllTo,recvFrom) import System.Log.Logger@@ -60,6 +60,12 @@ udpScheme :: Scheme udpScheme = "udp" +lookupUDPAddress :: Address -> IO NS.SockAddr+lookupUDPAddress address = lookupAddress NS.AF_INET NS.Datagram address++lookupWildcardUDPAddress :: Address -> IO NS.SockAddr+lookupWildcardUDPAddress address = lookupWildcardAddress NS.AF_INET NS.Datagram address+ newUDPTransport :: Resolver -> IO Transport newUDPTransport resolver = do messengers <- atomically $ newTVar M.empty@@ -98,23 +104,13 @@ M.insert name inc bindings Just address <- resolve (socketResolver transport) name bindAddress sockets address $ do- let (_,port) = parseSocketAddress address- addrinfos <- N.getAddrInfo- (Just (N.defaultHints {N.addrFlags = [N.AI_PASSIVE,N.AI_NUMERICSERV]}))- Nothing (Just port)- let ipv4Addrs = filter (\sockAddr ->- (N.addrFamily sockAddr == N.AF_INET)- && (N.addrSocketType sockAddr == N.Datagram))- addrinfos- infoM _log $ "Socket addresses are " ++ (show addrinfos)- infoM _log $ "IPv4 addresses are " ++ (show ipv4Addrs) - let serveraddr = head ipv4Addrs- sock <- N.socket (N.addrFamily serveraddr) N.Datagram N.defaultProtocol+ sockaddr <- lookupWildcardUDPAddress address+ sock <- NS.socket NS.AF_INET NS.Datagram NS.defaultProtocol -- have to set this option in case we frequently rebind sockets- infoM _log $ "Binding to " ++ (show port) ++ " over UDP"- N.setSocketOption sock N.ReuseAddr 1- N.bindSocket sock $ N.addrAddress serveraddr- infoM _log $ "Bound to " ++ (show port) ++ " over UDP"+ infoM _log $ "Binding to " ++ (show address) ++ " over UDP"+ NS.setSocketOption sock NS.ReuseAddr 1+ NS.bindSocket sock sockaddr+ infoM _log $ "Bound to " ++ (show address) ++ " over UDP" rcvr <- async $ udpReceiveSocketMessages sock address (socketInbound transport) return (sock,rcvr) return $ Right Binding {@@ -131,9 +127,9 @@ return Connection { connAddress = address, connSocket = sock,- connConnect = N.socket N.AF_INET N.Datagram N.defaultProtocol,+ connConnect = NS.socket NS.AF_INET NS.Datagram NS.defaultProtocol, connSend = (\s bs -> do- addr <- lookupAddress $ parseSocketAddress address+ addr <- lookupUDPAddress address infoM _log $ "Sending via UDP to " ++ (show addr) sendAllTo s bs addr infoM _log $ "Sent via UDP to " ++ (show addr)),@@ -141,7 +137,7 @@ connClose = do maybeSocket <- atomically $ tryTakeTMVar sock case maybeSocket of- Just s -> N.sClose s+ Just s -> NS.sClose s Nothing -> return () return () }@@ -151,7 +147,7 @@ msngr <- newMessenger conn mailbox return msngr -udpReceiveSocketMessages :: N.Socket -> Address -> Mailbox Message -> IO ()+udpReceiveSocketMessages :: NS.Socket -> Address -> Mailbox Message -> IO () udpReceiveSocketMessages sock addr mailbox = catchExceptions (do infoM _log $ "Waiting to receive via UDP on " ++ (show addr)@@ -159,7 +155,7 @@ infoM _log $ "Received message via UDP on " ++ (show addr) case maybeMsg of Nothing -> do- N.sClose sock+ NS.sClose sock return () Just msg -> do atomically $ writeMailbox mailbox msg@@ -172,7 +168,7 @@ infoM _log $ "Received message" return maybeMsg -udpRecvFrom :: N.Socket -> Int -> IO (Maybe B.ByteString)+udpRecvFrom :: NS.Socket -> Int -> IO (Maybe B.ByteString) udpRecvFrom sock count = do (bs,addr) <- recvFrom sock count infoM _log $ "Received UDP message from " ++ (show addr) ++ ": " ++ (show bs)