| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | using System.Net;using RestSharp;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net.Http;using System.Threading;using System.Threading.Tasks;namespace InABox.Clients{    internal static class RestClientCache    {        private static readonly Dictionary<string, Tuple<string, bool, DatabaseInfo>> _cache = new Dictionary<string, Tuple<string, bool, DatabaseInfo>>();                public static string URL(string host)        {            if (_cache.TryGetValue(host, out var value))                return value.Item1;            return "";        }        public static bool IsSecure(string host)        {            if (_cache.TryGetValue(host, out var value))                return value.Item2;            return false;        }                public static DatabaseInfo Info(string host)        {            if (_cache.TryGetValue(host, out var value))                return value.Item3;            return new DatabaseInfo();        }                    private static bool Check(string host, bool https)        {            var uri = new Uri($"http://{host}");            string schema = https ? "https" : "http";            var url = $"{schema}://{uri.Host}:{uri.Port}";            var req = new RestRequest("/info", Method.Get) { Timeout = 20000 };            var res = new RestClient(new Uri(url)).Execute(req);            if ((res.StatusCode != HttpStatusCode.OK) || (res.ErrorException != null))                return false;            try            {                var response = Core.Serialization.Deserialize<InfoResponse>(res.Content);                if (response?.Info == null)                    return false;                _cache[host] = new Tuple<string, bool, DatabaseInfo>(url, https, response.Info);                return true;            }            catch (Exception)            {                return false;            }        }                public static string Check(string server)        {            var host = server.Split(new[] { "://" }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault();                        if (string.IsNullOrWhiteSpace(host))                return "";                        if (_cache.TryGetValue(host, out var cached))                return cached.Item1;                        if (!Check(host, true))                Check(host, false);                        return _cache.TryGetValue(host, out var check) ? check.Item1 : "";        }    }}
 |