Refactor the TorWebClient
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -442,31 +442,40 @@ namespace TorWebClient
|
|||||||
}
|
}
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
try{Program.SetConsoleCtrlHandler(new HandlerRoutine(Program.ConsoleCtrlCheck),true);}
|
try
|
||||||
catch(Exception exception){Console.WriteLine(exception.ToString());}
|
|
||||||
if(!Utility.IsAdministrator())
|
|
||||||
{
|
{
|
||||||
Console.WriteLine("TorProxy needs to be under administrator account. Press any key to exit.");
|
try{Program.SetConsoleCtrlHandler(new HandlerRoutine(Program.ConsoleCtrlCheck),true);}
|
||||||
Console.ReadKey();
|
catch(Exception exception){Console.WriteLine(exception.ToString());}
|
||||||
return;
|
if(!Utility.IsAdministrator())
|
||||||
}
|
{
|
||||||
MDTrace.LogLevel=LogLevel.DEBUG;
|
Console.WriteLine("TorProxy needs to be under administrator account. Press any key to exit.");
|
||||||
String strLogFile="torwebclient.log";
|
Console.ReadKey();
|
||||||
Utility.DeleteFile(strLogFile);
|
return;
|
||||||
Trace.Listeners.Add(new TextWriterTraceListener(strLogFile));
|
}
|
||||||
|
MDTrace.LogLevel=LogLevel.DEBUG;
|
||||||
|
String strLogFile="torwebclient.log";
|
||||||
|
Utility.CopyFile(strLogFile,Utility.DateTimeToStringYYYYMMDDMMSSTT(DateTime.Now)+strLogFile);
|
||||||
|
Utility.DeleteFile(strLogFile);
|
||||||
|
Trace.Listeners.Add(new TextWriterTraceListener(strLogFile));
|
||||||
|
|
||||||
ManualResetEvent[] resetEvents=new ManualResetEvent[1];
|
ManualResetEvent[] resetEvents=new ManualResetEvent[1];
|
||||||
for(int index=0;index<resetEvents.Length;index++) resetEvents[index]=new ManualResetEvent(false);
|
for(int index=0;index<resetEvents.Length;index++) resetEvents[index]=new ManualResetEvent(false);
|
||||||
resetEvents[0].Reset();
|
resetEvents[0].Reset();
|
||||||
ThreadPool.QueueUserWorkItem(delegate
|
ThreadPool.QueueUserWorkItem(delegate
|
||||||
|
{
|
||||||
|
Program.GetInstance().Start();
|
||||||
|
Program.GetInstance().ResetEvent=resetEvents[0];
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,"Running...");
|
||||||
|
});
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,"Waiting for terminal event...");
|
||||||
|
WaitHandle.WaitAll(resetEvents);
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,"Terminated...");
|
||||||
|
}
|
||||||
|
catch(Exception exception)
|
||||||
{
|
{
|
||||||
Program.GetInstance().Start();
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Exception: {0}",exception.ToString()));
|
||||||
Program.GetInstance().ResetEvent=resetEvents[0];
|
throw;
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,"Running...");
|
}
|
||||||
});
|
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,"Waiting for terminal event...");
|
|
||||||
WaitHandle.WaitAll(resetEvents);
|
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,"Terminated...");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ using System.Net.Sockets;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using MarketData;
|
using MarketData;
|
||||||
|
using Tor.Extensions;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace Tor.Proxy
|
namespace Tor.Proxy
|
||||||
{
|
{
|
||||||
@@ -15,8 +17,8 @@ namespace Tor.Proxy
|
|||||||
internal sealed class Connection : IDisposable
|
internal sealed class Connection : IDisposable
|
||||||
{
|
{
|
||||||
private readonly Client client;
|
private readonly Client client;
|
||||||
|
|
||||||
private volatile bool disposed;
|
private volatile bool disposed;
|
||||||
|
private Profiler profiler = new Profiler();
|
||||||
private ConnectionDisposedCallback disposedCallback;
|
private ConnectionDisposedCallback disposedCallback;
|
||||||
private Dictionary<string, string> headers;
|
private Dictionary<string, string> headers;
|
||||||
private string host;
|
private string host;
|
||||||
@@ -26,6 +28,10 @@ namespace Tor.Proxy
|
|||||||
private byte[] post;
|
private byte[] post;
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
|
|
||||||
|
|
||||||
|
private Connection()
|
||||||
|
{
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="Connection"/> class.
|
/// Initializes a new instance of the <see cref="Connection"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -47,6 +53,65 @@ namespace Tor.Proxy
|
|||||||
this.GetHeaderData();
|
this.GetHeaderData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region System.IDisposable
|
||||||
|
|
||||||
|
public bool IsSocketClosed()
|
||||||
|
{
|
||||||
|
if(null==socket)return true;
|
||||||
|
return socket.IsConnected()?false:true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
|
||||||
|
/// </summary>
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Dispose(true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Releases unmanaged and - optionally - managed resources.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
|
||||||
|
private void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (disposing)
|
||||||
|
{
|
||||||
|
if (socket != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
socket.Shutdown(SocketShutdown.Both);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
socket.Dispose();
|
||||||
|
socket = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
disposed = true;
|
||||||
|
|
||||||
|
if (disposedCallback != null)
|
||||||
|
disposedCallback(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Profiler Profiler
|
||||||
|
{
|
||||||
|
get{return profiler;}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsDisposed()
|
||||||
|
{
|
||||||
|
return disposed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Properties
|
#region Properties
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -107,48 +172,7 @@ namespace Tor.Proxy
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region System.IDisposable
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose(true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Releases unmanaged and - optionally - managed resources.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
|
|
||||||
private void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposed)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (disposing)
|
|
||||||
{
|
|
||||||
if (socket != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
socket.Shutdown(SocketShutdown.Both);
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
|
|
||||||
socket.Dispose();
|
|
||||||
socket = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
disposed = true;
|
|
||||||
|
|
||||||
if (disposedCallback != null)
|
|
||||||
disposedCallback(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the header block which was dispatched with the original socket request.
|
/// Gets the header block which was dispatched with the original socket request.
|
||||||
@@ -180,9 +204,6 @@ namespace Tor.Proxy
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
// MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Reading headers from LocalEndPoint:{0}/RemoteEndPoint:{1}",Socket.LocalEndPoint,Socket.RemoteEndPoint));
|
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
|
|
||||||
using (StreamReader reader = new StreamReader(new NetworkStream(socket, false)))
|
using (StreamReader reader = new StreamReader(new NetworkStream(socket, false)))
|
||||||
|
|||||||
@@ -44,6 +44,12 @@ namespace Tor.Proxy
|
|||||||
|
|
||||||
#region System.IDisposable
|
#region System.IDisposable
|
||||||
|
|
||||||
|
|
||||||
|
public Connection Connection
|
||||||
|
{
|
||||||
|
get{return connection;}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
|
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -72,6 +78,11 @@ namespace Tor.Proxy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsDisposed()
|
||||||
|
{
|
||||||
|
return disposed;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region System.Net.Sockets.Socket
|
#region System.Net.Sockets.Socket
|
||||||
@@ -86,15 +97,14 @@ namespace Tor.Proxy
|
|||||||
{
|
{
|
||||||
if (connection != null && connection.Socket != null)
|
if (connection != null && connection.Socket != null)
|
||||||
{
|
{
|
||||||
|
connection.Profiler.Reset();
|
||||||
int received = connection.Socket.EndReceive(ar);
|
int received = connection.Socket.EndReceive(ar);
|
||||||
// MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Received {0} bytes from {1}",received,connection.Socket.RemoteEndPoint));
|
|
||||||
if (received > 0)
|
if (received > 0)
|
||||||
{
|
{
|
||||||
if (destinationSocket != null)
|
if (destinationSocket != null)
|
||||||
{
|
{
|
||||||
destinationSocket.BeginSend(connectionBuffer, 0, received, SocketFlags.None, OnDestinationSocketSent, destinationSocket);
|
destinationSocket.BeginSend(connectionBuffer, 0, received, SocketFlags.None, OnDestinationSocketSent, destinationSocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -197,9 +207,6 @@ namespace Tor.Proxy
|
|||||||
if (destinationSocket != null)
|
if (destinationSocket != null)
|
||||||
{
|
{
|
||||||
int dispatched = destinationSocket.EndSend(ar);
|
int dispatched = destinationSocket.EndSend(ar);
|
||||||
|
|
||||||
// MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Dispatched {0} bytes to {1}",dispatched,destinationSocket.RemoteEndPoint));
|
|
||||||
|
|
||||||
if (dispatched > 0)
|
if (dispatched > 0)
|
||||||
{
|
{
|
||||||
if (connection != null && connection.Socket != null)
|
if (connection != null && connection.Socket != null)
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ namespace Tor.Proxy
|
|||||||
[DebuggerStepThrough]
|
[DebuggerStepThrough]
|
||||||
public sealed class Proxy : MarshalByRefObject, IDisposable
|
public sealed class Proxy : MarshalByRefObject, IDisposable
|
||||||
{
|
{
|
||||||
|
private Thread monitorThread=null;
|
||||||
|
private volatile bool threadRun=true;
|
||||||
|
private int refreshAfter=120000;
|
||||||
|
|
||||||
private readonly Client client;
|
private readonly Client client;
|
||||||
private readonly object synchronize;
|
private readonly object synchronize;
|
||||||
private List<Connection> connections;
|
private List<Connection> connections;
|
||||||
@@ -35,6 +39,8 @@ namespace Tor.Proxy
|
|||||||
/// <param name="client">The client for which this object instance belongs.</param>
|
/// <param name="client">The client for which this object instance belongs.</param>
|
||||||
internal Proxy(Client client)
|
internal Proxy(Client client)
|
||||||
{
|
{
|
||||||
|
monitorThread=new Thread(new ThreadStart(ThreadProc));
|
||||||
|
monitorThread.Start();
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.connections = new List<Connection>();
|
this.connections = new List<Connection>();
|
||||||
this.webProxy = null;
|
this.webProxy = null;
|
||||||
@@ -126,13 +132,24 @@ namespace Tor.Proxy
|
|||||||
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
|
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
|
||||||
private void Dispose(bool disposing)
|
private void Dispose(bool disposing)
|
||||||
{
|
{
|
||||||
if (disposed)
|
if (disposed)return;
|
||||||
return;
|
|
||||||
|
|
||||||
if (disposing)
|
if (disposing)
|
||||||
{
|
{
|
||||||
lock (synchronize)
|
lock (synchronize)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if(threadRun)
|
||||||
|
{
|
||||||
|
threadRun=false;
|
||||||
|
if(null!=monitorThread)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:Dispose]Thread state is '{0}'. Joining main thread...",Utility.ThreadStateToString(monitorThread)));
|
||||||
|
monitorThread.Join(5000);
|
||||||
|
monitorThread=null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
suppressDispose = true;
|
suppressDispose = true;
|
||||||
|
|
||||||
foreach (ConnectionProcessor processor in processors)
|
foreach (ConnectionProcessor processor in processors)
|
||||||
@@ -154,53 +171,6 @@ namespace Tor.Proxy
|
|||||||
|
|
||||||
#region Tor.Net.ForwardSocket
|
#region Tor.Net.ForwardSocket
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Called when the internal listener socket accepts a TCP connection.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="ar">The asynchronous result object for this callback.</param>
|
|
||||||
//private void OnSocketAccept(IAsyncResult ar)
|
|
||||||
//{
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// if (client != null)
|
|
||||||
// {
|
|
||||||
// MDTrace.WriteLine(LogLevel.DEBUG,String.Format("INFO Accepting incoming..."));
|
|
||||||
// Socket accepted = socket.EndAccept(ar);
|
|
||||||
// MDTrace.WriteLine(LogLevel.DEBUG,String.Format("INFO Accepted connection:{0}->{1}",accepted.LocalEndPoint,accepted.RemoteEndPoint));
|
|
||||||
// Connection connection = new Connection(client, accepted, OnConnectionDisposed);
|
|
||||||
|
|
||||||
// lock (synchronize)
|
|
||||||
// {
|
|
||||||
// connections.Add(connection);
|
|
||||||
// MDTrace.WriteLine(LogLevel.DEBUG,String.Format("There are {0} connections.",connections.Count));
|
|
||||||
// }
|
|
||||||
|
|
||||||
// ConnectionProcessor processor = new ConnectionProcessor(client, connection, OnConnectionProcessorDisposed);
|
|
||||||
|
|
||||||
// lock (synchronize)
|
|
||||||
// {
|
|
||||||
// processors.Add(processor);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// processor.Start();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// catch(Exception exception)
|
|
||||||
// {
|
|
||||||
// MDTrace.WriteLine(LogLevel.DEBUG,exception.ToString());
|
|
||||||
// }
|
|
||||||
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// if (socket != null)
|
|
||||||
// socket.BeginAccept(OnSocketAccept, socket);
|
|
||||||
// }
|
|
||||||
// catch
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
private void OnSocketAccept(IAsyncResult ar)
|
private void OnSocketAccept(IAsyncResult ar)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -210,10 +180,10 @@ namespace Tor.Proxy
|
|||||||
{
|
{
|
||||||
Task workerTask= Task.Factory.StartNew( () =>
|
Task workerTask= Task.Factory.StartNew( () =>
|
||||||
{
|
{
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("INFO Accepting incoming..."));
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:OnSocketAccept] Accepting incoming..."));
|
||||||
accepted = socket.EndAccept(ar);
|
accepted = socket.EndAccept(ar);
|
||||||
if (socket != null)socket.BeginAccept(OnSocketAccept, socket);
|
if (socket != null)socket.BeginAccept(OnSocketAccept, socket);
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("INFO Accepted connection:{0}->{1}",accepted.LocalEndPoint,accepted.RemoteEndPoint));
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:OnSocketAccept] Accepted connection:{0}->{1}",accepted.LocalEndPoint,accepted.RemoteEndPoint));
|
||||||
});
|
});
|
||||||
workerTask.ContinueWith((continuation) =>
|
workerTask.ContinueWith((continuation) =>
|
||||||
{
|
{
|
||||||
@@ -222,25 +192,16 @@ namespace Tor.Proxy
|
|||||||
lock (synchronize)
|
lock (synchronize)
|
||||||
{
|
{
|
||||||
connections.Add(connection);
|
connections.Add(connection);
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("There are {0} connections.",connections.Count));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ConnectionProcessor processor = new ConnectionProcessor(client, connection, OnConnectionProcessorDisposed);
|
ConnectionProcessor processor = new ConnectionProcessor(client, connection, OnConnectionProcessorDisposed);
|
||||||
|
|
||||||
lock (synchronize)
|
lock (synchronize)
|
||||||
{
|
{
|
||||||
processors.Add(processor);
|
processors.Add(processor);
|
||||||
}
|
}
|
||||||
|
|
||||||
processor.Start();
|
processor.Start();
|
||||||
//try
|
|
||||||
//{
|
|
||||||
// if (socket != null)
|
|
||||||
// socket.BeginAccept(OnSocketAccept, socket);
|
|
||||||
//}
|
|
||||||
//catch
|
|
||||||
//{
|
|
||||||
//}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -269,8 +230,8 @@ namespace Tor.Proxy
|
|||||||
|
|
||||||
lock (synchronize)
|
lock (synchronize)
|
||||||
{
|
{
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Removing 1 connection {0}:{1}. There are {2} active connections.",connection.Host,connection.Port,connections.Count-1));
|
|
||||||
connections.Remove(connection);
|
connections.Remove(connection);
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:OnConnectionDisposed] Removed Connection for {0}:{1}. There are {2} connections.",connection.Host,connection.Port,connections.Count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,8 +250,8 @@ namespace Tor.Proxy
|
|||||||
|
|
||||||
lock (synchronize)
|
lock (synchronize)
|
||||||
{
|
{
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Disposing connection processor. There are {0} connection processors remaining.",processors.Count));
|
|
||||||
processors.Remove(processor);
|
processors.Remove(processor);
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:OnConnectionProcessorDisposed] Removed Connection Processor. There are {0} connection processors remaining.",processors.Count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,7 +281,7 @@ namespace Tor.Proxy
|
|||||||
}
|
}
|
||||||
catch(Exception exception)
|
catch(Exception exception)
|
||||||
{
|
{
|
||||||
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Proxy: Exception:{0}",exception.ToString()));
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:Start] Exception:{0}",exception.ToString()));
|
||||||
if (socket != null)
|
if (socket != null)
|
||||||
{
|
{
|
||||||
socket.Dispose();
|
socket.Dispose();
|
||||||
@@ -352,5 +313,177 @@ namespace Tor.Proxy
|
|||||||
webProxy = null;
|
webProxy = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void ThreadProc()
|
||||||
|
{
|
||||||
|
int quantums=0;
|
||||||
|
int quantumInterval=1000;
|
||||||
|
while(threadRun)
|
||||||
|
{
|
||||||
|
Thread.Sleep(quantumInterval);
|
||||||
|
if(!threadRun) break;
|
||||||
|
quantums+=quantumInterval;
|
||||||
|
if(quantums>refreshAfter)
|
||||||
|
{
|
||||||
|
quantums=0;
|
||||||
|
lock(synchronize)
|
||||||
|
{
|
||||||
|
MonitorDisposedConnections();
|
||||||
|
MonitorDisposedConnectionProcessors();
|
||||||
|
MonitorIdleConnections();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,"[Proxy:ThreadProc]Thread ended.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MonitorDisposedConnections()
|
||||||
|
{
|
||||||
|
List<Connection> connectionsToRemove=new List<Connection>();
|
||||||
|
lock(synchronize)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach(Connection connection in connections)
|
||||||
|
{
|
||||||
|
if(connection.IsDisposed())
|
||||||
|
{
|
||||||
|
connectionsToRemove.Add(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(0!=connectionsToRemove.Count)MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorDisposedConnections] Removing {0} disposed connections.",connectionsToRemove.Count));
|
||||||
|
foreach(Connection connectionToRemove in connectionsToRemove)
|
||||||
|
{
|
||||||
|
connections.Remove(connectionToRemove);
|
||||||
|
}
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorDisposedConnections] There are {0} remaining connections.",connections.Count));
|
||||||
|
}
|
||||||
|
catch(Exception exception)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorDisposedConnections] Exception:{0}",exception.ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MonitorDisposedConnectionProcessors()
|
||||||
|
{
|
||||||
|
List<ConnectionProcessor> connectionsProcessorsToRemove=new List<ConnectionProcessor>();
|
||||||
|
lock(synchronize)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach(ConnectionProcessor connectionProcessor in processors)
|
||||||
|
{
|
||||||
|
if(connectionProcessor.IsDisposed())
|
||||||
|
{
|
||||||
|
connectionsProcessorsToRemove.Add(connectionProcessor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(0!=connectionsProcessorsToRemove.Count)MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorDisposedConnectionProcessors] Removing {0} disposed connection processors.",connectionsProcessorsToRemove.Count));
|
||||||
|
foreach(ConnectionProcessor connectionProcessorToRemove in connectionsProcessorsToRemove)
|
||||||
|
{
|
||||||
|
processors.Remove(connectionProcessorToRemove);
|
||||||
|
}
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorDisposedConnectionProcessors] There are {0} remaining connection processors.",processors.Count));
|
||||||
|
}
|
||||||
|
catch(Exception exception)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorDisposedConnectionProcessors] Exception:{0}",exception.ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Idle connections where no activity for 5 minutes
|
||||||
|
// 1000*60*5
|
||||||
|
private void MonitorIdleConnections()
|
||||||
|
{
|
||||||
|
List<Connection> connectionsToRemove=new List<Connection>();
|
||||||
|
lock(synchronize)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
connectionsToRemove = connections.Where(x => x.Profiler.ElapsedTime()>300000 && x.IsSocketClosed()).ToList();
|
||||||
|
if(null!=connectionsToRemove)
|
||||||
|
{
|
||||||
|
if(0!=connectionsToRemove.Count)MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorIdleConnections] Disposing {0} idle connections",connectionsToRemove.Count));
|
||||||
|
foreach(Connection connection in connectionsToRemove)
|
||||||
|
{
|
||||||
|
RemoveConnection(connection);
|
||||||
|
}
|
||||||
|
if(0==processors.Count && 0!=connections.Count)
|
||||||
|
{
|
||||||
|
RemoveOrphanedConnections(connections);
|
||||||
|
}
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorIdleConnections] There are {0} remaining connections.",connections.Count));
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorIdleConnections] There are {0} remaining connection processors.",processors.Count));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception exception)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:MonitorIdleConnections] Exception:{0}",exception.ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove connections that are considered to be inactive and the socket is considered to be closed.
|
||||||
|
private void RemoveOrphanedConnections(List<Connection> connections)
|
||||||
|
{
|
||||||
|
lock(synchronize)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
List<Connection> connectionsToRemove=new List<Connection>();
|
||||||
|
foreach(Connection connection in connections)
|
||||||
|
{
|
||||||
|
if(connection.IsSocketClosed())
|
||||||
|
{
|
||||||
|
connectionsToRemove.Add(connection);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UInt64 lingerTimeMinutes = connection.Profiler.ElapsedTime()/1000/60;
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:RemoveOrphanedConnections] Orphaned Connection {0}:{1}. Socket reports active data but there has been no buffer exchange for {2} minutes.",connection.Host,connection.Port,lingerTimeMinutes));
|
||||||
|
if(lingerTimeMinutes>5)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:RemoveOrphanedConnections] Disposing Orphaned Connection {0}:{1}.",connection.Host,connection.Port));
|
||||||
|
connectionsToRemove.Add(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach(Connection connection in connectionsToRemove)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:RemoveOrphanedConnections] Removing orphaned connection {0}:{1} .",connection.Host,connection.Port));
|
||||||
|
connection.Dispose();
|
||||||
|
connections.Remove(connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception exception)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:RemoveOrphanedConnections] Exception:{0}",exception.ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the connection and associated connection processor
|
||||||
|
private void RemoveConnection(Connection connection)
|
||||||
|
{
|
||||||
|
lock(synchronize)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ConnectionProcessor connectionProcessor = processors.Where(x => x.Connection == connection).FirstOrDefault();
|
||||||
|
if(null!=connectionProcessor)
|
||||||
|
{
|
||||||
|
connectionProcessor.Dispose();
|
||||||
|
processors.Remove(connectionProcessor);
|
||||||
|
}
|
||||||
|
connection.Dispose();
|
||||||
|
connections.Remove(connection);
|
||||||
|
}
|
||||||
|
catch(Exception exception)
|
||||||
|
{
|
||||||
|
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[Proxy:RemoveConnection] Exception:{0}",exception.ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
<Compile Include="Events\Events\LogEvent.cs" />
|
<Compile Include="Events\Events\LogEvent.cs" />
|
||||||
<Compile Include="Events\Events\ORConnectionEvent.cs" />
|
<Compile Include="Events\Events\ORConnectionEvent.cs" />
|
||||||
<Compile Include="Events\Events\StreamEvent.cs" />
|
<Compile Include="Events\Events\StreamEvent.cs" />
|
||||||
|
<Compile Include="Extensions\Extensions.cs" />
|
||||||
<Compile Include="IO\Socks5Stream.cs" />
|
<Compile Include="IO\Socks5Stream.cs" />
|
||||||
<Compile Include="Logging\Logging.cs" />
|
<Compile Include="Logging\Logging.cs" />
|
||||||
<Compile Include="ORConnections\Enumerators\ORReason.cs" />
|
<Compile Include="ORConnections\Enumerators\ORReason.cs" />
|
||||||
@@ -123,6 +124,7 @@
|
|||||||
<Compile Include="Streams\Enumerators\StreamReason.cs" />
|
<Compile Include="Streams\Enumerators\StreamReason.cs" />
|
||||||
<Compile Include="Streams\Enumerators\StreamStatus.cs" />
|
<Compile Include="Streams\Enumerators\StreamStatus.cs" />
|
||||||
<Compile Include="Streams\Stream.cs" />
|
<Compile Include="Streams\Stream.cs" />
|
||||||
|
<Compile Include="Utility\Profiler.cs" />
|
||||||
<Compile Include="Utility\Utility.cs" />
|
<Compile Include="Utility\Utility.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Tor
|
namespace Tor
|
||||||
@@ -24,5 +25,34 @@ namespace Tor
|
|||||||
else sb.Append(String.Format(formatString.ToString(), number));
|
else sb.Append(String.Format(formatString.ToString(), number));
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String ThreadStateToString(Thread thread)
|
||||||
|
{
|
||||||
|
switch(thread.ThreadState)
|
||||||
|
{
|
||||||
|
case ThreadState.Running :
|
||||||
|
return "Running";
|
||||||
|
case ThreadState.StopRequested :
|
||||||
|
return "StopRequested";
|
||||||
|
case ThreadState.SuspendRequested :
|
||||||
|
return "SuspendRequested";
|
||||||
|
case ThreadState.Background :
|
||||||
|
return "Background";
|
||||||
|
case ThreadState.Unstarted :
|
||||||
|
return "Unstarted";
|
||||||
|
case ThreadState.Stopped :
|
||||||
|
return "Stopped";
|
||||||
|
case ThreadState.WaitSleepJoin :
|
||||||
|
return "WaitSleepJoin";
|
||||||
|
case ThreadState.Suspended :
|
||||||
|
return "Suspended";
|
||||||
|
case ThreadState.AbortRequested :
|
||||||
|
return "AbortRequested";
|
||||||
|
case ThreadState.Aborted :
|
||||||
|
return "Aborted";
|
||||||
|
default :
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -20,6 +20,7 @@ C:\boneyard\Tor.Mod\TorWebClient\TorClient\obj\Debug\Tor.pdb
|
|||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Tor.dll
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Tor.dll
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Tor.pdb
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Tor.pdb
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\MarketDataLib.dll
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\MarketDataLib.dll
|
||||||
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\MySql.Data.dll
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\HtmlAgilityPack.dll
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\HtmlAgilityPack.dll
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Newtonsoft.Json.dll
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Newtonsoft.Json.dll
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Axiom.Core.dll
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Axiom.Core.dll
|
||||||
@@ -30,9 +31,12 @@ C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\MarketDataLib.pdb
|
|||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Newtonsoft.Json.pdb
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Newtonsoft.Json.pdb
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Newtonsoft.Json.xml
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Newtonsoft.Json.xml
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Axiom.Core.pdb
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Axiom.Core.pdb
|
||||||
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\Axiom.Core.dll.config
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\System.Threading.Tasks.Extensions.xml
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\System.Threading.Tasks.Extensions.xml
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\log4net.xml
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\log4net.xml
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\System.Runtime.CompilerServices.Unsafe.xml
|
C:\boneyard\Tor\TorWebClient\TorClient\bin\Debug\System.Runtime.CompilerServices.Unsafe.xml
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.csprojResolveAssemblyReference.cache
|
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.csproj.AssemblyReference.cache
|
||||||
|
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.csproj.CoreCompileInputs.cache
|
||||||
|
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.csproj.CopyComplete
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.dll
|
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.dll
|
||||||
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.pdb
|
C:\boneyard\Tor\TorWebClient\TorClient\obj\Debug\Tor.pdb
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -66,6 +66,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="App.config">
|
<None Include="App.config">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
<None Include="app.manifest" />
|
<None Include="app.manifest" />
|
||||||
<None Include="Tor\Tor\geoip">
|
<None Include="Tor\Tor\geoip">
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -36,6 +36,7 @@ C:\boneyard\Tor.Mod\TorWebClient\obj\Debug\TorProxy.pdb
|
|||||||
C:\boneyard\Tor.Backup\TorWebClient\bin\Debug\TorProxy.exe.config
|
C:\boneyard\Tor.Backup\TorWebClient\bin\Debug\TorProxy.exe.config
|
||||||
C:\boneyard\Tor.Backup\TorWebClient\obj\Debug\TorProxy.exe
|
C:\boneyard\Tor.Backup\TorWebClient\obj\Debug\TorProxy.exe
|
||||||
C:\boneyard\Tor.Backup\TorWebClient\obj\Debug\TorProxy.pdb
|
C:\boneyard\Tor.Backup\TorWebClient\obj\Debug\TorProxy.pdb
|
||||||
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\geoip6
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libcrypto-1_1-x64.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libcrypto-1_1-x64.dll
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libevent-2-1-7.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libevent-2-1-7.dll
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libevent_core-2-1-7.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libevent_core-2-1-7.dll
|
||||||
@@ -46,14 +47,15 @@ C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libssp-0.dll
|
|||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libwinpthread-1.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\libwinpthread-1.dll
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\tor.exe
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\tor.exe
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\zlib1.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\zlib1.dll
|
||||||
|
C:\boneyard\Tor\TorWebClient\bin\Debug\App.config
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\geoip
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\geoip
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\geoip6
|
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\torrc-defaults
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor\Tor\torrc-defaults
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\TorProxy.exe.config
|
C:\boneyard\Tor\TorWebClient\bin\Debug\TorProxy.exe.config
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\TorProxy.exe
|
C:\boneyard\Tor\TorWebClient\bin\Debug\TorProxy.exe
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\TorProxy.pdb
|
C:\boneyard\Tor\TorWebClient\bin\Debug\TorProxy.pdb
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\MarketDataLib.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\MarketDataLib.dll
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Tor.dll
|
||||||
|
C:\boneyard\Tor\TorWebClient\bin\Debug\MySql.Data.dll
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\HtmlAgilityPack.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\HtmlAgilityPack.dll
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Newtonsoft.Json.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Newtonsoft.Json.dll
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Axiom.Core.dll
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Axiom.Core.dll
|
||||||
@@ -65,9 +67,12 @@ C:\boneyard\Tor\TorWebClient\bin\Debug\Tor.pdb
|
|||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Newtonsoft.Json.pdb
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Newtonsoft.Json.pdb
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Newtonsoft.Json.xml
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Newtonsoft.Json.xml
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\Axiom.Core.pdb
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Axiom.Core.pdb
|
||||||
|
C:\boneyard\Tor\TorWebClient\bin\Debug\Axiom.Core.dll.config
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\System.Threading.Tasks.Extensions.xml
|
C:\boneyard\Tor\TorWebClient\bin\Debug\System.Threading.Tasks.Extensions.xml
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\log4net.xml
|
C:\boneyard\Tor\TorWebClient\bin\Debug\log4net.xml
|
||||||
C:\boneyard\Tor\TorWebClient\bin\Debug\System.Runtime.CompilerServices.Unsafe.xml
|
C:\boneyard\Tor\TorWebClient\bin\Debug\System.Runtime.CompilerServices.Unsafe.xml
|
||||||
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.csprojResolveAssemblyReference.cache
|
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.csproj.AssemblyReference.cache
|
||||||
|
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.csproj.CoreCompileInputs.cache
|
||||||
|
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.csproj.CopyComplete
|
||||||
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.exe
|
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.exe
|
||||||
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.pdb
|
C:\boneyard\Tor\TorWebClient\obj\Debug\TorProxy.pdb
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user