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
-
-
-
+
+
+