public override int Read(byte[] buffer, int offset, int count) { // Если установлен лимит на количество считанных байт. if (LimitBytesRead != 0) { int length = LimitBytesRead - TotalBytesRead; // Если лимит достигнут. if (length == 0) { return(0); } if (length > buffer.Length) { length = buffer.Length; } if (_receiverHelper.HasData) { BytesRead = _receiverHelper.Read(buffer, offset, length); } else { BytesRead = _baseStream.Read(buffer, offset, length); } } else { if (_receiverHelper.HasData) { BytesRead = _receiverHelper.Read(buffer, offset, count); } else { BytesRead = _baseStream.Read(buffer, offset, count); } } TotalBytesRead += BytesRead; return(BytesRead); }
// Загрузка тела сообщения неизвестной длины. private IEnumerable <BytesWraper> ReceiveMessageBody(Stream stream) { var bytesWraper = new BytesWraper(); byte[] buffer = new byte[this.bufferSize]; bytesWraper.Value = buffer; int begBytesRead = 0; // Считываем начальные данные из тела сообщения. if (stream is GZipStream || stream is DeflateStream) { begBytesRead = stream.Read(buffer, 0, bufferSize); } else { if (receiveHelper.HasData) { begBytesRead = receiveHelper.Read(buffer, 0, bufferSize); } if (begBytesRead < bufferSize) { begBytesRead += stream.Read(buffer, begBytesRead, bufferSize - begBytesRead); } } // Возвращаем начальные данные. bytesWraper.Length = begBytesRead; yield return(bytesWraper); // Проверяем, есть ли открывающий тег '<html'. // Если есть, то считываем данные то тех пор, пока не встретим закрывающий тек '</html>'. bool isHtml = FindSignature(buffer, begBytesRead, openHtmlSignature); if (isHtml) { bool found = FindSignature(buffer, begBytesRead, closeHtmlSignature); // Проверяем, есть ли в начальных данных закрывающий тег. if (found) { yield break; } } while (true) { int bytesRead = stream.Read(buffer, 0, bufferSize); // Если тело сообщения представляет HTML. if (isHtml) { if (bytesRead == 0) { WaitData(); continue; } bool found = FindSignature(buffer, bytesRead, closeHtmlSignature); if (found) { bytesWraper.Length = bytesRead; yield return(bytesWraper); yield break; } } else if (bytesRead == 0) { yield break; } bytesWraper.Length = bytesRead; yield return(bytesWraper); } }