Skip to content

Instantly share code, notes, and snippets.

@KazWolfe
Created April 12, 2023 03:59
Show Gist options
  • Save KazWolfe/c110d101ecd00810cc89c13413495754 to your computer and use it in GitHub Desktop.
Save KazWolfe/c110d101ecd00810cc89c13413495754 to your computer and use it in GitHub Desktop.
Subject: [PATCH] fix: EndPointManager can handle multiple DNS resolutions properly
---
Index: src/EmbedIO/Net/EndPointManager.cs
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/EmbedIO/Net/EndPointManager.cs b/src/EmbedIO/Net/EndPointManager.cs
--- a/src/EmbedIO/Net/EndPointManager.cs (revision 2305190014d63f86ca036da85e426714d1e667f8)
+++ b/src/EmbedIO/Net/EndPointManager.cs (date 1681271760417)
@@ -79,28 +79,36 @@
}
// listens on all the interfaces if host name cannot be parsed by IPAddress.
- var epl = GetEpListener(lp.Host, lp.Port, listener, lp.Secure);
- epl.AddPrefix(lp, listener);
+ var epls = GetEpListeners(lp.Host, lp.Port, listener, lp.Secure);
+ foreach (var epl in epls) {
+ epl.AddPrefix(lp, listener);
+ }
}
- private static EndPointListener GetEpListener(string host, int port, HttpListener listener, bool secure = false)
+ private static List<EndPointListener> GetEpListeners(string host, int port, HttpListener listener, bool secure = false)
{
- var address = ResolveAddress(host);
+ var addresses = ResolveAddress(host);
+ var epls = new List<EndPointListener>();
- var p = IPToEndpoints.GetOrAdd(address, x => new ConcurrentDictionary<int, EndPointListener>());
- return p.GetOrAdd(port, x => new EndPointListener(listener, address, x, secure));
+ foreach (var address in addresses)
+ {
+ var p = IPToEndpoints.GetOrAdd(address, x => new ConcurrentDictionary<int, EndPointListener>());
+ epls.Add(p.GetOrAdd(port, x => new EndPointListener(listener, address, x, secure)));
+ }
+
+ return epls;
}
- private static IPAddress ResolveAddress(string host)
+ private static IPAddress[] ResolveAddress(string host)
{
if (host == "*" || host == "+" || host == "0.0.0.0")
{
- return UseIpv6 ? IPAddress.IPv6Any : IPAddress.Any;
+ return new[] { UseIpv6 ? IPAddress.IPv6Any : IPAddress.Any };
}
if (IPAddress.TryParse(host, out var address))
{
- return address;
+ return new[] { address };
}
try
@@ -110,11 +118,10 @@
AddressList = Dns.GetHostAddresses(host),
};
- return hostEntry.AddressList[0];
+ return hostEntry.AddressList;
}
- catch
- {
- return UseIpv6 ? IPAddress.IPv6Any : IPAddress.Any;
+ catch {
+ return new[] {UseIpv6 ? IPAddress.IPv6Any : IPAddress.Any};
}
}
@@ -129,8 +136,10 @@
return;
}
- var epl = GetEpListener(lp.Host, lp.Port, listener, lp.Secure);
- epl.RemovePrefix(lp);
+ var epls = GetEpListeners(lp.Host, lp.Port, listener, lp.Secure);
+ foreach (var epl in epls) {
+ epl.RemovePrefix(lp);
+ }
}
catch (SocketException)
{
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment