• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

f2calv / CasCap.Common / 14508401207

17 Apr 2025 05:01AM UTC coverage: 0.32% (-0.01%) from 0.334%
14508401207

push

github

web-flow
F2calv/2025 02 updates2 (#216)

* IAsyncEnumerable Ticks + cancellationtokens

* more tidy

* added xml comments

* consolidate

* xml comments and tests added

* fixes

* extension tweaks/additions

* nuget updates

* fix xml comments

* xml comments

* nuget updates

* INumber ext fun

* CancellationTokens everywhere!

* nuget updates

* rm ConsoleUIService -> now using SpectreConsole

* tidy comments/usings

* sq tweaks

* lint fixes

0 of 352 branches covered (0.0%)

Branch coverage included in aggregate %.

0 of 69 new or added lines in 5 files covered. (0.0%)

3 existing lines in 3 files now uncovered.

3 of 585 relevant lines covered (0.51%)

0.01 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/CasCap.Common.Net/Services/Base/HttpClientBase.cs
1
namespace CasCap.Services;
2

3
public abstract class HttpClientBase
4
{
5
#pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
6
    protected ILogger _logger;
7
    protected HttpClient _client;
8
#pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
9

10
    protected virtual async Task<(TResult? result, TError? error)> PostJsonAsync<TResult, TError>(string requestUri, object? req = null, TimeSpan? timeout = null, List<(string name, string value)>? headers = null, string mediaType = "application/json", CancellationToken cancellationToken = default)
11
        where TResult : class
12
        where TError : class
13
    {
NEW
14
        var res = await PostJson<TResult, TError>(requestUri, req, timeout, headers, mediaType, cancellationToken);
×
15
        return (res.result, res.error);
×
16
    }
×
17

18
    protected virtual async Task<(TResult? result, TError? error, HttpStatusCode statusCode, HttpResponseHeaders responseHeaders)>
19
        PostJson<TResult, TError>(string requestUri, object? req = null, TimeSpan? timeout = null, List<(string name, string value)>? additionalHeaders = null, string mediaType = "application/json", CancellationToken cancellationToken = default)
20
        where TResult : class
21
        where TError : class
22
    {
23
        (TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders) tpl;
24
        var url = requestUri.StartsWith("http") ? requestUri : $"{_client.BaseAddress}{requestUri}";//allows us to override base url
×
25
        //_logger.LogDebug("{className} {httpMethod}\t{url}", nameof(HttpClientBase), HttpMethod.Post, url);
26
        var json = req!.ToJson();
×
27
        using (var request = new HttpRequestMessage(HttpMethod.Post, url))//needs full url as a string as System.Uri can't cope with a colon
×
28
        {
29
            request.Content = new StringContent(json, Encoding.UTF8, mediaType);
×
30
            request.Headers.AddOrOverwrite(additionalHeaders);
×
NEW
31
            using var response = await _client.SendAsync(request, cancellationToken).ConfigureAwait(false);//need to create a new .NET Standard extension method to handle GetCT(timeout)
×
NEW
32
            tpl = await HandleResult<TResult, TError>(response, cancellationToken);
×
33
        }
×
34
        return tpl;
×
35
    }
×
36

37
    protected virtual async Task<(TResult? result, TError? error)>
38
        PostBytesAsync<TResult, TError>(string requestUri, byte[] bytes, TimeSpan? timeout = null, List<(string name, string value)>? headers = null, string mediaType = "application/octet-stream", CancellationToken cancellationToken = default)
39
        where TResult : class
40
        where TError : class
41
    {
NEW
42
        var res = await PostBytes<TResult, TError>(requestUri, bytes, timeout, headers, mediaType, cancellationToken);
×
43
        return (res.result, res.error);
×
44
    }
×
45

46
    protected virtual async Task<(TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders)>
47
        PostBytes<TResult, TError>(string requestUri, byte[] bytes, TimeSpan? timeout = null, List<(string name, string value)>? additionalHeaders = null, string mediaType = "application/octet-stream", CancellationToken cancellationToken = default)
48
        where TResult : class
49
        where TError : class
50
    {
51
        (TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders) tpl;
52
        var url = requestUri.StartsWith("http") ? requestUri : $"{_client.BaseAddress}{requestUri}";//allows us to override base url
×
53
        //_logger.LogDebug("{className} {httpMethod}\t{url}", nameof(HttpClientBase), HttpMethod.Post, url);
54
        using (var request = new HttpRequestMessage(HttpMethod.Post, url))
×
55
        {
56
            request.Content = new ByteArrayContent(bytes);
×
57
            request.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
×
58
            //request.Headers.Add("Content-Type", mediaType);
59
            request.Headers.AddOrOverwrite(additionalHeaders);
×
NEW
60
            using var response = await _client.SendAsync(request, cancellationToken).ConfigureAwait(false);
×
NEW
61
            tpl = await HandleResult<TResult, TError>(response, cancellationToken);
×
62
        }
×
63
        return tpl;
×
64
    }
×
65

66
    protected virtual async Task<(TResult? result, TError? error)>
67
        GetAsync<TResult, TError>(string requestUri, TimeSpan? timeout = null, List<(string name, string value)>? headers = null, CancellationToken cancellationToken = default)
68
        where TResult : class
69
        where TError : class
70
    {
NEW
71
        var res = await Get<TResult, TError>(requestUri, timeout, headers, cancellationToken);
×
72
        return (res.result, res.error);
×
73
    }
×
74

75
    protected virtual async Task<(TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders)>
76
        Get<TResult, TError>(string requestUri, TimeSpan? timeout = null, List<(string name, string value)>? headers = null, CancellationToken cancellationToken = default)
77
        where TResult : class
78
        where TError : class
79
    {
80
        var url = requestUri.StartsWith("http") ? requestUri : $"{_client.BaseAddress}{requestUri}";//allows us to override base url
×
81
        //_logger.LogDebug("{className} {httpMethod}\t{url}", nameof(HttpClientBase), HttpMethod.Post, url);
82
        //todo: add in headers?
NEW
83
        using var response = await _client.GetAsync(url, HttpCompletionOption.ResponseContentRead, cancellationToken).ConfigureAwait(false);
×
NEW
84
        return await HandleResult<TResult, TError>(response, cancellationToken);
×
UNCOV
85
    }
×
86

87
    private async Task<(TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders)>
88
        HandleResult<TResult, TError>(HttpResponseMessage response, CancellationToken cancellationToken)
89
        where TResult : class
90
        where TError : class
91
    {
92
        (TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders) tpl;
93
        tpl.httpStatusCode = response.StatusCode;
×
94
        tpl.responseHeaders = response.Headers;
×
95
        if (response.IsSuccessStatusCode)
×
96
        {
97
            if (typeof(TResult).Equals(typeof(string)))
×
NEW
98
                tpl.result = (TResult)(object)await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
×
99
            else if (typeof(TResult).Equals(typeof(byte[])))
×
NEW
100
                tpl.result = (TResult)(object)await response.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);
×
101
            else
NEW
102
                tpl.result = (await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false)).FromJson<TResult>();
×
103
            tpl.error = default;
×
104
        }
105
        else
106
        {
107
            if (typeof(TError).Equals(typeof(string)))
×
NEW
108
                tpl.error = (TError)(object)await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
×
109
            else if (typeof(TError).Equals(typeof(byte[])))
×
NEW
110
                tpl.error = (TError)(object)await response.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);
×
111
            else
NEW
112
                tpl.error = (await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false)).FromJson<TError>();
×
113
            _logger.LogError("{className} StatusCode={StatusCode}, RequestUri={RequestUri}", nameof(HttpClientBase), response.StatusCode, response.RequestMessage?.RequestUri);
×
114
            //var err = $"requestUri= fail";
115
            //if (response.RequestMessage.Content.)
116
            //if (req is not null) err += $"{json}";
117
            //throw new Exception(err);
118
            tpl.result = default;
×
119
        }
120
        return tpl;
×
121
    }
×
122
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc