< Summary

Information
Class: GistBackend.Handlers.WebCrawlHandler.WebCrawlHandler
Assembly: GistBackend
File(s): /home/runner/work/the-gist-of-it-sec/the-gist-of-it-sec/backend/GistBackend/Handlers/WebCrawlHandler/WebCrawlHandler.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 19
Coverable lines: 19
Total lines: 42
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
FetchAsync()0%4260%

File(s)

/home/runner/work/the-gist-of-it-sec/the-gist-of-it-sec/backend/GistBackend/Handlers/WebCrawlHandler/WebCrawlHandler.cs

#LineLine coverage
 1using System.Text.Json;
 2using GistBackend.Exceptions;
 3using GistBackend.Types;
 4using GistBackend.Utils;
 5using Microsoft.Extensions.Logging;
 6using Microsoft.Extensions.Options;
 7
 8namespace GistBackend.Handlers.WebCrawlHandler;
 9
 10public interface IWebCrawlHandler
 11{
 12    Task<FetchResponse> FetchAsync(string url, CancellationToken ct);
 13}
 14
 015public class WebCrawlHandler(
 016    HttpClient httpClient,
 017    IOptions<WebCrawlHandlerOptions> options,
 018    ILogger<WebCrawlHandler>? logger = null)
 19    : IWebCrawlHandler
 20{
 021    private readonly Uri _baseAddress = new(new Uri(options.Value.Host), "fetch");
 22
 23    public async Task<FetchResponse> FetchAsync(string url, CancellationToken ct)
 24    {
 025        logger?.LogInformation("Fetching content");
 026        var parameters = new Dictionary<string, string> { { "url", url } };
 027        var query = await new FormUrlEncodedContent(parameters).ReadAsStringAsync(ct);
 028        var uriBuilder = new UriBuilder(_baseAddress) { Query = query };
 29
 030        var response = await httpClient.GetAsync(uriBuilder.Uri, ct);
 031        response.EnsureSuccessStatusCode();
 32
 033        var resultStream = await response.Content.ReadAsStreamAsync(ct);
 034        var result = await JsonSerializer.DeserializeAsync<FetchResponse>(resultStream, SerializerDefaults.JsonOptions,
 035            cancellationToken: ct);
 036        if (result is null) throw new ExternalServiceException("Failed to deserialize fetch response");
 037        logger?.LogInformation("Fetched content successfully. StatusCode: {Status}, Redirected: {Redirected}",
 038            result.Status, result.Redirected);
 39
 040        return result;
 041    }
 42}