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

f2calv / CasCap.Common / 16933690265

13 Aug 2025 09:48AM UTC coverage: 0.32%. Remained the same
16933690265

push

github

web-flow
F2calv/2025 08 updates2 (#220)

* NoWarn updates

* re-added netstandard2.0 target

0 of 352 branches covered (0.0%)

Branch coverage included in aggregate %.

0 of 7 new or added lines in 4 files covered. (0.0%)

3 existing lines in 2 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
#if NET8_0_OR_GREATER
4
public abstract class HttpClientBase
5
{
6
#pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
7
    protected ILogger _logger;
8
    protected HttpClient _client;
9
#pragma warning restore CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
10

11
    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)
12
        where TResult : class
13
        where TError : class
14
    {
15
        var res = await PostJson<TResult, TError>(requestUri, req, timeout, headers, mediaType, cancellationToken);
×
16
        return (res.result, res.error);
×
17
    }
×
18

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

38
    protected virtual async Task<(TResult? result, TError? error)>
39
        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)
40
        where TResult : class
41
        where TError : class
42
    {
43
        var res = await PostBytes<TResult, TError>(requestUri, bytes, timeout, headers, mediaType, cancellationToken);
×
44
        return (res.result, res.error);
×
45
    }
×
46

47
    protected virtual async Task<(TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders)>
48
        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)
49
        where TResult : class
50
        where TError : class
51
    {
52
        (TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders) tpl;
53
        var url = requestUri.StartsWith("http") ? requestUri : $"{_client.BaseAddress}{requestUri}";//allows us to override base url
×
54
        //_logger.LogDebug("{ClassName} {httpMethod}\t{url}", nameof(HttpClientBase), HttpMethod.Post, url);
55
        using (var request = new HttpRequestMessage(HttpMethod.Post, url))
×
56
        {
57
            request.Content = new ByteArrayContent(bytes);
×
58
            request.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
×
59
            //request.Headers.Add("Content-Type", mediaType);
60
            request.Headers.AddOrOverwrite(additionalHeaders);
×
61
            using var response = await _client.SendAsync(request, cancellationToken).ConfigureAwait(false);
×
62
            tpl = await HandleResult<TResult, TError>(response, cancellationToken);
×
63
        }
×
64
        return tpl;
×
65
    }
×
66

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

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

88
    private async Task<(TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders)>
89
        HandleResult<TResult, TError>(HttpResponseMessage response, CancellationToken cancellationToken)
90
        where TResult : class
91
        where TError : class
92
    {
93
        (TResult? result, TError? error, HttpStatusCode httpStatusCode, HttpResponseHeaders responseHeaders) tpl;
94
        tpl.httpStatusCode = response.StatusCode;
×
95
        tpl.responseHeaders = response.Headers;
×
96
        if (response.IsSuccessStatusCode)
×
97
        {
98
            if (typeof(TResult).Equals(typeof(string)))
×
99
                tpl.result = (TResult)(object)await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
×
100
            else if (typeof(TResult).Equals(typeof(byte[])))
×
101
                tpl.result = (TResult)(object)await response.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);
×
102
            else
103
                tpl.result = (await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false)).FromJson<TResult>();
×
104
            tpl.error = default;
×
105
        }
106
        else
107
        {
108
            if (typeof(TError).Equals(typeof(string)))
×
109
                tpl.error = (TError)(object)await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
×
110
            else if (typeof(TError).Equals(typeof(byte[])))
×
111
                tpl.error = (TError)(object)await response.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false);
×
112
            else
113
                tpl.error = (await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false)).FromJson<TError>();
×
NEW
114
            _logger.LogError("{ClassName} StatusCode={StatusCode}, RequestUri={RequestUri}", nameof(HttpClientBase), response.StatusCode, response.RequestMessage?.RequestUri);
×
115
            //var err = $"requestUri= fail";
116
            //if (response.RequestMessage.Content.)
117
            //if (req is not null) err += $"{json}";
118
            //throw new Exception(err);
119
            tpl.result = default;
×
120
        }
121
        return tpl;
×
122
    }
×
123
}
124
#endif
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