summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-09-18 17:19:41 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-09-18 17:19:41 -0400
commit467844d7d3f703f99fcde1f951f33efda5e90074 (patch)
treef8a99f3eb12fed2ddda2c9b237c1436c64a18c20
parentba27483c6a00ba36fd57150f338afc540d10b7f9 (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.
-rw-r--r--Utility/WebApp.hs10
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]