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