in src/AmqpConnection.cs [503:542]
void OnReceiveOpen(Open open)
{
StateTransition stateTransition = this.TransitState("R:OPEN", StateTransition.ReceiveOpen);
uint peerIdleTimeout = open.IdleTimeOut();
if (peerIdleTimeout < this.Settings.MinIdleTimeout)
{
this.CompleteOpen(false,
new AmqpException(AmqpErrorCode.NotAllowed, AmqpResources.GetString(AmqpResources.AmqpIdleTimeoutNotSupported, peerIdleTimeout, this.Settings.MinIdleTimeout)));
return;
}
this.Negotiate(open);
this.NotifyOpening(open);
if (stateTransition.To == AmqpObjectState.OpenReceived)
{
this.SendOpen();
}
if(this.isInitiator)
{
// check if open returned an error right away
Error openError = null;
if (open.Properties != null && open.Properties.TryGetValue<Error>(AmqpConstants.OpenErrorName, out openError))
{
this.CompleteOpen(stateTransition.From == AmqpObjectState.Start, new AmqpException(openError));
return;
}
}
uint myIdleTimeout = this.Settings.IdleTimeOut();
peerIdleTimeout = open.IdleTimeOut();
if (peerIdleTimeout != uint.MaxValue || myIdleTimeout != uint.MaxValue)
{
this.heartBeat = HeartBeat.Initialize(this, myIdleTimeout, peerIdleTimeout);
}
this.CompleteOpen(stateTransition.From == AmqpObjectState.Start, null);
}