using System; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; namespace Max2Babylon { public static class WebServer { private static readonly HttpListener listener; private static Task runningTask; const string HtmlResponseText = @" Babylon.js "; public const int Port = 45478; public static bool IsSupported { get; private set; } static WebServer() { listener = new HttpListener(); if (!HttpListener.IsSupported) { IsSupported = false; return; } try { listener.Prefixes.Add("http://localhost:" + Port + "/"); listener.Start(); } catch { IsSupported = false; return; } runningTask = Task.Run(() => Listen()); IsSupported = true; } public static string SceneFilename { get; set; } public static string SceneFolder { get; set; } static void Listen() { try { while (listener.IsListening) { var context = listener.GetContext(); var request = context.Request; var url = request.Url; if (string.IsNullOrEmpty(url.PathAndQuery) || url.PathAndQuery == "/") { var responseText = HtmlResponseText.Replace("###SCENE###", SceneFilename); WriteResponse(context, responseText); } else { try { var buffer = File.ReadAllBytes(Path.Combine(SceneFolder, url.PathAndQuery.Substring(1))); WriteResponse(context, buffer); } catch { context.Response.StatusCode = 404; context.Response.Close(); } } } } catch { } } static void WriteResponse(HttpListenerContext context, string s) { WriteResponse(context.Response, s); } static void WriteResponse(HttpListenerContext context, byte[] buffer) { WriteResponse(context.Response, buffer); } static void WriteResponse(HttpListenerResponse response, string s) { byte[] buffer = Encoding.UTF8.GetBytes(s); WriteResponse(response, buffer); } static void WriteResponse(HttpListenerResponse response, byte[] buffer) { response.ContentLength64 = buffer.Length; Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); } } }