public Cache(HTTP.HTMLParser myHTTP, HTTP.HTMLParser myReroutingHTTP, DateTime LiveTime) { this.myHTTP = myHTTP; this.myReroutingHTTP = myReroutingHTTP; this.LiveTime = LiveTime; }
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); } }