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

 
0
 
.NET
ava
xsb3 | 03.10.2013, 01:22
Вообщем на многим известном ресурсе нашел пример


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

  }
}



Вообщем он HTTP обрабатывает а вот чтобы HTTPS обрабатывал - Если вы захотите реализовать поддержку этого протокола самостоятельно, то я рекомендую при переадресации запросов клиента использовать классы HttpWebRequest и HttpWebResponse, а не сокеты (в дополнение к сокетам). Знаю что в теории нада сделать так что она меня не интересует, знаю даже примерно где в этом коде. Но чтобы я не пробывал - не получается ПОМОГИТЕ. 
Comments (0)

Comments are not added

Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  xsb3
advanced
Submit