|
|
|
|
@ -1,5 +1,6 @@
@@ -1,5 +1,6 @@
|
|
|
|
|
{-# OPTIONS_HADDOCK hide #-} |
|
|
|
|
|
|
|
|
|
{-# LANGUAGE CPP #-} |
|
|
|
|
{-# LANGUAGE NoMonomorphismRestriction #-} |
|
|
|
|
{-# LANGUAGE OverloadedStrings #-} |
|
|
|
|
{-# LANGUAGE TupleSections #-} |
|
|
|
|
@ -607,6 +608,17 @@ connectSrv config host = do
@@ -607,6 +608,17 @@ connectSrv config host = do
|
|
|
|
|
"The hostname could not be validated." |
|
|
|
|
throwError XmppIllegalTcpDetails |
|
|
|
|
|
|
|
|
|
showPort :: PortID -> String |
|
|
|
|
#if MIN_VERSION_network(2, 4, 1) |
|
|
|
|
showPort = show |
|
|
|
|
#else |
|
|
|
|
showPort (PortNumber x) = "PortNumber " ++ show x |
|
|
|
|
showPort (Service x) = "Service " ++ show x |
|
|
|
|
#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__) |
|
|
|
|
showPort (UnixSocket x) = "UnixSocket " ++ show x |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
-- Connects to a list of addresses and ports. Surpresses any exceptions from |
|
|
|
|
-- connectTcp. |
|
|
|
|
connectTcp :: [(HostName, PortID)] -> IO (Maybe Handle) |
|
|
|
|
@ -614,7 +626,7 @@ connectTcp [] = return Nothing
@@ -614,7 +626,7 @@ connectTcp [] = return Nothing
|
|
|
|
|
connectTcp ((address, port):remainder) = do |
|
|
|
|
result <- Ex.try $ (do |
|
|
|
|
debugM "Pontarius.Xmpp" $ "Connecting to " ++ address ++ " on port " ++ |
|
|
|
|
(show port) ++ "." |
|
|
|
|
(showPort port) ++ "." |
|
|
|
|
connectTo address port) :: IO (Either Ex.IOException Handle) |
|
|
|
|
case result of |
|
|
|
|
Right handle -> do |
|
|
|
|
@ -624,13 +636,21 @@ connectTcp ((address, port):remainder) = do
@@ -624,13 +636,21 @@ connectTcp ((address, port):remainder) = do
|
|
|
|
|
debugM "Pontarius.Xmpp" "Connection to HostName could not be established." |
|
|
|
|
connectTcp remainder |
|
|
|
|
|
|
|
|
|
#if MIN_VERSION_dns(1, 0, 0) |
|
|
|
|
fixDnsResult :: Either e a -> Maybe a |
|
|
|
|
fixDnsResult = either (const Nothing) Just |
|
|
|
|
#else |
|
|
|
|
fixDnsResult :: Maybe a -> Maybe a |
|
|
|
|
fixDnsResult = id |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
-- Makes an AAAA query to acquire a IPs, and tries to connect to all of them. If |
|
|
|
|
-- a handle can not be acquired this way, an analogous A query is performed. |
|
|
|
|
-- Surpresses all IO exceptions. |
|
|
|
|
resolvAndConnectTcp :: ResolvSeed -> Domain -> Int -> IO (Maybe Handle) |
|
|
|
|
resolvAndConnectTcp resolvSeed domain port = do |
|
|
|
|
aaaaResults <- (Ex.try $ rethrowErrorCall $ withResolver resolvSeed $ |
|
|
|
|
\resolver -> lookupAAAA resolver domain) :: IO (Either Ex.IOException (Maybe [IPv6])) |
|
|
|
|
\resolver -> fmap fixDnsResult $ lookupAAAA resolver domain) :: IO (Either Ex.IOException (Maybe [IPv6])) |
|
|
|
|
handle <- case aaaaResults of |
|
|
|
|
Right Nothing -> return Nothing |
|
|
|
|
Right (Just ipv6s) -> connectTcp $ |
|
|
|
|
@ -641,7 +661,7 @@ resolvAndConnectTcp resolvSeed domain port = do
@@ -641,7 +661,7 @@ resolvAndConnectTcp resolvSeed domain port = do
|
|
|
|
|
case handle of |
|
|
|
|
Nothing -> do |
|
|
|
|
aResults <- (Ex.try $ rethrowErrorCall $ withResolver resolvSeed $ |
|
|
|
|
\resolver -> lookupA resolver domain) :: IO (Either Ex.IOException (Maybe [IPv4])) |
|
|
|
|
\resolver -> fmap fixDnsResult $ lookupA resolver domain) :: IO (Either Ex.IOException (Maybe [IPv4])) |
|
|
|
|
handle' <- case aResults of |
|
|
|
|
Left _ -> return Nothing |
|
|
|
|
Right Nothing -> return Nothing |
|
|
|
|
@ -684,7 +704,7 @@ srvLookup realm resolvSeed = ErrorT $ do
@@ -684,7 +704,7 @@ srvLookup realm resolvSeed = ErrorT $ do
|
|
|
|
|
result <- Ex.try $ rethrowErrorCall $ withResolver resolvSeed |
|
|
|
|
$ \resolver -> do |
|
|
|
|
srvResult <- lookupSRV resolver $ BSC8.pack $ "_xmpp-client._tcp." ++ (Text.unpack realm) ++ "." |
|
|
|
|
case srvResult of |
|
|
|
|
case fixDnsResult srvResult of |
|
|
|
|
Just [(_, _, _, ".")] -> do |
|
|
|
|
debugM "Pontarius.Xmpp" $ "\".\" SRV result returned." |
|
|
|
|
return $ Just [] |
|
|
|
|
|