1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
using System;
using System.Net;
using System.Net.Http;
using System.Security.Authentication;
using System.Threading;
using System.Threading.Tasks;
namespace PKISharp.WACS.Services
{
public class ProxyService
{
private readonly ILogService _log;
private IWebProxy? _proxy;
private readonly ISettingsService _settings;
private readonly VersionService _version;
public SslProtocols SslProtocols { get; set; } = SslProtocols.None;
public ProxyService(ILogService log, ISettingsService settings, VersionService version)
{
_log = log;
_settings = settings;
_version = version;
}
/// <summary>
/// Is the user requesting the system proxy
/// </summary>
public bool UseSystemProxy => string.Equals(_settings.Proxy.Url, "[System]", StringComparison.OrdinalIgnoreCase);
/// <summary>
/// Get prepared HttpClient with correct system proxy settings
/// </summary>
/// <returns></returns>
public HttpClient GetHttpClient(bool checkSsl = true)
{
var httpClientHandler = new LoggingHttpClientHandler(_log)
{
Proxy = GetWebProxy(),
SslProtocols = SslProtocols
};
if (!checkSsl)
{
httpClientHandler.ServerCertificateCustomValidationCallback = (a, b, c, d) => true;
}
if (UseSystemProxy)
{
httpClientHandler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;
}
var httpClient = new HttpClient(httpClientHandler);
httpClient.DefaultRequestHeaders.Add("User-Agent", $"win-acme/{_version.SoftwareVersion} (+https://github.com/win-acme/win-acme)");
return httpClient;
}
private class LoggingHttpClientHandler : HttpClientHandler
{
private readonly ILogService _log;
public LoggingHttpClientHandler(ILogService log) => _log = log;
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
_log.Debug("Send {method} request to {uri}", request.Method, request.RequestUri);
var response = await base.SendAsync(request, cancellationToken);
_log.Verbose("Request completed with status {s}", response.StatusCode);
return response;
}
}
/// <summary>
/// Get proxy server to use for web requests
/// </summary>
/// <returns></returns>
public IWebProxy? GetWebProxy()
{
if (_proxy == null)
{
var proxy = UseSystemProxy ?
null :
string.IsNullOrEmpty(_settings.Proxy.Url) ?
new WebProxy() :
new WebProxy(_settings.Proxy.Url);
if (proxy != null)
{
var testUrl = new Uri("http://proxy.example.com");
var proxyUrl = proxy.GetProxy(testUrl);
if (!string.IsNullOrWhiteSpace(_settings.Proxy.Username))
{
proxy.Credentials = new NetworkCredential(
_settings.Proxy.Username,
_settings.Proxy.Password);
}
var useProxy = !string.Equals(testUrl.Host, proxyUrl.Host);
if (useProxy)
{
_log.Warning("Proxying via {proxy}:{port}", proxyUrl.Host, proxyUrl.Port);
}
}
_proxy = proxy;
}
return _proxy;
}
}
}
|