From 3b8ae98b785ac257193928c3698c1ccf3d62bf85 Mon Sep 17 00:00:00 2001 From: justcoding121 Date: Wed, 10 Oct 2018 21:20:49 -0400 Subject: [PATCH 1/4] use .net core 2.1 in sample proj --- .../Titanium.Web.Proxy.Examples.Basic.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Titanium.Web.Proxy.Examples.Basic/Titanium.Web.Proxy.Examples.Basic.csproj b/examples/Titanium.Web.Proxy.Examples.Basic/Titanium.Web.Proxy.Examples.Basic.csproj index 86c0c0f31..871cc90e7 100644 --- a/examples/Titanium.Web.Proxy.Examples.Basic/Titanium.Web.Proxy.Examples.Basic.csproj +++ b/examples/Titanium.Web.Proxy.Examples.Basic/Titanium.Web.Proxy.Examples.Basic.csproj @@ -2,7 +2,7 @@ Exe - net45;netcoreapp2.0 + net45;netcoreapp2.1 false 7.1 AnyCPU;x64 From a863fd1543aa902c2fd6c1a23cc96c0f48a1e6a0 Mon Sep 17 00:00:00 2001 From: justcoding121 Date: Wed, 10 Oct 2018 22:04:34 -0400 Subject: [PATCH 2/4] fix lock issues causing memory violation --- .../ProxyTestController.cs | 45 ++++++++++--------- .../Network/CertificateManager.cs | 27 ++++++----- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs b/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs index ec3077823..2029d8e5e 100644 --- a/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs +++ b/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs @@ -16,9 +16,7 @@ namespace Titanium.Web.Proxy.Examples.Basic public class ProxyTestController { private readonly SemaphoreSlim @lock = new SemaphoreSlim(1); - private readonly ProxyServer proxyServer; - private ExplicitProxyEndPoint explicitEndPoint; public ProxyTestController() @@ -32,27 +30,13 @@ public ProxyTestController() proxyServer.ExceptionFunc = async exception => { - await @lock.WaitAsync(); - - try + if (exception is ProxyHttpException phex) { - var color = Console.ForegroundColor; - Console.ForegroundColor = ConsoleColor.Red; - if (exception is ProxyHttpException phex) - { - Console.WriteLine(exception.Message + ": " + phex.InnerException?.Message); - } - else - { - Console.WriteLine(exception.Message); - } - - Console.ForegroundColor = color; - + await WriteToConsole(exception.Message + ": " + phex.InnerException?.Message, ConsoleColor.Red); } - finally + else { - @lock.Release(); + await WriteToConsole(exception.Message, ConsoleColor.Red); } }; proxyServer.ForwardToUpstreamGateway = true; @@ -110,7 +94,7 @@ public void StartProxy() // Only explicit proxies can be set as system proxy! //proxyServer.SetAsSystemHttpProxy(explicitEndPoint); //proxyServer.SetAsSystemHttpsProxy(explicitEndPoint); - if(RunTime.IsWindows) + if (RunTime.IsWindows) { proxyServer.SetAsSystemProxy(explicitEndPoint, ProxyProtocolType.AllHttp); } @@ -281,6 +265,24 @@ private async Task WriteToConsole(string message) { await @lock.WaitAsync(); + ConsoleColor color; + + try + { + color = Console.ForegroundColor; + } + finally + { + @lock.Release(); + } + + await WriteToConsole(message, color); + } + + private async Task WriteToConsole(string message, ConsoleColor color) + { + await @lock.WaitAsync(); + try { Console.WriteLine(message); @@ -289,6 +291,7 @@ private async Task WriteToConsole(string message) { @lock.Release(); } + } ///// diff --git a/src/Titanium.Web.Proxy/Network/CertificateManager.cs b/src/Titanium.Web.Proxy/Network/CertificateManager.cs index 4fad840a2..a940ed8b4 100644 --- a/src/Titanium.Web.Proxy/Network/CertificateManager.cs +++ b/src/Titanium.Web.Proxy/Network/CertificateManager.cs @@ -60,7 +60,7 @@ public sealed class CertificateManager : IDisposable private X509Certificate2 rootCertificate; private string rootCertificateName; - + /// /// Initializes a new instance of the class. /// @@ -242,7 +242,7 @@ public X509Certificate2 RootCertificate public void Dispose() { } - + private string getRootCertificateDirectory() { string assemblyLocation = Assembly.GetExecutingAssembly().Location; @@ -427,17 +427,16 @@ internal X509Certificate2 CreateCertificate(string certificateName, bool isRootC certificate = makeCertificate(certificateName, false); // store as cache - Task.Run(() => + try + { + var exported = certificate.Export(X509ContentType.Pkcs12); + File.WriteAllBytes(certificatePath, exported); + } + catch (Exception e) { - try - { - File.WriteAllBytes(certificatePath, certificate.Export(X509ContentType.Pkcs12)); - } - catch (Exception e) - { - ExceptionFunc(new Exception("Failed to save fake certificate.", e)); - } - }); + ExceptionFunc(new Exception("Failed to save fake certificate.", e)); + } + } else { @@ -530,7 +529,7 @@ internal async void ClearIdleCertificates() await Task.Delay(1000 * 60); } } - + /// /// Stops the certificate cache clear process /// @@ -776,7 +775,7 @@ public void EnsureRootCertificate(bool userTrustRootCertificate, EnsureRootCertificate(); } - + /// /// Determines whether the root certificate is trusted. /// From 59a13ea6ce22f43a79b646223bf3fb67493da47c Mon Sep 17 00:00:00 2001 From: justcoding121 Date: Wed, 10 Oct 2018 22:13:35 -0400 Subject: [PATCH 3/4] fix console error color --- .../Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs b/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs index 2029d8e5e..c7be4f5f4 100644 --- a/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs +++ b/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs @@ -283,12 +283,16 @@ private async Task WriteToConsole(string message, ConsoleColor color) { await @lock.WaitAsync(); + ConsoleColor existing = Console.ForegroundColor; + try { + Console.ForegroundColor = color; Console.WriteLine(message); } finally { + Console.ForegroundColor = existing; @lock.Release(); } From c037b2655563abfed2b8764f51fcdfec7a52441c Mon Sep 17 00:00:00 2001 From: justcoding121 Date: Wed, 10 Oct 2018 22:18:40 -0400 Subject: [PATCH 4/4] simplify console writeline lock --- .../ProxyTestController.cs | 39 ++++++------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs b/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs index c7be4f5f4..943ea3cc7 100644 --- a/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs +++ b/examples/Titanium.Web.Proxy.Examples.Basic/ProxyTestController.cs @@ -32,11 +32,11 @@ public ProxyTestController() { if (exception is ProxyHttpException phex) { - await WriteToConsole(exception.Message + ": " + phex.InnerException?.Message, ConsoleColor.Red); + await WriteToConsole(exception.Message + ": " + phex.InnerException?.Message, true); } else { - await WriteToConsole(exception.Message, ConsoleColor.Red); + await WriteToConsole(exception.Message, true); } }; proxyServer.ForwardToUpstreamGateway = true; @@ -261,41 +261,24 @@ public Task OnCertificateSelection(object sender, CertificateSelectionEventArgs return Task.FromResult(0); } - private async Task WriteToConsole(string message) + private async Task WriteToConsole(string message, bool useRedColor = false) { await @lock.WaitAsync(); - ConsoleColor color; - - try - { - color = Console.ForegroundColor; - } - finally - { - @lock.Release(); - } - - await WriteToConsole(message, color); - } - - private async Task WriteToConsole(string message, ConsoleColor color) - { - await @lock.WaitAsync(); - - ConsoleColor existing = Console.ForegroundColor; - - try + if (useRedColor) { - Console.ForegroundColor = color; + ConsoleColor existing = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(message); + Console.ForegroundColor = existing; } - finally + else { - Console.ForegroundColor = existing; - @lock.Release(); + Console.WriteLine(message); } + @lock.Release(); + } /////