diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ResourceServer.cs
index 290a17f..5586504 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,80 @@ 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))
- {
- if (stream == null)
- {
- return "Could not find the resource.
";
- }
+ // Try to fetch embedded resource.
+ byte[] data = GetEmbeddedResource(typeof(ResourceServer).Namespace + "." + resourceName);
+ if (data != null) return data;
- using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
+ // Fallback: Try to fetch resource from ResourceManager.
+ return GetResourceFromManager(resourceName);
+ }
+
+ private byte[] GetEmbeddedResource(string fullResourceName)
+ {
+ Assembly assembly = Assembly.GetExecutingAssembly();
+ using (Stream stream = assembly.GetManifestResourceStream(fullResourceName))
+ {
+ if (stream != null)
{
- return reader.ReadToEnd();
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ stream.CopyTo(memoryStream);
+ return memoryStream.ToArray();
+ }
}
}
+ return null;
+ }
+
+ private byte[] GetResourceFromManager(string resourceName)
+ {
+ object resourceObject = Properties.Resources.ResourceManager.GetObject(resourceName);
+ switch (resourceObject)
+ {
+ case byte[] resourceBytes:
+ return resourceBytes;
+ case System.Drawing.Icon icon:
+ return ConvertIconToBytes(icon);
+ default:
+ return null;
+ }
}
+ private byte[] ConvertIconToBytes(System.Drawing.Icon icon)
+ {
+ using (MemoryStream memoryStream = new MemoryStream())
+ {
+ icon.Save(memoryStream);
+ return memoryStream.ToArray();
+ }
+ }
}
}