Пример #1
0
        private async void DoWork()
        {
            for (int i = parserSettings.StartPoint; i < parserSettings.EndPoint; i++)
            {
                if (!IsActive)
                {
                    OnParseCompleted?.Invoke(this);
                    return;
                }

                var source = await loader.GetSourceByPageId(i);

                var domParser = new AngleSharp.Html.Parser.HtmlParser();

                var document = await domParser.ParseDocumentAsync(source, token.Token);

                var parseResult = parser.Parse(document);
                OnNewData?.Invoke(this, parseResult);
            }

            OnParseCompleted?.Invoke(this);
            IsActive = false;
        }
Пример #2
0
        public async Task <string> FetchLatestStableBuildAsync(CancellationToken cancellationToken = default)
        {
            await Semaphore.WaitAsync(cancellationToken);

            try
            {
                cancellationToken.ThrowIfCancellationRequested();
                Directory.CreateDirectory(_options.Value.BuildLocation);

                var client    = new WebClient();
                var serverUrl = new Uri(_options.Value.ArtifactServer, UriKind.Absolute);

                _logger?.LogDebug("GET {ServerUrl}", serverUrl);

                string html;
                try
                {
                    html = await client.DownloadStringTaskAsync(serverUrl);
                }
                catch (Exception e)
                {
                    _logger?.LogError(e, "Error downloading from artifact server");
                    return(null);
                }

                var parser   = new AngleSharp.Html.Parser.HtmlParser();
                var document = await parser.ParseDocumentAsync(html, cancellationToken);

                var tds = document.QuerySelectorAll("td");

                string buildNumber = null;
                var    headers     = document.QuerySelectorAll("h1");
                foreach (var h in headers)
                {
                    var text  = h.Text();
                    var match = Regex.Match(text, "Build #([0-9]+)", RegexOptions.Compiled);
                    if (match.Success)
                    {
                        buildNumber = match.Groups[1].Value;
                        _logger?.LogDebug("Found build number {BuildNumber}", buildNumber);
                    }
                }

                string buildHash = null;
                foreach (var td in tds)
                {
                    var text  = td.Text();
                    var match = Regex.Match(text, "Revision: ([\\w]+)", RegexOptions.Compiled);
                    if (match.Success)
                    {
                        buildHash = match.Groups[1].Value?.Substring(0, 11);
                        _logger?.LogDebug("Found build hash {BuildHash}", buildHash);
                    }
                }

                if (buildNumber == null || buildHash == null)
                {
                    return(null);
                }

                var artifactUrl = new Uri(string.Format(_options.Value.ArtifactMask, buildNumber, buildHash), UriKind.Absolute);
                var filePath    = Path.Combine(_options.Value.BuildLocation, artifactUrl.Segments[artifactUrl.Segments.Length - 1]);
                if (File.Exists(filePath))
                {
                    _logger?.LogDebug("Build archive already fetched.");
                    return(buildHash);
                }

                _logger?.LogDebug("Downloading build archive from {ArtifactUrl} to {FilePath}", artifactUrl, filePath);
                try
                {
                    await client.DownloadFileTaskAsync(artifactUrl, filePath);

                    return(!File.Exists(filePath) ? null : buildHash);
                }
                catch (Exception e)
                {
                    _logger?.LogError(e, "Error downloading {FilePath} from {ArtifactUrl}", filePath, artifactUrl);
                    return(null);
                }
            }
            finally
            {
                Semaphore.Release();
            }
        }