Files
Hermes/Hermes/CircuitManagers/HostSectionedCircuitManager.cs
2022-06-11 16:42:18 -04:00

73 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Hermes.Objects;
namespace Hermes.CircuitManagers
{
public class HostSectionedCircuitManager : OneShotRoundRobinCircuitManager
{
public Dictionary<String, Objects.Circuit> DestinationDictionary { get; set; }
public HostSectionedCircuitManager()
{
DestinationDictionary = new Dictionary<string, Circuit>();
}
protected override void AssignStream(Objects.Stream stream)
{
Circuit circ = null;
lock (DestinationDictionary)
{
if (DestinationDictionary.ContainsKey(stream.DestinationHost))
circ = DestinationDictionary[stream.DestinationHost];
else
{
circ = GetCircuitForStream(stream);
while (circ == null)
{ //There is not yet a circuit
//Wait for more circuits to build
System.Threading.Thread.Sleep(5000);
circ = GetCircuitForStream(stream);
}
DestinationDictionary.Add(stream.DestinationHost, circ);
}
}
try
{
AssignStreamToCircuit(stream, circ);
}
catch (TorControlLibrary.Exceptions.TorUnknownCircuitException e)
{ //The circuit has become invalidated, most likely due to it closing.
//cleanup
RemoveCircuit(circ);
//try
//{
// _controlConnection.CloseCircuit(circ.CircuitID);
//}
//catch (Exception) { }
//Call this function again, with hopefully better results next time
AssignStream(stream);
}
catch (TorControlLibrary.Exceptions.TorUnknownStreamException e)
{ //Stream no longer exists, clean up and exit
RemoveStream(stream);
try
{
_controlConnection.CloseStream(stream.StreamID);
}
catch (Exception) { }
}
}
public override void RemoveCircuit(Circuit circuit)
{
lock (DestinationDictionary)
{
if (DestinationDictionary.ContainsValue(circuit))
DestinationDictionary.Remove(DestinationDictionary.First(p => p.Value.Equals(circuit)).Key);
}
base.RemoveCircuit(circuit);
}
}
}