From 7c19dd366ff33f1cb43131f95ba251b0683d840c Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Sun, 9 Mar 2025 23:56:38 +0900 Subject: [PATCH 1/2] Add the favicon.ico response when try a request --- .../WelsonJS.Launcher/ResourceServer.cs | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs index 290a17f..c5baa86 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs @@ -24,7 +24,7 @@ namespace WelsonJS.Launcher _prefix = prefix; _listener = new HttpListener(); _listener.Prefixes.Add(prefix); - _resourceName = typeof(ResourceServer).Namespace + "." + resourceName; + _resourceName = resourceName; } public void Start() @@ -74,31 +74,70 @@ namespace WelsonJS.Launcher private void ProcessRequest(HttpListenerContext context) { - string responseString = GetEmbeddedResource(); + string path = context.Request.Url.AbsolutePath.TrimStart('/'); - byte[] buffer = Encoding.UTF8.GetBytes(responseString); - context.Response.ContentType = "text/html"; - context.Response.ContentLength64 = buffer.Length; - context.Response.OutputStream.Write(buffer, 0, buffer.Length); + if ("favicon.ico".Equals(path, StringComparison.OrdinalIgnoreCase)) + { + ServeResource(context, GetResource("favicon"), "image/x-icon"); + return; + } + + ServeResource(context, GetResource(_resourceName), "text/html"); + } + + private void ServeResource(HttpListenerContext context, byte[] data, string mimeType = "text/html") + { + if (data == null) { + data = "text/html".Equals(mimeType, StringComparison.OrdinalIgnoreCase) ? + Encoding.UTF8.GetBytes("

Could not find the resource.

") : + Encoding.UTF8.GetBytes("Could not find the resource.") + ; + } + + context.Response.ContentType = mimeType; + context.Response.ContentLength64 = data.Length; + context.Response.OutputStream.Write(data, 0, data.Length); context.Response.OutputStream.Close(); } - private string GetEmbeddedResource() + private byte[] GetResource(string resourceName) { - var assembly = Assembly.GetExecutingAssembly(); - using (Stream stream = assembly.GetManifestResourceStream(_resourceName)) + // Find a resource from Embedded Resource + Assembly assembly = Assembly.GetExecutingAssembly(); + using (Stream stream = assembly.GetManifestResourceStream(typeof(ResourceServer).Namespace + "." + resourceName)) { - if (stream == null) + if (stream != null) { - return "

Could not find the resource.

"; - } - - using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) - { - return reader.ReadToEnd(); + using (MemoryStream memoryStream = new MemoryStream()) + { + stream.CopyTo(memoryStream); + return memoryStream.ToArray(); + } } } + + // Find a resource from Resources.resx + object resourceObject = Properties.Resources.ResourceManager.GetObject(resourceName); + switch (resourceObject) + { + case byte[] resourceBytes: // if the matched type is byte[] + return resourceBytes; + + case System.Drawing.Icon icon: // if the matched type is System.Drawing.Icon + return ConvertIconToBytes(icon); + } + + // If not found + return null; } + private byte[] ConvertIconToBytes(System.Drawing.Icon icon) + { + using (MemoryStream memoryStream = new MemoryStream()) + { + icon.Save(memoryStream); + return memoryStream.ToArray(); + } + } } } From 9213d18c90c008cd6516a0ed341698688c749fd6 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Mon, 10 Mar 2025 00:16:42 +0900 Subject: [PATCH 2/2] Reduce complexity: Splitting the GetResource method into separate methods --- .../WelsonJS.Launcher/ResourceServer.cs | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs index c5baa86..5586504 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs @@ -102,9 +102,18 @@ namespace WelsonJS.Launcher private byte[] GetResource(string resourceName) { - // Find a resource from Embedded Resource + // Try to fetch embedded resource. + byte[] data = GetEmbeddedResource(typeof(ResourceServer).Namespace + "." + resourceName); + if (data != null) return data; + + // Fallback: Try to fetch resource from ResourceManager. + return GetResourceFromManager(resourceName); + } + + private byte[] GetEmbeddedResource(string fullResourceName) + { Assembly assembly = Assembly.GetExecutingAssembly(); - using (Stream stream = assembly.GetManifestResourceStream(typeof(ResourceServer).Namespace + "." + resourceName)) + using (Stream stream = assembly.GetManifestResourceStream(fullResourceName)) { if (stream != null) { @@ -115,20 +124,21 @@ namespace WelsonJS.Launcher } } } + return null; + } - // Find a resource from Resources.resx + private byte[] GetResourceFromManager(string resourceName) + { object resourceObject = Properties.Resources.ResourceManager.GetObject(resourceName); switch (resourceObject) { - case byte[] resourceBytes: // if the matched type is byte[] + case byte[] resourceBytes: return resourceBytes; - - case System.Drawing.Icon icon: // if the matched type is System.Drawing.Icon + case System.Drawing.Icon icon: return ConvertIconToBytes(icon); + default: + return null; } - - // If not found - return null; } private byte[] ConvertIconToBytes(System.Drawing.Icon icon)