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; }