git.iko.soy/distributed-process
on master help sign in
Allow for colons in hostnames. Bumb to 0.2.0.3.
commitceb7e5ae9f617da20f8e0920f0630a35849bf4fa authorEdsko de Vries <edsko@edsko.net> dateMon 20 Aug 2012, 11:49 (14 years ago) parent516189b
3 files changed+22−3
network-transport-tcp/ChangeLog+4 network-transport-tcp/network-transport-tcp.cabal+1−1 network-transport-tcp/src/Network/Transport/TCP.hs+17−2
network-transport-tcp/ChangeLog+4
@@ -1,3 +1,7 @@
1+2012-08-20 Edsko de Vries <edsko@well-typed.com> 0.2.0.3
2+
3+* Allow for colons in hostnames (for IPv6)
4+
152012-07-16 Edsko de Vries <edsko@well-typed.com> 0.2.0.2
26
37* Base 4.6 compatibility
network-transport-tcp/network-transport-tcp.cabal+1−1
@@ -1,5 +1,5 @@
11Name: network-transport-tcp
2−Version: 0.2.0.2
2+Version: 0.2.0.3
33Cabal-Version: >=1.8
44Build-Type: Simple
55License: BSD3
network-transport-tcp/src/Network/Transport/TCP.hs+17−2
@@ -97,7 +97,7 @@ import Control.Exception ( IOException
9797import Data.IORef (IORef, newIORef, writeIORef, readIORef)
9898import Data.ByteString (ByteString)
9999import qualified Data.ByteString as BS (concat)
100−import qualified Data.ByteString.Char8 as BSC (pack, unpack, split)
100+import qualified Data.ByteString.Char8 as BSC (pack, unpack)
101101import Data.Int (Int32)
102102import Data.IntMap (IntMap)
103103import qualified Data.IntMap as IntMap (empty)
@@ -1539,7 +1539,7 @@ encodeEndPointAddress host port ix = EndPointAddress . BSC.pack $
15391539decodeEndPointAddress :: EndPointAddress
15401540 -> Maybe (N.HostName, N.ServiceName, EndPointId)
15411541decodeEndPointAddress (EndPointAddress bs) =
1542− case map BSC.unpack $ BSC.split ':' bs of
1542+ case splitMaxFromEnd (== ':') 2 $ BSC.unpack bs of
15431543 [host, port, endPointIdStr] ->
15441544 case reads endPointIdStr of
15451545 [(endPointId, "")] -> Just (host, port, endPointId)
@@ -1547,6 +1547,21 @@ decodeEndPointAddress (EndPointAddress bs) =
15471547 _ ->
15481548 Nothing
15491549
1550+-- | @spltiMaxFromEnd p n xs@ splits list @xs@ at elements matching @p@,
1551+-- returning at most @p@ segments -- counting from the /end/
1552+--
1553+-- > splitMaxFromEnd (== ':') 2 "ab:cd:ef:gh" == ["ab:cd", "ef", "gh"]
1554+splitMaxFromEnd :: (a -> Bool) -> Int -> [a] -> [[a]]
1555+splitMaxFromEnd p = \n -> go [[]] n . reverse
1556+ where
1557+ -- go :: [[a]] -> Int -> [a] -> [[a]]
1558+ go accs _ [] = accs
1559+ go ([] : accs) 0 xs = reverse xs : accs
1560+ go (acc : accs) n (x:xs) =
1561+ if p x then go ([] : acc : accs) (n - 1) xs
1562+ else go ((x : acc) : accs) n xs
1563+ go _ _ _ = error "Bug in splitMaxFromEnd"
1564+
15501565--------------------------------------------------------------------------------
15511566-- Functions from TransportInternals --
15521567--------------------------------------------------------------------------------