in netmf/NetMFLite/Client.cs [145:204]
public void Connect(string host, int port, bool useSsl, string userName, string password)
{
this.transport = Connect(host, port, useSsl);
byte[] header = new byte[8] { (byte)'A', (byte)'M', (byte)'Q', (byte)'P', 0, 1, 0, 0 };
byte[] retHeader;
if (userName != null)
{
header[4] = 3;
this.transport.Write(header, 0, 8);
Fx.DebugPrint(true, 0, "AMQP", new List { string.Concat(header[5], header[6], header[7]) }, header[4]);
byte[] b1 = Encoding.UTF8.GetBytes(userName);
byte[] b2 = Encoding.UTF8.GetBytes(password ?? string.Empty);
byte[] b = new byte[1 + b1.Length + 1 + b2.Length];
Array.Copy(b1, 0, b, 1, b1.Length);
Array.Copy(b2, 0, b, b1.Length + 2, b2.Length);
List saslInit = new List() { new Symbol("PLAIN"), b };
this.WriteFrame(1, 0, 0x41, saslInit);
Fx.DebugPrint(true, 0, "sasl-init", saslInit, "mechanism");
this.transport.Flush();
retHeader = this.ReadFixedSizeBuffer(8);
Fx.DebugPrint(false, 0, "AMQP", new List { string.Concat(retHeader[5], retHeader[6], retHeader[7]) }, retHeader[4]);
Fx.AssertAndThrow(ErrorCode.ClientInitializeHeaderCheckFailed, AreHeaderEqual(header, retHeader));
List body = this.ReadFrameBody(1, 0, 0x40);
Fx.DebugPrint(false, 0, "sasl-mechanisms", body, "server-mechanisms");
Fx.AssertAndThrow(ErrorCode.ClientInitializeWrongBodyCount, body.Count > 0);
Symbol[] mechanisms = GetSymbolMultiple(body[0]);
Fx.AssertAndThrow(ErrorCode.ClientInitializeWrongSymbol, Array.IndexOf(mechanisms, new Symbol("PLAIN")) >= 0);
body = this.ReadFrameBody(1, 0, 0x44);
Fx.AssertAndThrow(ErrorCode.ClientInitializeWrongBodyCount, body.Count > 0);
Fx.DebugPrint(false, 0, "sasl-outcome", body, "code");
Fx.AssertAndThrow(ErrorCode.ClientInitializeSaslFailed, body[0].Equals((byte)0)); // sasl-outcome.code = OK
header[4] = 0;
}
this.transport.Write(header, 0, 8);
Fx.DebugPrint(true, 0, "AMQP", new List { string.Concat(header[5], header[6], header[7]) }, header[4]);
// perform open
this.state |= OpenSent;
var open = new List() { Guid.NewGuid().ToString(), this.hostName ?? host, MaxFrameSize, (ushort)0 };
this.WriteFrame(0, 0, 0x10, open);
Fx.DebugPrint(true, 0, "open", open, "container-id", "host-name", "max-frame-size", "channel-max", "idle-time-out");
// perform begin
this.state |= BeginSent;
var begin = new List() { null, this.nextOutgoingId, this.inWindow, this.outWindow, (uint)(this.links.Length - 1) };
this.WriteFrame(0, 0, 0x11, begin);
Fx.DebugPrint(true, 0, "begin", begin, "remote-channel", "next-outgoing-id", "incoming-window", "outgoing-window", "handle-max");
retHeader = this.ReadFixedSizeBuffer(8);
Fx.DebugPrint(false, 0, "AMQP", new List { string.Concat(retHeader[5], retHeader[6], retHeader[7]) }, retHeader[4]);
Fx.AssertAndThrow(ErrorCode.ClientInitializeHeaderCheckFailed, AreHeaderEqual(header, retHeader));
new Thread(this.PumpThread).Start();
}