Commit e4dfa442 authored by titanium007's avatar titanium007

issue #13 Fix

Mark items internal; keep only MRU certificates in cache
parent dfc6d9a6
namespace Titanium.Web.Proxy.Decompression namespace Titanium.Web.Proxy.Decompression
{ {
class DecompressionFactory internal class DecompressionFactory
{ {
public IDecompression Create(string type) internal IDecompression Create(string type)
{ {
switch(type) switch(type)
{ {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
namespace Titanium.Web.Proxy.Decompression namespace Titanium.Web.Proxy.Decompression
{ {
class DefaultDecompression : IDecompression internal class DefaultDecompression : IDecompression
{ {
public Task<byte[]> Decompress(byte[] compressedArray) public Task<byte[]> Decompress(byte[] compressedArray)
{ {
......
...@@ -5,7 +5,7 @@ using Titanium.Web.Proxy.Shared; ...@@ -5,7 +5,7 @@ using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Decompression namespace Titanium.Web.Proxy.Decompression
{ {
class DeflateDecompression : IDecompression internal class DeflateDecompression : IDecompression
{ {
public async Task<byte[]> Decompress(byte[] compressedArray) public async Task<byte[]> Decompress(byte[] compressedArray)
{ {
......
...@@ -5,7 +5,7 @@ using Titanium.Web.Proxy.Shared; ...@@ -5,7 +5,7 @@ using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Decompression namespace Titanium.Web.Proxy.Decompression
{ {
class GZipDecompression : IDecompression internal class GZipDecompression : IDecompression
{ {
public async Task<byte[]> Decompress(byte[] compressedArray) public async Task<byte[]> Decompress(byte[] compressedArray)
{ {
......
...@@ -3,8 +3,8 @@ using System.Threading.Tasks; ...@@ -3,8 +3,8 @@ using System.Threading.Tasks;
namespace Titanium.Web.Proxy.Decompression namespace Titanium.Web.Proxy.Decompression
{ {
interface IDecompression internal interface IDecompression
{ {
Task<byte[]> Decompress(byte[] compressedArray); Task<byte[]> Decompress(byte[] compressedArray);
} }
} }
...@@ -5,7 +5,7 @@ using Titanium.Web.Proxy.Shared; ...@@ -5,7 +5,7 @@ using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Decompression namespace Titanium.Web.Proxy.Decompression
{ {
class ZlibDecompression : IDecompression internal class ZlibDecompression : IDecompression
{ {
public async Task<byte[]> Decompress(byte[] compressedArray) public async Task<byte[]> Decompress(byte[] compressedArray)
{ {
......
...@@ -7,10 +7,10 @@ namespace Titanium.Web.Proxy.Extensions ...@@ -7,10 +7,10 @@ namespace Titanium.Web.Proxy.Extensions
/// <summary> /// <summary>
/// Extensions on HttpWebSession object /// Extensions on HttpWebSession object
/// </summary> /// </summary>
public static class HttpWebRequestExtensions internal static class HttpWebRequestExtensions
{ {
//Get encoding of the HTTP request //Get encoding of the HTTP request
public static Encoding GetEncoding(this Request request) internal static Encoding GetEncoding(this Request request)
{ {
try try
{ {
......
...@@ -4,9 +4,9 @@ using Titanium.Web.Proxy.Shared; ...@@ -4,9 +4,9 @@ using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Extensions namespace Titanium.Web.Proxy.Extensions
{ {
public static class HttpWebResponseExtensions internal static class HttpWebResponseExtensions
{ {
public static Encoding GetResponseCharacterEncoding(this Response response) internal static Encoding GetResponseCharacterEncoding(this Response response)
{ {
try try
{ {
......
...@@ -8,9 +8,9 @@ using Titanium.Web.Proxy.Shared; ...@@ -8,9 +8,9 @@ using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Extensions namespace Titanium.Web.Proxy.Extensions
{ {
public static class StreamHelper internal static class StreamHelper
{ {
public static async Task CopyToAsync(this Stream input, string initialData, Stream output) internal static async Task CopyToAsync(this Stream input, string initialData, Stream output)
{ {
if (!string.IsNullOrEmpty(initialData)) if (!string.IsNullOrEmpty(initialData))
{ {
......
using System.Net.Sockets; using System.Net.Sockets;
namespace Titanium.Web.Proxy.Extensions namespace Titanium.Web.Proxy.Extensions
{ {
internal static class TcpExtensions internal static class TcpExtensions
{ {
public static bool IsConnected(this Socket client) internal static bool IsConnected(this Socket client)
{ {
// This is how you can determine whether a socket is still connected. // This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking; bool blockingState = client.Blocking;
......
...@@ -6,24 +6,37 @@ using System.Security.Cryptography.X509Certificates; ...@@ -6,24 +6,37 @@ using System.Security.Cryptography.X509Certificates;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Threading; using System.Threading;
using System.Linq;
namespace Titanium.Web.Proxy.Helpers namespace Titanium.Web.Proxy.Helpers
{ {
public class CertificateManager : IDisposable internal class CachedCertificate
{
internal X509Certificate2 Certificate { get; set; }
internal DateTime LastAccess { get; set; }
internal CachedCertificate()
{
LastAccess = DateTime.Now;
}
}
internal class CertificateManager : IDisposable
{ {
private const string CertCreateFormat = private const string CertCreateFormat =
"-ss {0} -n \"CN={1}, O={2}\" -sky {3} -cy {4} -m 120 -a sha256 -eku 1.3.6.1.5.5.7.3.1 {5}"; "-ss {0} -n \"CN={1}, O={2}\" -sky {3} -cy {4} -m 120 -a sha256 -eku 1.3.6.1.5.5.7.3.1 {5}";
private readonly IDictionary<string, X509Certificate2> _certificateCache; private readonly IDictionary<string, CachedCertificate> certificateCache;
private static SemaphoreSlim semaphoreLock = new SemaphoreSlim(1); private static SemaphoreSlim semaphoreLock = new SemaphoreSlim(1);
public string Issuer { get; private set; } internal string Issuer { get; private set; }
public string RootCertificateName { get; private set; } internal string RootCertificateName { get; private set; }
public X509Store MyStore { get; private set; } internal X509Store MyStore { get; private set; }
public X509Store RootStore { get; private set; } internal X509Store RootStore { get; private set; }
public CertificateManager(string issuer, string rootCertificateName) internal CertificateManager(string issuer, string rootCertificateName)
{ {
Issuer = issuer; Issuer = issuer;
RootCertificateName = rootCertificateName; RootCertificateName = rootCertificateName;
...@@ -31,17 +44,17 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -31,17 +44,17 @@ namespace Titanium.Web.Proxy.Helpers
MyStore = new X509Store(StoreName.My, StoreLocation.CurrentUser); MyStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
RootStore = new X509Store(StoreName.Root, StoreLocation.CurrentUser); RootStore = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
_certificateCache = new Dictionary<string, X509Certificate2>(); certificateCache = new Dictionary<string, CachedCertificate>();
} }
/// <summary> /// <summary>
/// Attempts to move a self-signed certificate to the root store. /// Attempts to move a self-signed certificate to the root store.
/// </summary> /// </summary>
/// <returns>true if succeeded, else false</returns> /// <returns>true if succeeded, else false</returns>
public async Task<bool> CreateTrustedRootCertificate() internal async Task<bool> CreateTrustedRootCertificate()
{ {
X509Certificate2 rootCertificate = X509Certificate2 rootCertificate =
await CreateCertificate(RootStore, RootCertificateName); await CreateCertificate(RootStore, RootCertificateName, true);
return rootCertificate != null; return rootCertificate != null;
} }
...@@ -49,12 +62,12 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -49,12 +62,12 @@ namespace Titanium.Web.Proxy.Helpers
/// Attempts to remove the self-signed certificate from the root store. /// Attempts to remove the self-signed certificate from the root store.
/// </summary> /// </summary>
/// <returns>true if succeeded, else false</returns> /// <returns>true if succeeded, else false</returns>
public async Task<bool> DestroyTrustedRootCertificate() internal bool DestroyTrustedRootCertificate()
{ {
return await DestroyCertificate(RootStore, RootCertificateName); return DestroyCertificate(RootStore, RootCertificateName, false);
} }
public X509Certificate2Collection FindCertificates(string certificateSubject) internal X509Certificate2Collection FindCertificates(string certificateSubject)
{ {
return FindCertificates(MyStore, certificateSubject); return FindCertificates(MyStore, certificateSubject);
} }
...@@ -67,29 +80,36 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -67,29 +80,36 @@ namespace Titanium.Web.Proxy.Helpers
discoveredCertificates : null; discoveredCertificates : null;
} }
public async Task<X509Certificate2> CreateCertificate(string certificateName) internal async Task<X509Certificate2> CreateCertificate(string certificateName, bool isRootCertificate)
{ {
return await CreateCertificate(MyStore, certificateName); return await CreateCertificate(MyStore, certificateName, isRootCertificate);
} }
protected async virtual Task<X509Certificate2> CreateCertificate(X509Store store, string certificateName)
{
if (_certificateCache.ContainsKey(certificateName))
return _certificateCache[certificateName];
protected async virtual Task<X509Certificate2> CreateCertificate(X509Store store, string certificateName, bool isRootCertificate)
{
await semaphoreLock.WaitAsync(); await semaphoreLock.WaitAsync();
X509Certificate2 certificate = null;
try try
{ {
if (certificateCache.ContainsKey(certificateName))
{
var cached = certificateCache[certificateName];
cached.LastAccess = DateTime.Now;
return cached.Certificate;
}
X509Certificate2 certificate = null;
store.Open(OpenFlags.ReadWrite); store.Open(OpenFlags.ReadWrite);
string certificateSubject = string.Format("CN={0}, O={1}", certificateName, Issuer); string certificateSubject = string.Format("CN={0}, O={1}", certificateName, Issuer);
var certificates = X509Certificate2Collection certificates;
FindCertificates(store, certificateSubject);
if (isRootCertificate)
{
certificates = FindCertificates(store, certificateSubject);
if (certificates != null) if (certificates != null)
certificate = certificates[0]; certificate = certificates[0];
}
if (certificate == null) if (certificate == null)
{ {
...@@ -99,22 +119,26 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -99,22 +119,26 @@ namespace Titanium.Web.Proxy.Helpers
await CreateCertificate(args); await CreateCertificate(args);
certificates = FindCertificates(store, certificateSubject); certificates = FindCertificates(store, certificateSubject);
return certificates != null ? //remove it from store
certificates[0] : null; if (!isRootCertificate)
DestroyCertificate(certificateName);
if (certificates != null)
certificate = certificates[0];
} }
store.Close(); store.Close();
if (certificate != null && !_certificateCache.ContainsKey(certificateName)) if (certificate != null && !certificateCache.ContainsKey(certificateName))
_certificateCache.Add(certificateName, certificate); certificateCache.Add(certificateName, new CachedCertificate() { Certificate = certificate });
return certificate; return certificate;
} }
finally finally
{ {
semaphoreLock.Release(); semaphoreLock.Release();
} }
} }
protected virtual Task<int> CreateCertificate(string[] args) protected virtual Task<int> CreateCertificate(string[] args)
{ {
...@@ -153,40 +177,32 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -153,40 +177,32 @@ namespace Titanium.Web.Proxy.Helpers
} }
public async Task<bool> DestroyCertificate(string certificateName) internal bool DestroyCertificate(string certificateName)
{ {
return await DestroyCertificate(MyStore, certificateName); return DestroyCertificate(MyStore, certificateName, false);
} }
protected virtual async Task<bool> DestroyCertificate(X509Store store, string certificateName)
{
await semaphoreLock.WaitAsync();
protected virtual bool DestroyCertificate(X509Store store, string certificateName, bool removeFromCache)
{
X509Certificate2Collection certificates = null; X509Certificate2Collection certificates = null;
try
{
store.Open(OpenFlags.ReadWrite);
string certificateSubject = string.Format("CN={0}, O={1}", certificateName, Issuer);
store.Open(OpenFlags.ReadWrite);
string certificateSubject = string.Format("CN={0}, O={1}", certificateName, Issuer);
certificates = FindCertificates(store, certificateSubject);
if (certificates != null)
{
store.RemoveRange(certificates);
certificates = FindCertificates(store, certificateSubject); certificates = FindCertificates(store, certificateSubject);
if (certificates != null)
{
store.RemoveRange(certificates);
certificates = FindCertificates(store, certificateSubject);
}
store.Close();
if (certificates == null &&
_certificateCache.ContainsKey(certificateName))
{
_certificateCache.Remove(certificateName);
}
return certificates == null;
} }
finally
store.Close();
if (removeFromCache &&
certificateCache.ContainsKey(certificateName))
{ {
semaphoreLock.Release(); certificateCache.Remove(certificateName);
} }
return certificates == null;
} }
protected virtual string GetCertificateCreateArgs(X509Store store, string certificateName) protected virtual string GetCertificateCreateArgs(X509Store store, string certificateName)
...@@ -203,6 +219,37 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -203,6 +219,37 @@ namespace Titanium.Web.Proxy.Helpers
return certCreatArgs; return certCreatArgs;
} }
private static bool clearCertificates { get; set; }
internal void StopClearIdleCertificates()
{
clearCertificates = false;
}
internal async void ClearIdleCertificates()
{
clearCertificates = true;
while (clearCertificates)
{
await semaphoreLock.WaitAsync();
try
{
var cutOff = DateTime.Now.AddSeconds(-60);
var outdated = certificateCache
.Where(x => x.Value.LastAccess < cutOff)
.ToList();
foreach (var cache in outdated)
certificateCache.Remove(cache.Key);
}
finally { semaphoreLock.Release(); }
await Task.Delay(1000 * 60 * 3).ConfigureAwait(false);
}
}
public void Dispose() public void Dispose()
{ {
if (MyStore != null) if (MyStore != null)
......
...@@ -15,18 +15,16 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -15,18 +15,16 @@ namespace Titanium.Web.Proxy.Helpers
/// using the specified encoding /// using the specified encoding
/// as well as to read bytes as required /// as well as to read bytes as required
/// </summary> /// </summary>
public class CustomBinaryReader : IDisposable internal class CustomBinaryReader : IDisposable
{ {
private Stream stream; private Stream stream;
internal CustomBinaryReader(Stream stream) internal CustomBinaryReader(Stream stream)
{ {
this.stream = stream; this.stream = stream;
} }
internal Stream BaseStream => stream;
public Stream BaseStream => stream;
/// <summary> /// <summary>
/// Read a line from the byte stream /// Read a line from the byte stream
...@@ -41,25 +39,25 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -41,25 +39,25 @@ namespace Titanium.Web.Proxy.Helpers
var lastChar = default(char); var lastChar = default(char);
var buffer = new byte[1]; var buffer = new byte[1];
while (await this.stream.ReadAsync(buffer, 0, 1).ConfigureAwait(false) > 0) while (this.stream.Read(buffer, 0, 1) > 0)
{ {
if (lastChar == '\r' && buffer[0] == '\n') if (lastChar == '\r' && buffer[0] == '\n')
{ {
return readBuffer.Remove(readBuffer.Length - 1, 1).ToString(); return await Task.FromResult(readBuffer.Remove(readBuffer.Length - 1, 1).ToString());
} }
if (buffer[0] == '\0') if (buffer[0] == '\0')
{ {
return readBuffer.ToString(); return await Task.FromResult(readBuffer.ToString());
} }
readBuffer.Append((char)buffer[0]); readBuffer.Append((char)buffer[0]);
lastChar = (char)buffer[0]; lastChar = (char)buffer[0];
} }
return readBuffer.ToString(); return await Task.FromResult(readBuffer.ToString());
} }
catch (IOException) catch (IOException)
{ {
return readBuffer.ToString(); return await Task.FromResult(readBuffer.ToString());
} }
} }
......
...@@ -16,9 +16,9 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -16,9 +16,9 @@ namespace Titanium.Web.Proxy.Helpers
internal class HttpSystemProxyValue internal class HttpSystemProxyValue
{ {
public string HostName { get; set; } internal string HostName { get; set; }
public int Port { get; set; } internal int Port { get; set; }
public bool IsHttps { get; set; } internal bool IsHttps { get; set; }
public override string ToString() public override string ToString()
{ {
...@@ -29,12 +29,12 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -29,12 +29,12 @@ namespace Titanium.Web.Proxy.Helpers
} }
} }
public static class SystemProxyHelper internal static class SystemProxyHelper
{ {
public const int InternetOptionSettingsChanged = 39; internal const int InternetOptionSettingsChanged = 39;
public const int InternetOptionRefresh = 37; internal const int InternetOptionRefresh = 37;
public static void SetHttpProxy(string hostname, int port) internal static void SetHttpProxy(string hostname, int port)
{ {
var reg = Registry.CurrentUser.OpenSubKey( var reg = Registry.CurrentUser.OpenSubKey(
"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
...@@ -60,7 +60,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -60,7 +60,7 @@ namespace Titanium.Web.Proxy.Helpers
} }
public static void RemoveHttpProxy() internal static void RemoveHttpProxy()
{ {
var reg = Registry.CurrentUser.OpenSubKey( var reg = Registry.CurrentUser.OpenSubKey(
"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
...@@ -89,7 +89,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -89,7 +89,7 @@ namespace Titanium.Web.Proxy.Helpers
Refresh(); Refresh();
} }
public static void SetHttpsProxy(string hostname, int port) internal static void SetHttpsProxy(string hostname, int port)
{ {
var reg = Registry.CurrentUser.OpenSubKey( var reg = Registry.CurrentUser.OpenSubKey(
"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
...@@ -116,7 +116,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -116,7 +116,7 @@ namespace Titanium.Web.Proxy.Helpers
Refresh(); Refresh();
} }
public static void RemoveHttpsProxy() internal static void RemoveHttpsProxy()
{ {
var reg = Registry.CurrentUser.OpenSubKey( var reg = Registry.CurrentUser.OpenSubKey(
"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
...@@ -146,7 +146,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -146,7 +146,7 @@ namespace Titanium.Web.Proxy.Helpers
Refresh(); Refresh();
} }
public static void DisableAllProxy() internal static void DisableAllProxy()
{ {
var reg = Registry.CurrentUser.OpenSubKey( var reg = Registry.CurrentUser.OpenSubKey(
"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
......
...@@ -12,9 +12,9 @@ using Titanium.Web.Proxy.Shared; ...@@ -12,9 +12,9 @@ using Titanium.Web.Proxy.Shared;
namespace Titanium.Web.Proxy.Helpers namespace Titanium.Web.Proxy.Helpers
{ {
public class TcpHelper internal class TcpHelper
{ {
public async static Task SendRaw(Stream clientStream, string httpCmd, List<HttpHeader> requestHeaders, string hostName, internal async static Task SendRaw(Stream clientStream, string httpCmd, List<HttpHeader> requestHeaders, string hostName,
int tunnelPort, bool isHttps) int tunnelPort, bool isHttps)
{ {
StringBuilder sb = null; StringBuilder sb = null;
......
...@@ -19,7 +19,7 @@ namespace Titanium.Web.Proxy.Network ...@@ -19,7 +19,7 @@ namespace Titanium.Web.Proxy.Network
/// </summary> /// </summary>
internal SessionEventArgs Session { get; set; } internal SessionEventArgs Session { get; set; }
public CustomSslStream(Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback) internal CustomSslStream(Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback)
:base(innerStream, leaveInnerStreamOpen, userCertificateValidationCallback) :base(innerStream, leaveInnerStreamOpen, userCertificateValidationCallback)
{ {
......
...@@ -28,7 +28,6 @@ namespace Titanium.Web.Proxy.Network ...@@ -28,7 +28,6 @@ namespace Titanium.Web.Proxy.Network
internal DateTime LastAccess { get; set; } internal DateTime LastAccess { get; set; }
internal TcpConnection() internal TcpConnection()
{ {
LastAccess = DateTime.Now; LastAccess = DateTime.Now;
...@@ -192,9 +191,17 @@ namespace Titanium.Web.Proxy.Network ...@@ -192,9 +191,17 @@ namespace Titanium.Web.Proxy.Network
finally { connectionAccessLock.Release(); } finally { connectionAccessLock.Release(); }
} }
private static bool clearConenctions { get; set; }
internal static void StopClearIdleConnections()
{
clearConenctions = false;
}
internal async static void ClearIdleConnections() internal async static void ClearIdleConnections()
{ {
while (true) clearConenctions = true;
while (clearConenctions)
{ {
await connectionAccessLock.WaitAsync(); await connectionAccessLock.WaitAsync();
try try
......
...@@ -21,8 +21,7 @@ namespace Titanium.Web.Proxy ...@@ -21,8 +21,7 @@ namespace Titanium.Web.Proxy
static ProxyServer() static ProxyServer()
{ {
ProxyEndPoints = new List<ProxyEndPoint>(); ProxyEndPoints = new List<ProxyEndPoint>();
Initialize();
} }
private static CertificateManager CertManager { get; set; } private static CertificateManager CertManager { get; set; }
...@@ -58,6 +57,13 @@ namespace Titanium.Web.Proxy ...@@ -58,6 +57,13 @@ namespace Titanium.Web.Proxy
public static void Initialize() public static void Initialize()
{ {
TcpConnectionManager.ClearIdleConnections(); TcpConnectionManager.ClearIdleConnections();
CertManager.ClearIdleCertificates();
}
public static void Quit()
{
TcpConnectionManager.StopClearIdleConnections();
CertManager.StopClearIdleCertificates();
} }
public static void AddEndPoint(ProxyEndPoint endPoint) public static void AddEndPoint(ProxyEndPoint endPoint)
...@@ -153,7 +159,7 @@ namespace Titanium.Web.Proxy ...@@ -153,7 +159,7 @@ namespace Titanium.Web.Proxy
CertManager = new CertificateManager(RootCertificateIssuerName, CertManager = new CertificateManager(RootCertificateIssuerName,
RootCertificateName); RootCertificateName);
certTrusted = CertManager.CreateTrustedRootCertificate().Result; certTrusted = CertManager.CreateTrustedRootCertificate().Result;
foreach (var endPoint in ProxyEndPoints) foreach (var endPoint in ProxyEndPoints)
...@@ -161,6 +167,8 @@ namespace Titanium.Web.Proxy ...@@ -161,6 +167,8 @@ namespace Titanium.Web.Proxy
Listen(endPoint); Listen(endPoint);
} }
Initialize();
proxyRunning = true; proxyRunning = true;
} }
...@@ -186,6 +194,8 @@ namespace Titanium.Web.Proxy ...@@ -186,6 +194,8 @@ namespace Titanium.Web.Proxy
CertManager.Dispose(); CertManager.Dispose();
Quit();
proxyRunning = false; proxyRunning = false;
} }
......
...@@ -74,7 +74,7 @@ namespace Titanium.Web.Proxy ...@@ -74,7 +74,7 @@ namespace Titanium.Web.Proxy
await WriteConnectResponse(clientStreamWriter, version).ConfigureAwait(false); await WriteConnectResponse(clientStreamWriter, version).ConfigureAwait(false);
var certificate = await CertManager.CreateCertificate(httpRemoteUri.Host); var certificate = await CertManager.CreateCertificate(httpRemoteUri.Host, false);
SslStream sslStream = null; SslStream sslStream = null;
...@@ -146,7 +146,7 @@ namespace Titanium.Web.Proxy ...@@ -146,7 +146,7 @@ namespace Titanium.Web.Proxy
// certificate = CertManager.CreateCertificate(hostName); // certificate = CertManager.CreateCertificate(hostName);
//} //}
//else //else
certificate = await CertManager.CreateCertificate(endPoint.GenericCertificateName); certificate = await CertManager.CreateCertificate(endPoint.GenericCertificateName, false);
try try
{ {
......
...@@ -10,7 +10,7 @@ namespace Titanium.Web.Proxy.Shared ...@@ -10,7 +10,7 @@ namespace Titanium.Web.Proxy.Shared
/// </summary> /// </summary>
internal class Constants internal class Constants
{ {
public static readonly int BUFFER_SIZE = 8192; internal static readonly int BUFFER_SIZE = 8192;
internal static readonly char[] SpaceSplit = { ' ' }; internal static readonly char[] SpaceSplit = { ' ' };
internal static readonly char[] ColonSplit = { ':' }; internal static readonly char[] ColonSplit = { ':' };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment