protected void StartAndTune() { BlockingCell connectionStartCell = new BlockingCell(); m_model0.m_connectionStartCell = connectionStartCell; m_frameHandler.Timeout = HandshakeTimeout; m_frameHandler.SendHeader(); ConnectionStartDetails connectionStart = (ConnectionStartDetails) connectionStartCell.Value; if (connectionStart == null){ throw new ProtocolVersionMismatchException(Protocol.MajorVersion, Protocol.MinorVersion, -1, -1); } ServerProperties = connectionStart.m_serverProperties; AmqpVersion serverVersion = new AmqpVersion(connectionStart.m_versionMajor, connectionStart.m_versionMinor); if (!serverVersion.Equals(Protocol.Version)) { TerminateMainloop(); FinishClose(); throw new ProtocolVersionMismatchException(Protocol.MajorVersion, Protocol.MinorVersion, serverVersion.Major, serverVersion.Minor); } m_clientProperties = new Hashtable(m_factory.ClientProperties); m_clientProperties["capabilities"] = Protocol.Capabilities; // FIXME: parse out locales properly! ConnectionTuneDetails connectionTune = default(ConnectionTuneDetails); bool tuned = false; try { string mechanismsString = Encoding.UTF8.GetString(connectionStart.m_mechanisms); string[] mechanisms = mechanismsString.Split(' '); AuthMechanismFactory mechanismFactory = m_factory.AuthMechanismFactory(mechanisms); if (mechanismFactory == null) { throw new IOException("No compatible authentication mechanism found - " + "server offered [" + mechanismsString + "]"); } AuthMechanism mechanism = mechanismFactory.GetInstance(); byte[] challenge = null; do { byte[] response = mechanism.handleChallenge(challenge, m_factory); ConnectionSecureOrTune res; if (challenge == null) { res = m_model0.ConnectionStartOk(m_clientProperties, mechanismFactory.Name, response, "en_US"); } else { res = m_model0.ConnectionSecureOk(response); } if (res.m_challenge == null) { connectionTune = res.m_tuneDetails; tuned = true; } else { challenge = res.m_challenge; } } while (!tuned); } catch (OperationInterruptedException e) { throw new PossibleAuthenticationFailureException( "Possibly caused by authentication failure", e); } ushort channelMax = (ushort) NegotiatedMaxValue(m_factory.RequestedChannelMax, connectionTune.m_channelMax); m_sessionManager = new SessionManager(this, channelMax); uint frameMax = NegotiatedMaxValue(m_factory.RequestedFrameMax, connectionTune.m_frameMax); FrameMax = frameMax; ushort heartbeat = (ushort) NegotiatedMaxValue(m_factory.RequestedHeartbeat, connectionTune.m_heartbeat); Heartbeat = heartbeat; m_model0.ConnectionTuneOk(channelMax, frameMax, heartbeat); }
public void Open(bool insist) { BlockingCell connectionStartCell = new BlockingCell(); m_model0.m_connectionStartCell = connectionStartCell; m_frameHandler.Timeout = HandshakeTimeout; m_frameHandler.SendHeader(); ConnectionStartDetails connectionStart = (ConnectionStartDetails) connectionStartCell.Value; AmqpVersion serverVersion = new AmqpVersion(connectionStart.m_versionMajor, connectionStart.m_versionMinor); if (!serverVersion.Equals(Protocol.Version)) { TerminateMainloop(); FinishClose(); throw new ProtocolVersionMismatchException(Protocol.MajorVersion, Protocol.MinorVersion, serverVersion.Major, serverVersion.Minor); } // FIXME: check that PLAIN is supported. // FIXME: parse out locales properly! ConnectionTuneDetails connectionTune = m_model0.ConnectionStartOk(BuildClientPropertiesTable(), "PLAIN", Encoding.UTF8.GetBytes("\0" + m_parameters.UserName + "\0" + m_parameters.Password), "en_US"); ushort channelMax = (ushort) NegotiatedMaxValue(m_parameters.RequestedChannelMax, connectionTune.m_channelMax); ChannelMax = channelMax; uint frameMax = NegotiatedMaxValue(m_parameters.RequestedFrameMax, connectionTune.m_frameMax); FrameMax = frameMax; ushort heartbeat = (ushort) NegotiatedMaxValue(m_parameters.RequestedHeartbeat, connectionTune.m_heartbeat); Heartbeat = heartbeat; m_model0.ConnectionTuneOk(channelMax, frameMax, heartbeat); string knownHosts = m_model0.ConnectionOpen(m_parameters.VirtualHost, "", // FIXME: make configurable? insist); KnownHosts = AmqpTcpEndpoint.ParseMultiple(Protocol, knownHosts); }
///<summary>Implement value-equality comparison.</summary> public override bool Equals(object other) { AmqpVersion v = other as AmqpVersion; return((v != null) && (v.m_major == m_major) && (v.m_minor == m_minor)); }
public void Open(bool insist) { BlockingCell connectionStartCell = new BlockingCell(); m_model0.m_connectionStartCell = connectionStartCell; m_frameHandler.Timeout = HandshakeTimeout; m_frameHandler.SendHeader(); ConnectionStartDetails connectionStart = (ConnectionStartDetails) connectionStartCell.Value; ServerProperties = connectionStart.m_serverProperties; AmqpVersion serverVersion = new AmqpVersion(connectionStart.m_versionMajor, connectionStart.m_versionMinor); if (!serverVersion.Equals(Protocol.Version)) { TerminateMainloop(); FinishClose(); throw new ProtocolVersionMismatchException(Protocol.MajorVersion, Protocol.MinorVersion, serverVersion.Major, serverVersion.Minor); } m_clientProperties = new Hashtable(m_factory.ClientProperties); // FIXME: check that PLAIN is supported. // FIXME: parse out locales properly! ConnectionTuneDetails connectionTune = default(ConnectionTuneDetails); try { connectionTune = m_model0.ConnectionStartOk(m_clientProperties, "PLAIN", Encoding.UTF8.GetBytes( "\0" + m_factory.UserName + "\0" + m_factory.Password), "en_US"); } catch (OperationInterruptedException e) { throw new PossibleAuthenticationFailureException( "Possibly caused by authentication failure", e); } ushort channelMax = (ushort) NegotiatedMaxValue(m_factory.RequestedChannelMax, connectionTune.m_channelMax); m_sessionManager = new SessionManager(this, channelMax); uint frameMax = NegotiatedMaxValue(m_factory.RequestedFrameMax, connectionTune.m_frameMax); FrameMax = frameMax; ushort heartbeat = (ushort) NegotiatedMaxValue(m_factory.RequestedHeartbeat, connectionTune.m_heartbeat); Heartbeat = heartbeat; m_model0.ConnectionTuneOk(channelMax, frameMax, heartbeat); string knownHosts = m_model0.ConnectionOpen(m_factory.VirtualHost, "", // FIXME: make configurable? insist); KnownHosts = AmqpTcpEndpoint.ParseMultiple(Protocol, knownHosts); }