You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.0 KiB
106 lines
3.0 KiB
8 months ago
|
using System;
|
||
|
using System.Collections.Concurrent;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
using BestHTTP.Logger;
|
||
|
|
||
|
// Required for ConcurrentQueue.Clear extension.
|
||
|
using BestHTTP.Extensions;
|
||
|
|
||
|
namespace BestHTTP.Core
|
||
|
{
|
||
|
public
|
||
|
#if CSHARP_7_OR_LATER
|
||
|
readonly
|
||
|
#endif
|
||
|
struct ProtocolEventInfo
|
||
|
{
|
||
|
public readonly IProtocol Source;
|
||
|
|
||
|
public ProtocolEventInfo(IProtocol source)
|
||
|
{
|
||
|
this.Source = source;
|
||
|
}
|
||
|
|
||
|
public override string ToString()
|
||
|
{
|
||
|
return string.Format("[ProtocolEventInfo Source: {0}]", Source);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static class ProtocolEventHelper
|
||
|
{
|
||
|
private static ConcurrentQueue<ProtocolEventInfo> protocolEvents = new ConcurrentQueue<ProtocolEventInfo>();
|
||
|
private static List<IProtocol> ActiveProtocols = new List<IProtocol>(2);
|
||
|
|
||
|
#pragma warning disable 0649
|
||
|
public static Action<ProtocolEventInfo> OnEvent;
|
||
|
#pragma warning restore
|
||
|
|
||
|
public static void EnqueueProtocolEvent(ProtocolEventInfo @event)
|
||
|
{
|
||
|
if (HTTPManager.Logger.Level == Loglevels.All)
|
||
|
HTTPManager.Logger.Information("ProtocolEventHelper", "Enqueue protocol event: " + @event.ToString(), @event.Source.LoggingContext);
|
||
|
|
||
|
protocolEvents.Enqueue(@event);
|
||
|
}
|
||
|
|
||
|
internal static void Clear()
|
||
|
{
|
||
|
protocolEvents.Clear();
|
||
|
}
|
||
|
|
||
|
internal static void ProcessQueue()
|
||
|
{
|
||
|
ProtocolEventInfo protocolEvent;
|
||
|
while (protocolEvents.TryDequeue(out protocolEvent))
|
||
|
{
|
||
|
if (HTTPManager.Logger.Level == Loglevels.All)
|
||
|
HTTPManager.Logger.Information("ProtocolEventHelper", "Processing protocol event: " + protocolEvent.ToString(), protocolEvent.Source.LoggingContext);
|
||
|
|
||
|
if (OnEvent != null)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
OnEvent(protocolEvent);
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
HTTPManager.Logger.Exception("ProtocolEventHelper", "ProcessQueue", ex, protocolEvent.Source.LoggingContext);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
IProtocol protocol = protocolEvent.Source;
|
||
|
|
||
|
protocol.HandleEvents();
|
||
|
|
||
|
if (protocol.IsClosed)
|
||
|
{
|
||
|
ActiveProtocols.Remove(protocol);
|
||
|
|
||
|
HostManager.GetHost(protocol.ConnectionKey.Host)
|
||
|
.GetHostDefinition(protocol.ConnectionKey.Connection)
|
||
|
.TryToSendQueuedRequests();
|
||
|
|
||
|
protocol.Dispose();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal static void AddProtocol(IProtocol protocol)
|
||
|
{
|
||
|
ActiveProtocols.Add(protocol);
|
||
|
}
|
||
|
|
||
|
internal static void CancelActiveProtocols()
|
||
|
{
|
||
|
for (int i = 0; i < ActiveProtocols.Count; ++i)
|
||
|
{
|
||
|
var protocol = ActiveProtocols[i];
|
||
|
|
||
|
protocol.CancellationRequested();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|