Exemplo n.º 1
0
 public Cache(HTTP.HTMLParser myHTTP, HTTP.HTMLParser myReroutingHTTP, DateTime LiveTime)
 {
     this.myHTTP = myHTTP;
     this.myReroutingHTTP = myReroutingHTTP;
     this.LiveTime = LiveTime;
 }
Exemplo n.º 2
0
        private void ExecuteRequest(object arg)
        {
            try
            {

                // Пытаемся установить соединение
                using (Socket myClient = (Socket)arg)
                {
                    bool LoadFromInternet = true;

                    if (myClient.Connected)
                    {
                        // Есть соединение. Получаем содержимое запроса
                        byte[] HTTPRequest = ReadToEnd(myClient);

                        // Парсим полученный запрос
                        HTTP.HTMLParser http = new HTTP.HTMLParser(HTTPRequest);

                        // если заголовки не найдены, значит выполнить запрос не получится
                        if (http.Items == null || http.Items.Count <= 0 || !http.Items.ContainsKey("Host"))
                        {
                            SetText("Получен запрос {0} байт, заголовки не найдены.", HTTPRequest.Length);
                            OutboundTraffic += HTTPRequest.Length;
                            SetLabel1(OutboundTraffic);
                        }
                        // заголовки найдены, можно продолжать выполнение запроса
                        else
                        {
                            if (CacheList.Count != 0)
                            {
                                foreach (var HelpHTTP in CacheList.ToArray())
                                {
                                    if (HelpHTTP.myHTTP.Path == http.Path)
                                    {

                                            byte[] HTTPResponse = null;
                                            LoadFromInternet = false;
                                            // Получаем ответ

                                            if (HelpHTTP.myReroutingHTTP.Source != null && HelpHTTP.myReroutingHTTP.Source.Length > 0)
                                            {
                                                SetText("Данные загружены из кэша!");
                                                HTTPResponse = HelpHTTP.myReroutingHTTP.Source;

                                            }

                                            if (HTTPResponse != null)
                                                myClient.Send(HTTPResponse, HTTPResponse.Length, SocketFlags.None);

                                    }
                                }
                            }
                            if (LoadFromInternet)
                            {
                                SetText("Получен запрос {0} байт, метод {1}, хост {2}:{3}", HTTPRequest.Length, http.Method, http.Host, http.Port);
                                OutboundTraffic += HTTPRequest.Length;
                                SetLabel1(OutboundTraffic);

                                byte[] HTTPResponse = null;     // Ответ клиенту

                                // Определяем IP-адрес по имени хоста
                                IPHostEntry myIPHostEntry = Dns.GetHostEntry(http.Host);
                                if (myIPHostEntry == null || myIPHostEntry.AddressList == null || myIPHostEntry.AddressList.Length <= 0)
                                {
                                    SetText("Не удалось определить IP-адрес по хосту {0}.", http.Host);
                                }
                                else
                                {
                                    SetText("IP-адреса хоста {0}: {1}", http.Host, myIPHostEntry.AddressList[0]);

                                    // Создаем точку доступа
                                    IPEndPoint myIPEndPoint = new IPEndPoint(myIPHostEntry.AddressList[0], http.Port);

                                    // Запрос к защищенному ресурсу
                                    if (http.Method == HTTP.HTMLParser.MethodsList.CONNECT)
                                    {
                                        SetText("Ошибка!!! Протокол HTTPS не реализован!");
                                    }
                                    // Обычный запрос
                                    else
                                    {
                                        // Перенаправляем запрос на указанный хост
                                        using (Socket myRerouting = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
                                        {
                                            myRerouting.Connect(myIPEndPoint);
                                            if (myRerouting.Send(HTTPRequest, HTTPRequest.Length, SocketFlags.None) != HTTPRequest.Length)
                                            {
                                                SetText("Ошибка!!! Данные не были отправлены хосту {0}", http.Host);
                                            }
                                            else
                                            {
                                                // Получаем ответ
                                                HTTP.HTMLParser ReroutingHTTPResponse = new HTTP.HTMLParser(ReadToEnd(myRerouting));
                                                if (ReroutingHTTPResponse.Source != null && ReroutingHTTPResponse.Source.Length > 0)
                                                {
                                                    SetText("Получен ответ {0} байт, код состояния{1}.", ReroutingHTTPResponse.Source.Length, ReroutingHTTPResponse.StatusCode);
                                                    IncomingTraffic += ReroutingHTTPResponse.Source.Length;
                                                    SetLabel2(IncomingTraffic);

                                                    HTTPResponse = ReroutingHTTPResponse.Source;

                                                    Cache CacheRecord = new Cache(http, ReroutingHTTPResponse, DateTime.Now);
                                                    lock (syncRoot)
                                                    {
                                                        CacheList.Add(CacheRecord);
                                                    }

                                                }
                                                else
                                                    SetText("Ошибка!!! Получен ответ 0 байт.");
                                            }
                                            myRerouting.Close();
                                        }
                                    }

                                }
                                if (HTTPResponse != null)
                                    myClient.Send(HTTPResponse, HTTPResponse.Length, SocketFlags.None);
                            }
                        }
                    }
                    myClient.Close();
                }
            }
            catch (System.Exception ex)
            {
                this.SetText("Ошибка: {0}", ex.Message);
            }
        }