summaryrefslogtreecommitdiff
path: root/dht/src/Data/Tox/Relay.hs
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-11-28 21:10:25 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-01 22:50:28 -0500
commit05f443e31b52de18e6e2dd3b7b7bd599f28e4a6f (patch)
treedb434da1f23caab25929c4c137f4af6b00e032fc /dht/src/Data/Tox/Relay.hs
parent62be467e38b5919baeed90784ac1b62a3e256649 (diff)
Prefer IPv4 when parsing TCP nodes JSON.
Diffstat (limited to 'dht/src/Data/Tox/Relay.hs')
-rw-r--r--dht/src/Data/Tox/Relay.hs22
1 files changed, 19 insertions, 3 deletions
diff --git a/dht/src/Data/Tox/Relay.hs b/dht/src/Data/Tox/Relay.hs
index c563db8d..f28a1685 100644
--- a/dht/src/Data/Tox/Relay.hs
+++ b/dht/src/Data/Tox/Relay.hs
@@ -16,7 +16,9 @@ import Data.Data
16import Data.Functor.Contravariant 16import Data.Functor.Contravariant
17import Data.Hashable 17import Data.Hashable
18import qualified Data.HashMap.Strict as HashMap 18import qualified Data.HashMap.Strict as HashMap
19import Data.List
19import Data.Monoid 20import Data.Monoid
21import Data.Ord
20import Data.Serialize 22import Data.Serialize
21import qualified Data.Vector as Vector 23import qualified Data.Vector as Vector
22import Data.Word 24import Data.Word
@@ -217,13 +219,27 @@ instance ToJSON NodeInfo where
217 tbl 219 tbl
218 x -> x -- Shouldn't happen. 220 x -> x -- Shouldn't happen.
219 221
222tcpPortScore :: Word16 -> Word16
223tcpPortScore 443 = 0
224tcpPortScore 80 = 0
225tcpPortScore 3389 = 1
226tcpPortScore _ = 2
227
220instance FromJSON NodeInfo where 228instance FromJSON NodeInfo where
221 parseJSON json = do 229 parseJSON json = do
222 udp <- parseJSON json 230 -- Instead of using ordinary parseJSON to parse the udp node,
231 -- we are using a variation that prefers IPv4 over IPv6.
232 -- The rationale is that must lans without UDP will be using
233 -- IPv4.
234 udp <- UDP.nodeInfoFromJSON True json
223 port <- case json of 235 port <- case json of
224 JSON.Object v -> do 236 JSON.Object v -> do
225 portnum:_ <- v JSON..: "tcp_ports" 237 ps <- v JSON..: "tcp_ports"
226 return (fromIntegral (portnum :: Word16)) 238 if Prelude.null (ps :: [Word16])
239 then fail "TCP.NodeInfo: missing tcp port"
240 else do
241 let portnum = minimumBy (comparing tcpPortScore) ps
242 return (fromIntegral portnum)
227 _ -> fail "TCP.NodeInfo: Expected JSON object." 243 _ -> fail "TCP.NodeInfo: Expected JSON object."
228 return $ NodeInfo udp port 244 return $ NodeInfo udp port
229 245