Skip to content

Commit

Permalink
core: refactor http webclient part 15 #8529
Browse files Browse the repository at this point in the history
Fix Mono 5.x and Automapper bugs
  • Loading branch information
ngosang committed Sep 21, 2020
1 parent 27fa37e commit 5ad1c9c
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 32 deletions.
35 changes: 33 additions & 2 deletions src/Jackett.Common/Utils/Clients/HttpWebClient.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using CloudflareSolverRe;
Expand All @@ -23,11 +26,41 @@ public HttpWebClient(IProcessService p, Logger l, IConfigurationService c, Serve
{
}

[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
public static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sender.GetType() != typeof(HttpWebRequest))
return sslPolicyErrors == SslPolicyErrors.None;

var request = (HttpWebRequest)sender;
var hash = certificate.GetCertHashString();


trustedCertificates.TryGetValue(hash, out var hosts);
if (hosts != null)
{
if (hosts.Contains(request.Host))
return true;
}

if (sslPolicyErrors != SslPolicyErrors.None)
{
// Throw exception with certificate details, this will cause a "Exception User-Unhandled" when running it in the Visual Studio debugger.
// The certificate is only available inside this function, so we can't catch it at the calling method.
throw new Exception("certificate validation failed: " + certificate.ToString());
}

return sslPolicyErrors == SslPolicyErrors.None;
}

public override void Init()
{
ServicePointManager.DefaultConnectionLimit = 1000;

base.Init();

// custom handler for our own internal certificates
ServicePointManager.ServerCertificateValidationCallback += ValidateCertificate;
}

protected override async Task<WebResult> Run(WebRequest webRequest)
Expand Down Expand Up @@ -60,8 +93,6 @@ protected override async Task<WebResult> Run(WebRequest webRequest)
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
})
{
// custom certificate validation handler (netcore version)
clientHandlr.ServerCertificateCustomValidationCallback = ValidateCertificate;
clearanceHandlr.InnerHandler = clientHandlr;
using (var client = new HttpClient(clearanceHandlr))
{
Expand Down
28 changes: 27 additions & 1 deletion src/Jackett.Common/Utils/Clients/HttpWebClient2.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using CloudflareSolverRe;
Expand All @@ -21,7 +24,7 @@ public class HttpWebClient2 : WebClient
private ClearanceHandler clearanceHandlr;
private HttpClientHandler clientHandlr;
private HttpClient client;

public HttpWebClient2(IProcessService p, Logger l, IConfigurationService c, ServerConfig sc)
: base(p: p,
l: l,
Expand All @@ -32,6 +35,29 @@ public HttpWebClient2(IProcessService p, Logger l, IConfigurationService c, Serv
CreateClient();
}

[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
public static bool ValidateCertificate(HttpRequestMessage request, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
var hash = certificate.GetCertHashString();


trustedCertificates.TryGetValue(hash, out var hosts);
if (hosts != null)
{
if (hosts.Contains(request.RequestUri.Host))
return true;
}

if (sslPolicyErrors != SslPolicyErrors.None)
{
// Throw exception with certificate details, this will cause a "Exception User-Unhandled" when running it in the Visual Studio debugger.
// The certificate is only available inside this function, so we can't catch it at the calling method.
throw new Exception("certificate validation failed: " + certificate.ToString());
}

return sslPolicyErrors == SslPolicyErrors.None;
}

public void CreateClient()
{
clearanceHandlr = new ClearanceHandler(BrowserUtil.ChromeUserAgent)
Expand Down
29 changes: 0 additions & 29 deletions src/Jackett.Common/Utils/Clients/WebClient.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using AutoMapper;
using com.LandonKey.SocksWebProxy;
using com.LandonKey.SocksWebProxy.Proxy;
using Jackett.Common.Models.Config;
Expand All @@ -35,31 +31,6 @@ public abstract class WebClient : IObserver<ServerConfig>
protected static string webProxyUrl;
protected static IWebProxy webProxy;


[DebuggerNonUserCode] // avoid "Exception User-Unhandled" Visual Studio messages
public static bool ValidateCertificate(HttpRequestMessage request, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
{
var hash = certificate.GetCertHashString();


trustedCertificates.TryGetValue(hash, out var hosts);
if (hosts != null)
{
if (hosts.Contains(request.RequestUri.Host))
return true;
}

if (sslPolicyErrors != SslPolicyErrors.None)
{
// Throw exception with certificate details, this will cause a "Exception User-Unhandled" when running it in the Visual Studio debugger.
// The certificate is only available inside this function, so we can't catch it at the calling method.
throw new Exception("certificate validation failed: " + certificate.ToString());
}

return sslPolicyErrors == SslPolicyErrors.None;
}
}
public static void InitProxy(ServerConfig serverConfig)
{
// dispose old SocksWebProxy
Expand Down
2 changes: 2 additions & 0 deletions src/Jackett.Server/Helper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ private static void InitAutomapper()
// TODO: fix deprecation warning (remove #pragma to see the build warning)
Mapper.Initialize(cfg =>
{
cfg.CreateMap<WebResult, WebResult>();
cfg.CreateMap<ReleaseInfo, ReleaseInfo>();
cfg.CreateMap<ReleaseInfo, TrackerCacheResult>().AfterMap((r, t) =>
Expand Down

0 comments on commit 5ad1c9c

Please sign in to comment.