Windows Hosts file consente di associare un IP a host name che ha una maggiore libertà rispetto a un normale nome di dominio Internet. Mi piacerebbe creare una funzione che determina se un determinato nome sarebbe un nome di dominio di file "host" valido.Il modo migliore per determinare se un nome di dominio sarebbe valido in un file "host"?
Sulla base this answer e sperimentazione di ciò che funziona e non lo fa, mi si avvicinò con questa funzione:
private static bool IsValidDomainName(string domain)
{
if (String.IsNullOrEmpty(domain) || domain.Length > 255)
{
return false;
}
Uri uri;
if (!Uri.TryCreate("http://" + domain, UriKind.Absolute, out uri))
{
return false;
}
if (!String.Equals(uri.Host, domain, StringComparison.OrdinalIgnoreCase) || !uri.IsWellFormedOriginalString())
{
return false;
}
foreach (string part in uri.Host.Split('.'))
{
if (part.Length > 63)
{
return false;
}
}
return true;
}
Essa ha anche il vantaggio che dovrebbe funzionare con i nomi Unicode (dove una regex base fallirebbe).
Esiste un modo migliore/più elegante per farlo?
UPDATE: Come suggerito dal Bill, il metodo Uri.CheckHostName fa quasi quello che voglio, ma non consente nomi host come "-test" che Windows permette in un file "hosts". Vorrei caso speciale la parte "-", ma sono preoccupato che ci siano più casi speciali.
notare che anche passando stringa null o vuota restituisce la risposta corretta. – Bill
Non avevo ancora visto questo metodo. L'ho perso nel mio Reflector-ing. È meglio del mio hack "http", ma il file hosts consente "-test" per un nome, ma questa funzione dice che non è valido. –
Il prefisso "http" hack correttamente consente il caso "-test", ma l'utilizzo di Uri.CheckHostName non lo consente. –