public static AMQPHeader getSASL(IByteBuffer buf)
        {
            TLVAmqp list = TLVFactory.getTlv(buf);

            if (list.Code != AMQPType.LIST_0 && list.Code != AMQPType.LIST_8 && list.Code != AMQPType.LIST_32)
            {
                throw new MalformedMessageException("Received amqp-header with malformed arguments");
            }

            AMQPHeader header = null;

            Byte        byteCode = list.Constructor.getDescriptorCode().Value;
            HeaderCodes code     = (HeaderCodes)byteCode;

            switch (code)
            {
            case HeaderCodes.CHALLENGE:
                header = new SASLChallenge();
                break;

            case HeaderCodes.INIT:
                header = new SASLInit();
                break;

            case HeaderCodes.MECHANISMS:
                header = new SASLMechanisms();
                break;

            case HeaderCodes.OUTCOME:
                header = new SASLOutcome();
                break;

            case HeaderCodes.RESPONSE:
                header = new SASLResponse();
                break;

            default:
                throw new MalformedMessageException("Received sasl-header with unrecognized arguments code");
            }

            header.fillArguments((TLVList)list);

            return(header);
        }
        public void ProcessSASLMechanism(List <AMQPSymbol> _mechanisms, int channel, int headerType)
        {
            AMQPSymbol plainMechanism = null;

            foreach (AMQPSymbol mechanism in _mechanisms)
            {
                if (mechanism.Value.ToLower() == "plain")
                {
                    plainMechanism = mechanism;
                    break;
                }
            }

            //currently supporting only plain
            if (plainMechanism == null)
            {
                _timers.StopAllTimers();
                _client.Shutdown();
                SetState(ConnectionState.CONNECTION_FAILED);
                return;
            }

            SASLInit saslInit = new SASLInit();

            saslInit.HeaderType = headerType;
            saslInit.Channel    = channel;
            saslInit.Mechanism  = plainMechanism.Value;

            byte[] userBytes     = Encoding.UTF8.GetBytes(_username);
            byte[] passwordBytes = Encoding.UTF8.GetBytes(_password);
            byte[] challenge     = new byte[userBytes.Length + 1 + userBytes.Length + 1 + passwordBytes.Length];
            Array.Copy(userBytes, 0, challenge, 0, userBytes.Length);
            challenge[userBytes.Length] = 0x00;
            Array.Copy(userBytes, 0, challenge, userBytes.Length + 1, userBytes.Length);
            challenge[userBytes.Length + 1 + userBytes.Length] = 0x00;
            Array.Copy(passwordBytes, 0, challenge, userBytes.Length + 1 + userBytes.Length + 1, passwordBytes.Length);

            saslInit.InitialResponse = challenge;
            _client.Send(saslInit);
        }