diff options
author | Joey Hess <joey@kitenet.net> | 2012-09-18 17:19:41 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-09-18 17:19:41 -0400 |
commit | 467844d7d3f703f99fcde1f951f33efda5e90074 (patch) | |
tree | f8a99f3eb12fed2ddda2c9b237c1436c64a18c20 /Utility/WebApp.hs | |
parent | ba27483c6a00ba36fd57150f338afc540d10b7f9 (diff) |
prefer ipv4 localhost when both are available
The webapp can only run on one of ipv4 and ipv6, no both. Some web browsers
may not support ipv6, so ipv4 is the safe choice.
The actual problem I ran into with it only listening to ipv6 was that
Utility.Url.exists was failing to connect to it. I doubt that haskell's
HTTP library is ipv4 only. More likely, it was only trying one address,
and tried ipv4 first.
Diffstat (limited to 'Utility/WebApp.hs')
-rw-r--r-- | Utility/WebApp.hs | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/Utility/WebApp.hs b/Utility/WebApp.hs index 883f4d183..21a5761bc 100644 --- a/Utility/WebApp.hs +++ b/Utility/WebApp.hs @@ -63,14 +63,18 @@ runWebApp app observer = do {- Binds to a local socket, selecting any free port. - + - Prefers to bind to the ipv4 address rather than the ipv6 address + - of localhost, if it's available. + - - As a (very weak) form of security, only connections from - localhost are accepted. -} localSocket :: IO Socket localSocket = do addrs <- getAddrInfo (Just hints) (Just localhost) Nothing - case addrs of - [] -> error "unable to bind to a local socket" - (addr:_) -> go addr + case (partition (\a -> addrFamily a == AF_INET) addrs) of + (v4addr:_, _) -> go v4addr + (_, v6addr:_) -> go v6addr + _ -> error "unable to bind to a local socket" where hints = defaultHints { addrFlags = [AI_ADDRCONFIG] |