123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 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();
- }
- }
- }
|