VHostServer.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Net.ApiService;
  5. using System.Net.Sockets;
  6. using System.IO;
  7. namespace System.Net.ApiService.VHost_Server {
  8. public class VHostServer {
  9. private ushort _portListen = 80;
  10. private HttpApiServer server;
  11. private List<VHostRedirect> _redirects = new List<VHostRedirect>();
  12. public List<VHostRedirect> Redirects {
  13. get { return _redirects; }
  14. }
  15. public VHostServer() {
  16. }
  17. public VHostServer(ushort port) {
  18. this._portListen = port;
  19. }
  20. public void Start() {
  21. this.Stop();
  22. this.server = new HttpApiServer(this._portListen);
  23. this.server.Request += Server_Request;
  24. this.server.Start();
  25. }
  26. private void Server_Request(object sender, RequestEventArgs e) {
  27. e.SendAnyResponse = false;
  28. System.Diagnostics.Debug.WriteLine("VHost Redirection Server - Request arrived");
  29. foreach(VHostRedirect red in this._redirects) {
  30. System.Diagnostics.Debug.WriteLine("- Check conditions for: " + red.RedirectHost + ":" + red.RedirectPort.ToString());
  31. if(red.IsMatch(e.Request)) {
  32. System.Diagnostics.Debug.WriteLine("- Condition matched");
  33. var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
  34. client.Connect(red.RedirectHost, red.RedirectPort);
  35. NetworkStream networkStream = new NetworkStream(client);
  36. // Send Request
  37. byte[] bytes = Encoding.Default.GetBytes(e.Request.Blank);
  38. networkStream.Write(bytes, 0, bytes.Length);
  39. // Read response and send it to the client
  40. byte[] bHeader = new byte[1024];
  41. networkStream.Read(bHeader, 0, 1024);
  42. string sHeader = System.Text.Encoding.ASCII.GetString(bHeader);
  43. int len = -1;
  44. System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(sHeader, "^content\\-length\\:\\s*(<?len>[0-9]+)$",Text.RegularExpressions.RegexOptions.IgnoreCase | Text.RegularExpressions.RegexOptions.Singleline);
  45. if(m.Success && m.Groups["len"].Success && m.Groups["len"].Length>0) {
  46. len = int.Parse(m.Groups["len"].Value);
  47. }
  48. e.Socket.Send(bHeader);
  49. byte[] buffer = new byte[4096];
  50. int n = 0;
  51. int read = 0;
  52. while (n < len) {
  53. if (networkStream.DataAvailable) {
  54. read = networkStream.Read(buffer, 0, buffer.Length);
  55. n += read;
  56. //fileStream.Write(buffer, 0, read);
  57. e.Socket.Send(buffer);
  58. }
  59. }
  60. return;
  61. }
  62. }
  63. }
  64. public void Stop() {
  65. if (this.server != null) {
  66. this.server.Stop();
  67. }
  68. this.server = null;
  69. }
  70. }
  71. }