|
31 | 31 | using System.Collections.Generic;
|
32 | 32 | using System.IO;
|
33 | 33 | using System.Net;
|
| 34 | +#if (NET8_0_OR_GREATER) |
| 35 | +using System.Linq; |
| 36 | +using System.Net.Http; |
| 37 | +using System.Net.Http.Headers; |
| 38 | +using System.Security.Cryptography.X509Certificates; |
| 39 | +#endif |
34 | 40 | using System.Net.Security;
|
35 | 41 | using System.Threading;
|
36 | 42 | using Newtonsoft.Json;
|
@@ -177,7 +183,13 @@ public JsonRpcClient(string baseUrl)
|
177 | 183 | public bool AllowAutoRedirect { get; set; }
|
178 | 184 | public bool PreAuthenticate { get; set; }
|
179 | 185 | public CookieContainer Cookies { get; set; }
|
| 186 | + |
| 187 | +#if (NET8_0_OR_GREATER) |
| 188 | + public Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool> ServerCertificateValidationCallback { get; set; } |
| 189 | +#else |
180 | 190 | public RemoteCertificateValidationCallback ServerCertificateValidationCallback { get; set; }
|
| 191 | +#endif |
| 192 | + |
181 | 193 | public Dictionary<string, string> RequestHeaders { get; set; }
|
182 | 194 | public Dictionary<string, string> ResponseHeaders { get; set; }
|
183 | 195 |
|
@@ -264,9 +276,65 @@ protected virtual T Rpc<T>(string callName, JToken parameters, JsonSerializer se
|
264 | 276 | }
|
265 | 277 | }
|
266 | 278 |
|
267 |
| - |
268 | 279 | protected virtual void PerformPostRequest(Stream postStream, Stream responseStream)
|
269 | 280 | {
|
| 281 | +#if (NET8_0_OR_GREATER) |
| 282 | + HttpClient httpClient = null; |
| 283 | + HttpClientHandler httpHandler = null; |
| 284 | + HttpRequestMessage requestMessage = null; |
| 285 | + HttpResponseMessage responseMessage = null; |
| 286 | + |
| 287 | + try |
| 288 | + { |
| 289 | + httpHandler = new HttpClientHandler |
| 290 | + { |
| 291 | + AllowAutoRedirect = AllowAutoRedirect, |
| 292 | + PreAuthenticate = PreAuthenticate, |
| 293 | + CookieContainer = Cookies ?? new CookieContainer(), |
| 294 | + Proxy = WebProxy |
| 295 | + }; |
| 296 | + |
| 297 | + Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool> callBack = null; |
| 298 | + if (ServicePointManager.ServerCertificateValidationCallback != null) |
| 299 | + callBack = ServicePointManager.ServerCertificateValidationCallback.Invoke; |
| 300 | + |
| 301 | + httpHandler.ServerCertificateCustomValidationCallback = ServerCertificateValidationCallback ?? callBack; |
| 302 | + |
| 303 | + httpClient = new HttpClient(httpHandler) { Timeout = TimeSpan.FromMilliseconds(Timeout) }; |
| 304 | + |
| 305 | + requestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(JsonRpcUrl)); |
| 306 | + if (ProtocolVersion != null) |
| 307 | + requestMessage.Version = ProtocolVersion; |
| 308 | + requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); |
| 309 | + requestMessage.Headers.UserAgent.ParseAdd(UserAgent); |
| 310 | + requestMessage.Headers.ConnectionClose = !KeepAlive; |
| 311 | + requestMessage.Headers.ExpectContinue = Expect100Continue; |
| 312 | + requestMessage.Content = new StreamContent(postStream); |
| 313 | + |
| 314 | + if (RequestHeaders != null) |
| 315 | + { |
| 316 | + foreach (var header in RequestHeaders) |
| 317 | + requestMessage.Headers.Add(header.Key, header.Value); |
| 318 | + } |
| 319 | + |
| 320 | + responseMessage = httpClient.SendAsync(requestMessage).Result; |
| 321 | + responseMessage.EnsureSuccessStatusCode(); |
| 322 | + |
| 323 | + var str = responseMessage.Content.ReadAsStream(); |
| 324 | + str.CopyTo(responseStream); |
| 325 | + responseStream.Flush(); |
| 326 | + |
| 327 | + ResponseHeaders = responseMessage.Headers.ToDictionary(header => header.Key, header => string.Join(",", header.Value)); |
| 328 | + } |
| 329 | + finally |
| 330 | + { |
| 331 | + RequestHeaders = null; |
| 332 | + responseMessage?.Dispose(); |
| 333 | + requestMessage?.Dispose(); |
| 334 | + httpClient?.Dispose(); |
| 335 | + httpHandler?.Dispose(); |
| 336 | + } |
| 337 | +#else |
270 | 338 | var webRequest = (HttpWebRequest)WebRequest.Create(JsonRpcUrl);
|
271 | 339 | webRequest.Method = "POST";
|
272 | 340 | webRequest.ContentType = "application/json";
|
@@ -329,6 +397,7 @@ protected virtual void PerformPostRequest(Stream postStream, Stream responseStre
|
329 | 397 | RequestHeaders = null;
|
330 | 398 | webResponse?.Dispose();
|
331 | 399 | }
|
| 400 | +#endif |
332 | 401 | }
|
333 | 402 |
|
334 | 403 | private JsonSerializerSettings CreateSettings(IList<JsonConverter> converters)
|
|
0 commit comments