-
-
Save KazWolfe/c110d101ecd00810cc89c13413495754 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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