packages feed

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 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)