diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs index c4557b5..c9d723c 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.Designer.cs @@ -78,6 +78,15 @@ namespace WelsonJS.Launcher.Properties { } } + /// + /// https://catswords.blob.core.windows.net/welsonjs/과(와) 유사한 지역화된 문자열을 찾습니다. + /// + internal static string BlobServerPrefix { + get { + return ResourceManager.GetString("BlobServerPrefix", resourceCulture); + } + } + /// /// https://copilot.microsoft.com/과(와) 유사한 지역화된 문자열을 찾습니다. /// @@ -249,14 +258,5 @@ namespace WelsonJS.Launcher.Properties { return ResourceManager.GetString("WhoisServerUrl", resourceCulture); } } - - /// - /// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.3124.77과(와) 유사한 지역화된 문자열을 찾습니다. - /// - internal static string WhoisUserAgent { - get { - return ResourceManager.GetString("WhoisUserAgent", resourceCulture); - } - } } } diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx index 6be5c75..311ac5c 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/Properties/Resources.resx @@ -178,7 +178,7 @@ https://xn--c79as89aj0e29b77z.xn--3e0b707e/kor/whois.jsc - - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.3124.77 + + https://catswords.blob.core.windows.net/welsonjs/ \ No newline at end of file diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs index 8538054..449abcb 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; -using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; @@ -9,7 +9,6 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; -using System.Xml.Linq; namespace WelsonJS.Launcher { @@ -21,7 +20,9 @@ namespace WelsonJS.Launcher private bool _isRunning; private string _prefix; private string _resourceName; - private List _resourceTools = new List(); + private List _tools = new List(); + private const int _blobTimeout = 5000; + private readonly HttpClient _blobClient = new HttpClient(); public ResourceServer(string prefix, string resourceName) { @@ -29,14 +30,15 @@ namespace WelsonJS.Launcher _listener = new HttpListener(); _listener.Prefixes.Add(prefix); _resourceName = resourceName; + _blobClient.Timeout = TimeSpan.FromMilliseconds(_blobTimeout); // Add resource tools - _resourceTools.Add(new ResourceTools.Completion(this)); - _resourceTools.Add(new ResourceTools.Config(this)); - _resourceTools.Add(new ResourceTools.DevTools(this)); - _resourceTools.Add(new ResourceTools.DnsQuery(this)); - _resourceTools.Add(new ResourceTools.Tfa(this)); - _resourceTools.Add(new ResourceTools.Whois(this)); + _tools.Add(new ResourceTools.Completion(this)); + _tools.Add(new ResourceTools.Config(this)); + _tools.Add(new ResourceTools.DevTools(this)); + _tools.Add(new ResourceTools.DnsQuery(this)); + _tools.Add(new ResourceTools.Tfa(this)); + _tools.Add(new ResourceTools.Whois(this)); } public string GetPrefix() @@ -93,6 +95,13 @@ namespace WelsonJS.Launcher { string path = context.Request.Url.AbsolutePath.TrimStart('/'); + // Serve from a resource name + if (String.IsNullOrEmpty(path)) + { + ServeResource(context, GetResource(_resourceName), "text/html"); + return; + } + // Serve the favicon.ico file if ("favicon.ico".Equals(path, StringComparison.OrdinalIgnoreCase)) { @@ -101,20 +110,53 @@ namespace WelsonJS.Launcher } // Serve from a resource tool - foreach(var tool in _resourceTools) + foreach (var tool in _tools) { - - if (tool.CanHandle(path)) + if (tool.CanHandle(path)) { await tool.HandleAsync(context, path); return; } } - // Serve from a resource name + // Serve from the blob server + if (await ServeBlob(context, path)) return; + + // Fallback to serve from a resource name ServeResource(context, GetResource(_resourceName), "text/html"); } + private async Task ServeBlob(HttpListenerContext context, string path) + { + try + { + string blobServerPrefix = Program.GetAppConfig("BlobServerPrefix"); + string url = $"{blobServerPrefix}{path}"; + + HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.UserAgent.ParseAdd(context.Request.UserAgent); + HttpResponseMessage response = await _blobClient.SendAsync(request); + + if (!response.IsSuccessStatusCode) + { + Trace.TraceError($"Failed to serve blob. Status: {response.StatusCode}"); + return false; + } + + byte[] data = await response.Content.ReadAsByteArrayAsync(); + string mimeType = response.Content.Headers.ContentType?.MediaType ?? "application/octet-stream"; + + ServeResource(context, data, mimeType); + + return true; + } + catch (Exception ex) + { + Trace.TraceError($"Failed to serve blob. Exception: {ex.ToString()}"); + return false; + } + } + public void ServeResource(HttpListenerContext context) { ServeResource(context, "Not Found", "application/xml", 404); diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceTools/Whois.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceTools/Whois.cs index b748c48..7efe928 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceTools/Whois.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceTools/Whois.cs @@ -44,7 +44,7 @@ namespace WelsonJS.Launcher.ResourceTools }; request.Headers.Add("Accept", "*/*"); - request.Headers.Add("User-Agent", Program.GetAppConfig("WhoisUserAgent")); + request.Headers.Add("User-Agent", context.Request.UserAgent); client.DefaultRequestHeaders.Referrer = new Uri(Program.GetAppConfig("WhoisReferrerUrl")); try diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/app.config b/WelsonJS.Toolkit/WelsonJS.Launcher/app.config index 0a85782..2e92fd9 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/app.config +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/app.config @@ -9,9 +9,9 @@ - + diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/editor.html b/WelsonJS.Toolkit/WelsonJS.Launcher/editor.html index c6be876..53a1b50 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/editor.html +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/editor.html @@ -3,9 +3,9 @@ WelsonJS Editor - - - + + +