private void PopulateList(HashSet <System.Net.IPAddress> set, HashSet <IPAddressRange> ranges, HashSet <string> others, ref Regex regex, string setValue, string regexValue) { setValue = (setValue ?? string.Empty).Trim(); regexValue = (regexValue ?? string.Empty).Replace("*", @"[0-9A-Fa-f]+?").Trim(); set.Clear(); regex = null; if (!string.IsNullOrWhiteSpace(setValue)) { List <string> entries = new List <string>(); foreach (string entry in setValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(e => e.Trim())) { string entryWithoutComment = entry; int pos = entryWithoutComment.IndexOf('?'); if (pos >= 0) { entryWithoutComment = entryWithoutComment.Substring(0, pos); } entryWithoutComment = entryWithoutComment.Trim(); entries.Add(entryWithoutComment); } List <Task> entryTasks = new List <Task>(); // iterate in parallel for performance foreach (string entry in entries) { string entryWithoutComment = entry; entryTasks.Add(Task.Run(async() => { bool isUserName; if (entryWithoutComment.StartsWith("user:"******"user:"******"Unable to resolve dns for {0}: {1}", entryWithoutComment, ex.Message); lock (others) { // eat exception, nothing we can do others.Add(entryWithoutComment); } } } else { lock (others) { others.Add(entryWithoutComment); } } }
private void PopulateList(HashSet <System.Net.IPAddress> set, HashSet <IPAddressRange> ranges, HashSet <string> others, ref Regex regex, string setValue, string regexValue) { setValue = (setValue ?? string.Empty).Trim(); regexValue = (regexValue ?? string.Empty).Replace("*", @"[0-9A-Fa-f]+?").Trim(); set.Clear(); regex = null; void AddIPAddressRange(IPAddressRange range) { if (range.Begin.Equals(range.End)) { lock (set) { set.Add(range.Begin); } } else { lock (ranges) { ranges.Add(range); } } } if (!string.IsNullOrWhiteSpace(setValue)) { List <string> entries = new List <string>(); foreach (string entry in setValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(e => e.Trim())) { string entryWithoutComment = entry; int pos = entryWithoutComment.IndexOf('?'); if (pos >= 0) { entryWithoutComment = entryWithoutComment.Substring(0, pos); } entryWithoutComment = entryWithoutComment.Trim(); entries.Add(entryWithoutComment); } List <Task> entryTasks = new List <Task>(); // iterate in parallel for performance foreach (string entry in entries) { string entryWithoutComment = entry; entryTasks.Add(Task.Run(async() => { bool isUserName; if (entryWithoutComment.StartsWith("user:"******"user:"******"https://", StringComparison.OrdinalIgnoreCase) || entryWithoutComment.StartsWith("http://", StringComparison.OrdinalIgnoreCase))) { try { if (httpRequestMaker != null) { // assume url list of ips, newline delimited byte[] ipListBytes = null; Uri uri = new Uri(entryWithoutComment); await ExtensionMethods.RetryAsync(async() => ipListBytes = await httpRequestMaker.MakeRequestAsync(uri, null, ipListHeaders)); string ipList = Encoding.UTF8.GetString(ipListBytes); if (!string.IsNullOrWhiteSpace(ipList)) { foreach (string item in ipList.Split('\n')) { if (IPAddressRange.TryParse(item.Trim(), out IPAddressRange ipRangeFromUrl)) { AddIPAddressRange(ipRangeFromUrl); } } } } } catch (Exception ex) { Logger.Error(ex, "Failed to get ip list from url {0}", entryWithoutComment); } } else if (!isUserName && Uri.CheckHostName(entryWithoutComment) != UriHostNameType.Unknown) { try { // add entries for each ip address that matches the dns entry IPAddress[] addresses = null; await ExtensionMethods.RetryAsync(async() => addresses = await dns.GetHostAddressesAsync(entryWithoutComment), exceptionRetry: _ex => { // ignore host not found errors return(!(_ex is System.Net.Sockets.SocketException socketEx) || socketEx.SocketErrorCode != System.Net.Sockets.SocketError.HostNotFound); }); lock (set) { foreach (IPAddress adr in addresses) { set.Add(adr); } } } catch (Exception ex) { Logger.Debug("Unable to resolve dns for {0}: {1}", entryWithoutComment, ex.Message); lock (others) { // eat exception, nothing we can do others.Add(entryWithoutComment); } } } else { lock (others) { others.Add(entryWithoutComment); } } }