Commit dfc16968 authored by justcoding121's avatar justcoding121

Reduce console write delay using Queue

parent 73ffd739
using System; using System;
using System.Collections.Concurrent;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Security; using System.Net.Security;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Titanium.Web.Proxy.EventArguments; using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Examples.Basic.Helpers;
using Titanium.Web.Proxy.Exceptions; using Titanium.Web.Proxy.Exceptions;
using Titanium.Web.Proxy.Helpers; using Titanium.Web.Proxy.Helpers;
using Titanium.Web.Proxy.Http; using Titanium.Web.Proxy.Http;
...@@ -13,14 +15,19 @@ using Titanium.Web.Proxy.StreamExtended.Network; ...@@ -13,14 +15,19 @@ using Titanium.Web.Proxy.StreamExtended.Network;
namespace Titanium.Web.Proxy.Examples.Basic namespace Titanium.Web.Proxy.Examples.Basic
{ {
public class ProxyTestController public class ProxyTestController : IDisposable
{ {
private readonly SemaphoreSlim @lock = new SemaphoreSlim(1); private readonly SemaphoreSlim @lock = new SemaphoreSlim(1);
private readonly ProxyServer proxyServer; private readonly ProxyServer proxyServer;
private ExplicitProxyEndPoint explicitEndPoint; private ExplicitProxyEndPoint explicitEndPoint;
private CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
private CancellationToken cancellationToken => cancellationTokenSource.Token;
private ConcurrentQueue<Tuple<ConsoleColor?, string>> consoleMessageQueue;
public ProxyTestController() public ProxyTestController()
{ {
consoleMessageQueue = new ConcurrentQueue<Tuple<ConsoleColor?, string>>();
Task.Run(()=> listenToConsole());
proxyServer = new ProxyServer(); proxyServer = new ProxyServer();
//proxyServer.EnableHttp2 = true; //proxyServer.EnableHttp2 = true;
...@@ -35,11 +42,11 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -35,11 +42,11 @@ namespace Titanium.Web.Proxy.Examples.Basic
{ {
if (exception is ProxyHttpException phex) if (exception is ProxyHttpException phex)
{ {
await writeToConsole(exception.Message + ": " + phex.InnerException?.Message, ConsoleColor.Red); writeToConsole(exception.Message + ": " + phex.InnerException?.Message, ConsoleColor.Red);
} }
else else
{ {
await writeToConsole(exception.Message, ConsoleColor.Red); writeToConsole(exception.Message, ConsoleColor.Red);
} }
}; };
...@@ -185,7 +192,7 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -185,7 +192,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
{ {
string hostname = e.HttpClient.Request.RequestUri.Host; string hostname = e.HttpClient.Request.RequestUri.Host;
e.GetState().PipelineInfo.AppendLine(nameof(onBeforeTunnelConnectRequest) + ":" + hostname); e.GetState().PipelineInfo.AppendLine(nameof(onBeforeTunnelConnectRequest) + ":" + hostname);
await writeToConsole("Tunnel to: " + hostname); writeToConsole("Tunnel to: " + hostname);
var clientLocalIp = e.ClientLocalEndPoint.Address; var clientLocalIp = e.ClientLocalEndPoint.Address;
if (!clientLocalIp.Equals(IPAddress.Loopback) && !clientLocalIp.Equals(IPAddress.IPv6Loopback)) if (!clientLocalIp.Equals(IPAddress.Loopback) && !clientLocalIp.Equals(IPAddress.IPv6Loopback))
...@@ -224,12 +231,12 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -224,12 +231,12 @@ namespace Titanium.Web.Proxy.Examples.Basic
{ {
var data = frame.Data.ToArray(); var data = frame.Data.ToArray();
string str = string.Join(",", data.ToArray().Select(x => x.ToString("X2"))); string str = string.Join(",", data.ToArray().Select(x => x.ToString("X2")));
writeToConsole(str, color).Wait(); writeToConsole(str, color);
} }
if (frame.OpCode == WebsocketOpCode.Text) if (frame.OpCode == WebsocketOpCode.Text)
{ {
writeToConsole(frame.GetText(), color).Wait(); writeToConsole(frame.GetText(), color);
} }
} }
} }
...@@ -257,8 +264,8 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -257,8 +264,8 @@ namespace Titanium.Web.Proxy.Examples.Basic
e.CustomUpStreamProxy = new ExternalProxy("localhost", 8888); e.CustomUpStreamProxy = new ExternalProxy("localhost", 8888);
} }
await writeToConsole("Active Client Connections:" + ((ProxyServer)sender).ClientConnectionCount); writeToConsole("Active Client Connections:" + ((ProxyServer)sender).ClientConnectionCount);
await writeToConsole(e.HttpClient.Request.Url); writeToConsole(e.HttpClient.Request.Url);
// store it in the UserData property // store it in the UserData property
// It can be a simple integer, Guid, or any type // It can be a simple integer, Guid, or any type
...@@ -301,10 +308,10 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -301,10 +308,10 @@ namespace Titanium.Web.Proxy.Examples.Basic
e.GetState().PipelineInfo.AppendLine(nameof(multipartRequestPartSent)); e.GetState().PipelineInfo.AppendLine(nameof(multipartRequestPartSent));
var session = (SessionEventArgs)sender; var session = (SessionEventArgs)sender;
await writeToConsole("Multipart form data headers:"); writeToConsole("Multipart form data headers:");
foreach (var header in e.Headers) foreach (var header in e.Headers)
{ {
await writeToConsole(header.ToString()); writeToConsole(header.ToString());
} }
} }
...@@ -318,7 +325,7 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -318,7 +325,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
e.DataReceived += WebSocket_DataReceived; e.DataReceived += WebSocket_DataReceived;
} }
await writeToConsole("Active Server Connections:" + ((ProxyServer)sender).ServerConnectionCount); writeToConsole("Active Server Connections:" + ((ProxyServer)sender).ServerConnectionCount);
string ext = System.IO.Path.GetExtension(e.HttpClient.Request.RequestUri.AbsolutePath); string ext = System.IO.Path.GetExtension(e.HttpClient.Request.RequestUri.AbsolutePath);
...@@ -364,7 +371,7 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -364,7 +371,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
private async Task onAfterResponse(object sender, SessionEventArgs e) private async Task onAfterResponse(object sender, SessionEventArgs e)
{ {
await writeToConsole($"Pipelineinfo: {e.GetState().PipelineInfo}", ConsoleColor.Yellow); writeToConsole($"Pipelineinfo: {e.GetState().PipelineInfo}", ConsoleColor.Yellow);
} }
/// <summary> /// <summary>
...@@ -399,23 +406,39 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -399,23 +406,39 @@ namespace Titanium.Web.Proxy.Examples.Basic
return Task.CompletedTask; return Task.CompletedTask;
} }
private async Task writeToConsole(string message, ConsoleColor? consoleColor = null) private void writeToConsole(string message, ConsoleColor? consoleColor = null)
{ {
await @lock.WaitAsync(); consoleMessageQueue.Enqueue(new Tuple<ConsoleColor?, string>(consoleColor, message));
}
if (consoleColor.HasValue) private void listenToConsole()
{ {
ConsoleColor existing = Console.ForegroundColor; while (!cancellationToken.IsCancellationRequested)
Console.ForegroundColor = consoleColor.Value;
Console.WriteLine(message);
Console.ForegroundColor = existing;
}
else
{ {
Console.WriteLine(message); if (consoleMessageQueue.TryDequeue(out var item))
{
var consoleColor = item.Item1;
var message = item.Item2;
if (consoleColor.HasValue)
{
ConsoleColor existing = Console.ForegroundColor;
Console.ForegroundColor = consoleColor.Value;
Console.WriteLine(message);
Console.ForegroundColor = existing;
}
else
{
Console.WriteLine(message);
}
}
} }
}
@lock.Release(); public void Dispose()
{
cancellationTokenSource.Dispose();
proxyServer.Dispose();
} }
///// <summary> ///// <summary>
......
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