using HttpServer.App; using System; using System.Net; using System.Text; using System.Threading; using System.Web; namespace HttpServer { internal static class HttpProgram { private static bool _isRunning; private static void Main(string[] args) { Console.WriteLine("Starting..."); var tWorker = new Thread(Working); _isRunning = true; tWorker.Start(); Console.WriteLine("Press ENTER to Stop."); Console.ReadLine(); Console.Write("Shutting down..."); _isRunning = false; tWorker.Join(); Console.Write("Stopped."); Console.WriteLine(); Console.Write("Press ENTER to Exit."); Console.ReadLine(); } private static void Working() { var listener = new HttpListener(); listener.Prefixes.Add(Properties.Settings.Default.ListenPrefix); listener.Start(); var upTime = DateTime.Now; Console.WriteLine($"HTTP Server started, listening on {Properties.Settings.Default.ListenPrefix}"); var task = listener.GetContextAsync(); var polling = DateTime.Now; var polled = false; while (_isRunning) { Console.CursorLeft = 0; if (false == task.Wait(500)) { var timeSpan = DateTime.Now - polling; var up = DateTime.Now - upTime; Console.Write("Polling request..." + $" {timeSpan.Days:00}D {timeSpan.Hours:00}H {timeSpan.Minutes:00}M {timeSpan.Seconds:00}S {timeSpan.Milliseconds:000}" + $" / UP {up.Days:00}D {up.Hours:00}H {up.Minutes:00}M {up.Seconds:00}S {up.Milliseconds:000}"); polled = true; } else // polled { polling = DateTime.Now; if (polled) { Console.WriteLine(); polled = false; } var context = task.Result; task = listener.GetContextAsync(); var request = context.Request; Console.WriteLine($"Request from {request.RemoteEndPoint} {request.HttpMethod} {request.RawUrl}"); var requestPath = request.Url.LocalPath.ToLower(); try { if (requestPath == "/boot/ipxe") { Console.WriteLine(" Send init script"); var buffer = Encoding.ASCII.GetBytes( IpxeScriptManager.GetInitScript(Properties.Settings.Default.ListenPrefix)); context.Response.OutputStream.Write(buffer, 0, buffer.Length); } else if (requestPath == "/boot/ipxe/script") { var queryString = HttpUtility.ParseQueryString(request.Url.Query); var mac = queryString["mac"].ToUpper(); Console.WriteLine($" MAC:{mac}, send boot script"); var buffer = Encoding.ASCII.GetBytes(IpxeScriptManager.GetScript(mac)); context.Response.OutputStream.Write(buffer, 0, buffer.Length); } else { context.Response.StatusCode = 404; } } catch (Exception e) { Console.WriteLine(e); } finally { context.Response.Close(); } } } listener.Close(); } } }