HttpProgram.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using HttpServer.App;
  2. using System;
  3. using System.Net;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Web;
  7. namespace HttpServer
  8. {
  9. internal static class HttpProgram
  10. {
  11. private static bool _isRunning;
  12. private static void Main(string[] args)
  13. {
  14. Console.WriteLine("Starting...");
  15. var tWorker = new Thread(Working);
  16. _isRunning = true;
  17. tWorker.Start();
  18. Console.WriteLine("Press ENTER to Stop.");
  19. Console.ReadLine();
  20. Console.Write("Shutting down...");
  21. _isRunning = false;
  22. tWorker.Join();
  23. Console.Write("Stopped.");
  24. Console.WriteLine();
  25. Console.Write("Press ENTER to Exit.");
  26. Console.ReadLine();
  27. }
  28. private static void Working()
  29. {
  30. var listener = new HttpListener();
  31. listener.Prefixes.Add(Properties.Settings.Default.ListenPrefix);
  32. listener.Start();
  33. var upTime = DateTime.Now;
  34. Console.WriteLine($"HTTP Server started, listening on {Properties.Settings.Default.ListenPrefix}");
  35. var task = listener.GetContextAsync();
  36. var polling = DateTime.Now;
  37. var polled = false;
  38. while (_isRunning)
  39. {
  40. Console.CursorLeft = 0;
  41. if (false == task.Wait(500))
  42. {
  43. var timeSpan = DateTime.Now - polling;
  44. var up = DateTime.Now - upTime;
  45. Console.Write("Polling request..." +
  46. $" {timeSpan.Days:00}D {timeSpan.Hours:00}H {timeSpan.Minutes:00}M {timeSpan.Seconds:00}S {timeSpan.Milliseconds:000}" +
  47. $" / UP {up.Days:00}D {up.Hours:00}H {up.Minutes:00}M {up.Seconds:00}S {up.Milliseconds:000}");
  48. polled = true;
  49. }
  50. else
  51. {
  52. if (polled)
  53. {
  54. Console.WriteLine();
  55. polled = false;
  56. }
  57. var context = task.Result;
  58. task = listener.GetContextAsync();
  59. var request = context.Request;
  60. Console.WriteLine($"Request from {request.RemoteEndPoint} {request.HttpMethod} {request.RawUrl}");
  61. var requestPath = request.Url.LocalPath.ToLower();
  62. if (requestPath == "/boot/ipxe")
  63. {
  64. Console.WriteLine(" Send init script");
  65. var buffer = Encoding.ASCII.GetBytes(IpxeScriptManager.GetInitScript(Properties.Settings.Default.ListenPrefix));
  66. context.Response.OutputStream.Write(buffer, 0, buffer.Length);
  67. context.Response.Close();
  68. }
  69. else if (requestPath == "/boot/ipxe/script")
  70. {
  71. var queryString = HttpUtility.ParseQueryString(request.Url.Query);
  72. var mac = queryString["mac"].ToUpper();
  73. Console.WriteLine($" MAC:{mac}, send boot script");
  74. var buffer = Encoding.ASCII.GetBytes(IpxeScriptManager.GetScript(mac));
  75. context.Response.OutputStream.Write(buffer, 0, buffer.Length);
  76. context.Response.Close();
  77. }
  78. else
  79. {
  80. context.Response.StatusCode = 404;
  81. context.Response.Close();
  82. }
  83. }
  84. }
  85. listener.Close();
  86. }
  87. }
  88. }