HttpService.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System.Net;
  2. using System.Text;
  3. namespace Server.Library.Utils
  4. {
  5. internal abstract class HttpService
  6. {
  7. protected string Host;
  8. private HttpListener _listener;
  9. private bool _isActive = true;
  10. protected HttpService()
  11. {
  12. }
  13. public void Listen(object obj)
  14. {
  15. CancellationToken token = (CancellationToken)obj;
  16. if (!HttpListener.IsSupported)
  17. {
  18. throw new InvalidOperationException(
  19. "To use HttpListener the operating system must be Windows XP SP2 or Server 2003 or higher.");
  20. }
  21. string[] prefixes = { Host };
  22. _listener = new HttpListener();
  23. try
  24. {
  25. foreach (var s in prefixes)
  26. {
  27. _listener.Prefixes.Add(s);
  28. }
  29. _listener.Start();
  30. MessageQueue.Instance.Enqueue(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.HttpServiceStarted));
  31. }
  32. catch (Exception err)
  33. {
  34. MessageQueue.Instance.Enqueue(GameLanguage.ServerTextMap.GetLocalization(ServerTextKeys.HttpServiceStartFailed) + err);
  35. return;
  36. }
  37. while (_isActive && !token.IsCancellationRequested)
  38. {
  39. try
  40. {
  41. var context = _listener.GetContext();
  42. var request = context.Request;
  43. Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
  44. Console.WriteLine("User-Agent: {0}", request.UserAgent);
  45. Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
  46. Console.WriteLine("Connection: {0}", request.KeepAlive ? "Keep-Alive" : "close");
  47. Console.WriteLine("Host: {0}", request.UserHostName);
  48. var response = context.Response;
  49. if (context.Request.RemoteEndPoint != null)
  50. {
  51. var clientIp = context.Request.RemoteEndPoint.Address.ToString();
  52. if (clientIp != Settings.HTTPTrustedIPAddress)
  53. {
  54. WriteResponse(response, "notrusted:" + clientIp);
  55. continue;
  56. }
  57. }
  58. if (request.HttpMethod == "GET")
  59. {
  60. OnGetRequest(request, response);
  61. }
  62. else
  63. {
  64. OnPostRequest(request, response);
  65. }
  66. }
  67. catch { }
  68. }
  69. }
  70. public void Stop()
  71. {
  72. _isActive = false;
  73. if (_listener != null && _listener.IsListening)
  74. {
  75. _listener.Stop();
  76. }
  77. }
  78. public abstract void OnGetRequest(HttpListenerRequest request, HttpListenerResponse response);
  79. public abstract void OnPostRequest(HttpListenerRequest request, HttpListenerResponse response);
  80. public void WriteResponse(HttpListenerResponse response, string responseString)
  81. {
  82. try
  83. {
  84. response.ContentLength64 = Encoding.UTF8.GetByteCount(responseString);
  85. response.ContentType = "text/html; charset=UTF-8";
  86. }
  87. finally
  88. {
  89. var output = response.OutputStream;
  90. var writer = new StreamWriter(output);
  91. writer.Write(responseString);
  92. writer.Close();
  93. }
  94. }
  95. }
  96. }