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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д