ProxyServer поддержка httpS переделка примера - C#

Узнай цену своей работы

Формулировка задачи:

Вообщем на многим известном ресурсе нашел пример
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net.Sockets;
  6. using System.IO;
  7. using System.Net;
  8. using System.Text.RegularExpressions;
  9. using System.Threading;
  10. namespace ProxyEasyWithThreads
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. // слушаем локальный апишник (127.0.0.1) и порт 8888
  17. TcpListener myTCP = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888);
  18. // поехали!
  19. myTCP.Start();
  20. while (true)
  21. {
  22. // смотрим, есть запрос или нет
  23. if (myTCP.Pending())
  24. {
  25. // запрос есть
  26. // передаем его в отдельный поток
  27. Thread t = new Thread(ExecuteRequest);
  28. t.IsBackground = true;
  29. t.Start(myTCP.AcceptSocket());
  30. }
  31. }
  32. myTCP.Stop();
  33. }
  34. private static void ExecuteRequest(object arg)
  35. {
  36. Socket myClient = (Socket)arg;
  37. // соединяемся
  38. if (myClient.Connected)
  39. {
  40. // получаем тело запроса
  41. byte[] httpRequest = ReadToEnd(myClient);
  42. // ищем хост и порт
  43. Regex myReg = new Regex(@"Host: (((?<host>.+?):(?<port>\d+?))|(?<host>.+?))\s+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
  44. Match m = myReg.Match(System.Text.Encoding.ASCII.GetString(httpRequest));
  45. string host = m.Groups["host"].Value;
  46. int port = 0;
  47. // если порта нет, то используем 80 по умолчанию
  48. if (!int.TryParse(m.Groups["port"].Value, out port)) { port = 80; }
  49. // получаем апишник по хосту
  50. IPHostEntry myIPHostEntry = Dns.GetHostEntry(host);
  51. // создаем точку доступа
  52. IPEndPoint myIPEndPoint = new IPEndPoint(myIPHostEntry.AddressList[0], port);
  53. // создаем сокет и передаем ему запрос
  54. using (Socket myRerouting = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
  55. {
  56. myRerouting.Connect(myIPEndPoint);
  57. if (myRerouting.Send(httpRequest, httpRequest.Length, SocketFlags.None) != httpRequest.Length)
  58. {
  59. Console.WriteLine("При отправке данных удаленному серверу произошла ошибка...");
  60. }
  61. else
  62. {
  63. // получаем ответ
  64. byte[] httpResponse = ReadToEnd(myRerouting);
  65. // передаем ответ обратно клиенту
  66. if (httpResponse != null && httpResponse.Length > 0)
  67. {
  68. myClient.Send(httpResponse, httpResponse.Length, SocketFlags.None);
  69. }
  70. }
  71. }
  72. myClient.Close();
  73. }
  74. }
  75. private static byte[] ReadToEnd(Socket mySocket)
  76. {
  77. byte[] b = new byte[mySocket.ReceiveBufferSize];
  78. int len = 0;
  79. using (MemoryStream m = new MemoryStream())
  80. {
  81. while (mySocket.Poll(1000000, SelectMode.SelectRead) && (len = mySocket.Receive(b, mySocket.ReceiveBufferSize, SocketFlags.None)) > 0)
  82. {
  83. m.Write(b, 0, len);
  84. }
  85. return m.ToArray();
  86. }
  87. }
  88. }
  89. }
Вообщем он HTTP обрабатывает а вот чтобы HTTPS обрабатывал - Если вы захотите реализовать поддержку этого протокола самостоятельно, то я рекомендую при переадресации запросов клиента использовать классы HttpWebRequest и HttpWebResponse, а не сокеты (в дополнение к сокетам). Знаю что в теории нада сделать так что она меня не интересует, знаю даже примерно где в этом коде. Но чтобы я не пробывал - не получается ПОМОГИТЕ.

Решение задачи: «ProxyServer поддержка httpS переделка примера»

textual
Листинг программы
  1. // ищем хост и порт
  2.  Regex myReg = new Regex(@"Host: (((?<host>.+?):(?<port>\d+?))|(?<host>.+?))\s+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
  3.  Match m = myReg.Match(System.Text.Encoding.ASCII.GetString(httpRequest));
  4.  string host = m.Groups["host"].Value;
  5.  int port = 0;
  6.  // если порта нет, то используем 80 по умолчанию
  7.  if (!int.TryParse(m.Groups["port"].Value, out port)) { port = 80; }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут