Fix timeout on resolving SRV records (#1095)

This commit is contained in:
ORelio 2020-06-30 23:13:19 +02:00
parent 8b208c5520
commit c4647c35ef

View file

@ -29,12 +29,18 @@ namespace MinecraftClient.Protocol
/// <returns>TRUE if a Minecraft Service was found.</returns> /// <returns>TRUE if a Minecraft Service was found.</returns>
public static bool MinecraftServiceLookup(ref string domain, ref ushort port) public static bool MinecraftServiceLookup(ref string domain, ref ushort port)
{ {
bool foundService = false;
string domainVal = domain;
ushort portVal = port;
if (!String.IsNullOrEmpty(domain) && domain.Any(c => char.IsLetter(c))) if (!String.IsNullOrEmpty(domain) && domain.Any(c => char.IsLetter(c)))
{
AutoTimeout.Perform(() =>
{ {
try try
{ {
Console.WriteLine("Resolving {0}...", domain); Console.WriteLine("Resolving {0}...", domainVal);
Heijden.DNS.Response response = new Heijden.DNS.Resolver().Query("_minecraft._tcp." + domain, Heijden.DNS.QType.SRV); Heijden.DNS.Response response = new Heijden.DNS.Resolver().Query("_minecraft._tcp." + domainVal, Heijden.DNS.QType.SRV);
Heijden.DNS.RecordSRV[] srvRecords = response.RecordsSRV; Heijden.DNS.RecordSRV[] srvRecords = response.RecordsSRV;
if (srvRecords != null && srvRecords.Any()) if (srvRecords != null && srvRecords.Any())
{ {
@ -45,18 +51,22 @@ namespace MinecraftClient.Protocol
.ThenBy(record => Guid.NewGuid()) .ThenBy(record => Guid.NewGuid())
.First(); .First();
string target = result.TARGET.Trim('.'); string target = result.TARGET.Trim('.');
ConsoleIO.WriteLineFormatted(String.Format("§8Found server {0}:{1} for domain {2}", target, result.PORT, domain)); ConsoleIO.WriteLineFormatted(String.Format("§8Found server {0}:{1} for domain {2}", target, result.PORT, domainVal));
domain = target; domainVal = target;
port = result.PORT; portVal = result.PORT;
return true; foundService = true;
} }
} }
catch (Exception e) catch (Exception e)
{ {
ConsoleIO.WriteLineFormatted(String.Format("§8Failed to perform SRV lookup for {0}\n{1}: {2}", domain, e.GetType().FullName, e.Message)); ConsoleIO.WriteLineFormatted(String.Format("§8Failed to perform SRV lookup for {0}\n{1}: {2}", domainVal, e.GetType().FullName, e.Message));
} }
}, TimeSpan.FromSeconds(Settings.ResolveSrvRecordsShortTimeout ? 10 : 30));
} }
return false;
domain = domainVal;
port = portVal;
return foundService;
} }
/// <summary> /// <summary>