private void ReadHandshakeHeaders() { byte[] lineBuffer = new byte[256]; string header = String.Empty; int totalBytesCame = 0; bool gotException; int bytesOfLastHeader = 0; while (true) { gotException = false; byte[] bf = new byte[1]; int bytesCame = _protocol.Receive(bf); if (bytesCame == 0) { break; } Buffer.BlockCopy(bf, 0, lineBuffer, totalBytesCame, bytesCame); totalBytesCame += bytesCame; try { header = Encoding.UTF8.GetString(lineBuffer, bytesOfLastHeader, totalBytesCame - bytesOfLastHeader); } catch { gotException = true; } if (totalBytesCame != 0 && !gotException && header[header.Length - 1] == '\n') { HandshakeHeaders.Add(header.TrimEnd('\n', '\r')); bytesOfLastHeader = totalBytesCame; } if (header.Length > 4 && HandshakeHeaders.Count == 0) { if (!header.StartsWith("http", StringComparison.OrdinalIgnoreCase)) { throw new ProtocolExeption("Server responce is not recognized", StatusCode.ProtocolError); } } // empty header means we got \r\n\r\n which was trimmed. This means end of headers block. if (HandshakeHeaders.Count >= 2 && String.IsNullOrEmpty(HandshakeHeaders.LastOrDefault())) { byte[] eohMark = new byte[2]; break; } } HandshakeHeaders.RemoveAll(s => String.IsNullOrEmpty(s)); }