From 475e33d290b6d959b4e09e7efb0b66ea567752c1 Mon Sep 17 00:00:00 2001 From: Aigio Liu Date: Fri, 24 Feb 2023 12:45:48 +0800 Subject: [PATCH] Misc --- .../BD.WTTS.Client.Avalonia.App.csproj | 4 +- src/BD.WTTS.Client.Avalonia.App/Program.cs | 3 - .../Program/Program.OnCreateApplication.cs | 1 + src/BD.WTTS.Client/CommandLineHost.cs | 3 +- .../Middleware/HttpReverseProxyMiddleware.cs | 75 ++++++++----------- 5 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/BD.WTTS.Client.Avalonia.App/BD.WTTS.Client.Avalonia.App.csproj b/src/BD.WTTS.Client.Avalonia.App/BD.WTTS.Client.Avalonia.App.csproj index 186ab3683..ec9ae1534 100644 --- a/src/BD.WTTS.Client.Avalonia.App/BD.WTTS.Client.Avalonia.App.csproj +++ b/src/BD.WTTS.Client.Avalonia.App/BD.WTTS.Client.Avalonia.App.csproj @@ -1,6 +1,8 @@ - + + Steam++ + OutOfProcess WinExe BD.WTTS AVALONIA;$(DefineConstants) diff --git a/src/BD.WTTS.Client.Avalonia.App/Program.cs b/src/BD.WTTS.Client.Avalonia.App/Program.cs index ec44df95e..e9caacf70 100644 --- a/src/BD.WTTS.Client.Avalonia.App/Program.cs +++ b/src/BD.WTTS.Client.Avalonia.App/Program.cs @@ -32,11 +32,8 @@ static partial class Program return 0; } #endif - MemoryPackFormatterProvider.Register(); - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - // fix The request was aborted: Could not create SSL/TLS secure channel ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; diff --git a/src/BD.WTTS.Client.Avalonia.App/Program/Program.OnCreateApplication.cs b/src/BD.WTTS.Client.Avalonia.App/Program/Program.OnCreateApplication.cs index de8291e39..a74dd888c 100644 --- a/src/BD.WTTS.Client.Avalonia.App/Program/Program.OnCreateApplication.cs +++ b/src/BD.WTTS.Client.Avalonia.App/Program/Program.OnCreateApplication.cs @@ -30,6 +30,7 @@ static partial class Program #else FileSystem2.InitFileSystem(); #endif + Repository.DataBaseDirectory = IOPath.AppDataDirectory; if (isTrace) StartWatchTrace.Record("FileSystem"); IApplication.InitLogDir(isTrace: isTrace); diff --git a/src/BD.WTTS.Client/CommandLineHost.cs b/src/BD.WTTS.Client/CommandLineHost.cs index ce7d83bea..fdb4ba1bd 100644 --- a/src/BD.WTTS.Client/CommandLineHost.cs +++ b/src/BD.WTTS.Client/CommandLineHost.cs @@ -40,8 +40,7 @@ public abstract class CommandLineHost : IDisposable if (Application != null) return Task.FromResult(Application); lock (this) { - if (_WaitForApplication == null) - _WaitForApplication = Task.Run(async () => + _WaitForApplication ??= Task.Run(async () => { while (Application == null) { diff --git a/src/BD.WTTS.Client/Services.Implementation/Accelerator/ReverseProxy/HttpServer/Middleware/HttpReverseProxyMiddleware.cs b/src/BD.WTTS.Client/Services.Implementation/Accelerator/ReverseProxy/HttpServer/Middleware/HttpReverseProxyMiddleware.cs index 6a2b6116f..1e79a953f 100644 --- a/src/BD.WTTS.Client/Services.Implementation/Accelerator/ReverseProxy/HttpServer/Middleware/HttpReverseProxyMiddleware.cs +++ b/src/BD.WTTS.Client/Services.Implementation/Accelerator/ReverseProxy/HttpServer/Middleware/HttpReverseProxyMiddleware.cs @@ -141,7 +141,7 @@ sealed class HttpReverseProxyMiddleware if (IsDomain(host)) { logger.LogWarning( - $"域名 {host} 可能已经被 DNS 污染,如果域名为本机域名,请解析为非回环 IP。"); + "域名 {host} 可能已经被 DNS 污染,如果域名为本机域名,请解析为非回环 IP。", host); domainConfig = defaultDomainConfig; return true; } @@ -172,7 +172,7 @@ sealed class HttpReverseProxyMiddleware var baseUri = new Uri(defaultValue); var result = new Uri(baseUri, destination).ToString(); - logger.LogInformation($"{defaultValue} => {result}"); + logger.LogInformation("{defaultValue} => {result}", defaultValue, result); return result; } @@ -208,6 +208,7 @@ sealed class HttpReverseProxyMiddleware if (!scripts.Any_Nullable() || context.Request.Method != HttpMethods.Get || context.Response.StatusCode != StatusCodes.Status200OK || + context.Response.ContentType == null || !context.Response.ContentType.Contains("text/html", StringComparison.OrdinalIgnoreCase)) { await ResetBody(); @@ -282,7 +283,8 @@ sealed class HttpReverseProxyMiddleware // var html_start_string = encoding.GetString(html_start.Span); //#endif await bodyCoreWriter.WriteAsync(html_start); - (var script_xml_start, var script_xml_end) = GetScriptXmls(encoding); + var script_xml_start = ""u8.ToArray(); foreach (var script in scripts) { await bodyCoreWriter.WriteAsync(script_xml_start); @@ -401,41 +403,6 @@ sealed class HttpReverseProxyMiddleware //const int BigEndianUnicodePreambleLength = 2; const int BigEndianUnicodePreambleFirst2Bytes = 0xFEFF; - static readonly object marksLock = new(); - static readonly object scriptXmlsLock = new(); - static readonly Dictionary marksDict = new(); - static readonly Dictionary scriptXmlsDict = new(); - - static (byte[] mark_start, byte[] mark_end) GetMarks(Encoding encoding) - { - var codePage = encoding.CodePage; - if (marksDict.ContainsKey(codePage)) return marksDict[codePage]; - lock (marksLock) - { - var mark_start = encoding.GetBytes(""); - var value = (mark_start, mark_end); - marksDict.Add(codePage, value); - return value; - } - } - - static (byte[] script_xml_start, byte[] script_xml_end) GetScriptXmls(Encoding encoding) - { - var codePage = encoding.CodePage; - if (scriptXmlsDict.ContainsKey(codePage)) return scriptXmlsDict[codePage]; - lock (scriptXmlsLock) - { - const string scriptXmlStart = $""; - var script_xml_start = encoding.GetBytes(scriptXmlStart); - var script_xml_end = encoding.GetBytes(scriptXmlEnd); - var value = (script_xml_start, script_xml_end); - scriptXmlsDict.Add(codePage, value); - return value; - } - } - /// /// 查找脚本注入位置 /// @@ -450,7 +417,8 @@ sealed class HttpReverseProxyMiddleware buffer = buffer_.AsMemory(); // 匹配 60 47 ... 62 - (var mark_start, var mark_end) = GetMarks(encoding); + var mark_start = ""u8.ToArray(); if (mark_start.Length <= 0 || mark_end.Length <= 0) goto notfound; int index_name_end = 0; @@ -495,9 +463,10 @@ sealed class HttpReverseProxyMiddleware var charCount = encoding.GetCharCount(bytes); if (charCount == matchCharCount) { - var name = encoding.GetString(bytes); - if (name.Equals("body", StringComparison.OrdinalIgnoreCase) || - name.Equals("head", StringComparison.OrdinalIgnoreCase)) + var body = "BODY"u8; + var head = "HEAD"u8; + if ((bytes.Length == body.Length && bytes.SequenceEqual(body, Utf8StringComparerOrdinalIgnoreCase.Instance)) || + (bytes.Length == head.Length && bytes.SequenceEqual(head, Utf8StringComparerOrdinalIgnoreCase.Instance))) { insertPosition = index_name_start - mark_start.Length; return true; @@ -517,5 +486,27 @@ sealed class HttpReverseProxyMiddleware notfound: insertPosition = -1; return false; } + + sealed class Utf8StringComparerOrdinalIgnoreCase : IEqualityComparer + { + Utf8StringComparerOrdinalIgnoreCase() { } + + public static readonly Utf8StringComparerOrdinalIgnoreCase Instance = new(); + + // https://www.geeksforgeeks.org/lower-case-upper-case-interesting-fact/ + + static byte Convert(byte b) + { + int i = b; + i &= ~32; + return (byte)i; + } + + bool IEqualityComparer.Equals(byte x, byte y) + => Convert(x) == Convert(y); + + int IEqualityComparer.GetHashCode(byte obj) + => EqualityComparer.Default.GetHashCode(Convert(obj)); + } } #endif \ No newline at end of file