[Haskell-cafe] Network Connect Timeouts
Mark Fine
mark.fine at gmail.com
Sat Oct 14 02:14:33 UTC 2017
I'd like a configurable network connect timeout. Has anyone solved this
reasonably?
*System.Timeout.timeout* times out connections, but works on the
granularity of the life of the connection. Is there a reasonable way to
configure a timeout around just establishing the connection? Maybe
something like a conditional timeout that enables an action to disable the
timeout once it expires?
As a workaround, I'm spinning trying to successfully connect first before
trying to connect for real:
-- | Try the TCP connection and see if you can connect...
--
tryTCPClient :: Int -> ClientSettings -> IO ()
tryTCPClient microseconds settings = do
ok <- newIORef False
void $ timeout microseconds $ runTCPClient settings $ const $
writeIORef ok True
ok' <- readIORef ok
unless ok' $
tryTCPClient microseconds settings
-- | Wrap runTCPClient with a connect timeout.
--
-- Tries the TCP connection first, and the runs the regular runTCPClient.
-- Of course, this only enforces a TCP connect timeout on the first connect.
-- The second TCP connect has no timeout :(
--
runTCPClient' :: Int -> ClientSettings -> (AppData -> IO a) -> IO a
runTCPClient' microseconds settings action = do
tryTCPClient microseconds settings
runTCPClient settings action
I've also tried running the *tryTCPClient* in its own thread concurrently
with *runTCPClient* and throwing an exception if it can't connect in
*microseconds*. None of these offer an actual true connection establishment
timeout.
Has anyone found a way to solve this? Thanks!
Mark
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20171013/9fc978bd/attachment.html>
More information about the Haskell-Cafe
mailing list