internal WebIOController(WebIOConfig configuration)
        {
            WebConfig      = configuration;
            Enabled        = WebConfig.Enabled;
            MaxConcurrency = WebConfig.MaximumRequestConcurrency;

            if (!Enabled)
            {
                return;
            }

            var clientHandler = new HttpClientHandler()
            {
                AllowAutoRedirect      = false,
                UseCookies             = false,
                AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
            };

            if (WebConfig.Proxy != null)
            {
                clientHandler.Proxy    = WebConfig.Proxy;
                clientHandler.UseProxy = true;
            }
            HttpClient = new HttpClient(clientHandler);
            HttpClient.DefaultRequestHeaders.Add(
                "User-Agent", "MihaZupan.MarkdownValidator-" + Config.Version.ToString());
            HttpClient.DefaultRequestHeaders.Add(
                "Accept", "*/*");
            HttpClient.DefaultRequestHeaders.Add(
                "Accept-Encoding", "gzip, deflate");
            HttpClient.DefaultRequestHeaders.Add(
                "Accept-Language", "en-GB,en;q=0.9");
            HttpClient.Timeout = TimeSpan.FromMilliseconds(WebConfig.RequestTimeout);

            DnsUnresolvableHostNames  = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            KnownGoodHostNames        = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            PendingRequestsByHostname = new Dictionary <string, HostnameRequests>(StringComparer.OrdinalIgnoreCase);
            PendingRequests           = new Dictionary <string, PendingRequest>(StringComparer.OrdinalIgnoreCase);
            RequestsInProgress        = new Dictionary <string, PendingRequest>(StringComparer.OrdinalIgnoreCase);
            CachedSites = new Dictionary <string, SiteInfo>(StringComparer.OrdinalIgnoreCase);
            DownloadableContentByHostname = new Dictionary <string, List <(string ContentType, bool IsText, Func <CleanUrl, bool> UrlSelector)> >(StringComparer.OrdinalIgnoreCase);
            UrlRewriters = new Dictionary <string, Func <Uri, Uri> >(StringComparer.OrdinalIgnoreCase);

            SchedulerMRE = new ManualResetEvent(false);
            Task.Run(() => SchedulerWorkInternal());
        }
 internal ParserRegistrationContext(ParsingController parsingController, Config configuration)
 {
     ParsingController = parsingController;
     Configuration     = configuration;
     WebIOConfig       = Configuration.WebIO;
 }