ProxyServer поддержка httpS переделка примера - C#
Формулировка задачи:
Вообщем на многим известном ресурсе нашел пример
Вообщем он HTTP обрабатывает а вот чтобы HTTPS обрабатывал - Если вы захотите реализовать поддержку этого протокола самостоятельно, то я рекомендую при переадресации запросов клиента использовать классы HttpWebRequest и HttpWebResponse, а не сокеты (в дополнение к сокетам). Знаю что в теории нада сделать так что она меня не интересует, знаю даже примерно где в этом коде. Но чтобы я не пробывал - не получается ПОМОГИТЕ.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.IO; using System.Net; using System.Text.RegularExpressions; using System.Threading; namespace ProxyEasyWithThreads { class Program { static void Main(string[] args) { // слушаем локальный апишник (127.0.0.1) и порт 8888 TcpListener myTCP = new TcpListener(IPAddress.Parse("127.0.0.1"), 8888); // поехали! myTCP.Start(); while (true) { // смотрим, есть запрос или нет if (myTCP.Pending()) { // запрос есть // передаем его в отдельный поток Thread t = new Thread(ExecuteRequest); t.IsBackground = true; t.Start(myTCP.AcceptSocket()); } } myTCP.Stop(); } private static void ExecuteRequest(object arg) { Socket myClient = (Socket)arg; // соединяемся if (myClient.Connected) { // получаем тело запроса byte[] httpRequest = ReadToEnd(myClient); // ищем хост и порт Regex myReg = new Regex(@"Host: (((?<host>.+?):(?<port>\d+?))|(?<host>.+?))\s+", RegexOptions.Multiline | RegexOptions.IgnoreCase); Match m = myReg.Match(System.Text.Encoding.ASCII.GetString(httpRequest)); string host = m.Groups["host"].Value; int port = 0; // если порта нет, то используем 80 по умолчанию if (!int.TryParse(m.Groups["port"].Value, out port)) { port = 80; } // получаем апишник по хосту IPHostEntry myIPHostEntry = Dns.GetHostEntry(host); // создаем точку доступа IPEndPoint myIPEndPoint = new IPEndPoint(myIPHostEntry.AddressList[0], port); // создаем сокет и передаем ему запрос using (Socket myRerouting = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { myRerouting.Connect(myIPEndPoint); if (myRerouting.Send(httpRequest, httpRequest.Length, SocketFlags.None) != httpRequest.Length) { Console.WriteLine("При отправке данных удаленному серверу произошла ошибка..."); } else { // получаем ответ byte[] httpResponse = ReadToEnd(myRerouting); // передаем ответ обратно клиенту if (httpResponse != null && httpResponse.Length > 0) { myClient.Send(httpResponse, httpResponse.Length, SocketFlags.None); } } } myClient.Close(); } } private static byte[] ReadToEnd(Socket mySocket) { byte[] b = new byte[mySocket.ReceiveBufferSize]; int len = 0; using (MemoryStream m = new MemoryStream()) { while (mySocket.Poll(1000000, SelectMode.SelectRead) && (len = mySocket.Receive(b, mySocket.ReceiveBufferSize, SocketFlags.None)) > 0) { m.Write(b, 0, len); } return m.ToArray(); } } } }
Решение задачи: «ProxyServer поддержка httpS переделка примера»
textual
Листинг программы
// ищем хост и порт Regex myReg = new Regex(@"Host: (((?<host>.+?):(?<port>\d+?))|(?<host>.+?))\s+", RegexOptions.Multiline | RegexOptions.IgnoreCase); Match m = myReg.Match(System.Text.Encoding.ASCII.GetString(httpRequest)); string host = m.Groups["host"].Value; int port = 0; // если порта нет, то используем 80 по умолчанию if (!int.TryParse(m.Groups["port"].Value, out port)) { port = 80; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д