/// <summary> /// Creates a new connection with a custom open frame and a callback to handle remote open frame. /// </summary> /// <param name="address">The address of remote endpoint to connect to.</param> /// <param name="open">If specified, it is sent to open the connection, otherwise an open frame created from the AMQP settings property is sent.</param> /// <param name="onOpened">If specified, it is invoked when an open frame is received from the remote peer.</param> /// <returns></returns> public async Task<Connection> CreateAsync(Address address, Open open, OnOpened onOpened) { IAsyncTransport transport; if (WebSocketTransport.MatchScheme(address.Scheme)) { WebSocketTransport wsTransport = new WebSocketTransport(); await wsTransport.ConnectAsync(address); transport = wsTransport; } else { TcpTransport tcpTransport = new TcpTransport(); await tcpTransport.ConnectAsync(address, this); transport = tcpTransport; } if (address.User != null) { SaslPlainProfile profile = new SaslPlainProfile(address.User, address.Password); transport = await profile.OpenAsync(address.Host, transport); } else if (this.saslSettings != null && this.saslSettings.Profile != null) { transport = await this.saslSettings.Profile.OpenAsync(address.Host, transport); } AsyncPump pump = new AsyncPump(transport); Connection connection = new Connection(this.AMQP, address, transport, open, onOpened); pump.Start(connection); return connection; }
/// <summary> /// Creates a new connection with a custom open frame and a callback to handle remote open frame. /// </summary> /// <param name="address">The address of remote endpoint to connect to.</param> /// <param name="open">If specified, it is sent to open the connection, otherwise an open frame created from the AMQP settings property is sent.</param> /// <param name="onOpened">If specified, it is invoked when an open frame is received from the remote peer.</param> /// <returns></returns> public async Task<Connection> CreateAsync(Address address, Open open, OnOpened onOpened) { IAsyncTransport transport; #if !WINDOWS_PHONE if (WebSocketTransport.MatchScheme(address.Scheme)) { WebSocketTransport wsTransport = new WebSocketTransport(); await wsTransport.ConnectAsync(address); transport = wsTransport; } else #endif if (string.Equals(address.Scheme, Address.Amqp, StringComparison.OrdinalIgnoreCase) || string.Equals(address.Scheme, Address.Amqps, StringComparison.OrdinalIgnoreCase)) { TcpTransport tcpTransport = new TcpTransport(); await tcpTransport.ConnectAsync(address, this); transport = tcpTransport; } else { throw new NotSupportedException(address.Scheme); } if (address.User != null) { SaslPlainProfile profile = new SaslPlainProfile(address.User, address.Password); transport = await profile.OpenAsync(address.Host, null, transport); } else if (this.saslSettings != null && this.saslSettings.Profile != null) { transport = await this.saslSettings.Profile.OpenAsync(address.Host, null, transport); } AsyncPump pump = new AsyncPump(null, transport); Connection connection = new Connection(null, this.AMQP, address, transport, open, onOpened); pump.Start(connection); return connection; }
public void TestMethod_ConnectionRemoteProperties() { string testName = "ConnectionRemoteProperties"; ManualResetEvent opened = new ManualResetEvent(false); Open remoteOpen = null; OnOpened onOpen = (c, o) => { remoteOpen = o; opened.Set(); }; Open open = new Open() { ContainerId = testName, Properties = new Fields() { { new Symbol("p1"), "abcd" } }, DesiredCapabilities = new Symbol[] { new Symbol("dc1"), new Symbol("dc2") }, OfferedCapabilities = new Symbol[] { new Symbol("oc") } }; Connection connection = new Connection(testTarget.Address, null, open, onOpen); opened.WaitOne(10000); connection.Close(); Assert.IsTrue(remoteOpen != null, "remote open not set"); }
/// <summary> /// Initializes a connection with SASL profile, open and open callback. /// </summary> /// <param name="address">The address.</param> /// <param name="saslProfile">The SASL profile to do authentication (optional). If it is /// null and address has user info, SASL PLAIN profile is used.</param> /// <param name="open">The open frame to send (optional). If not null, all mandatory /// fields must be set. Ensure that other fields are set to desired values.</param> /// <param name="onOpened">The callback to handle remote open frame (optional).</param> public Connection(Address address, SaslProfile saslProfile, Open open, OnOpened onOpened) : this(DefaultMaxSessions, DefaultMaxFrameSize) { this.address = address; this.onOpened = onOpened; if (open != null) { this.maxFrameSize = open.MaxFrameSize; this.channelMax = open.ChannelMax; } else { open = new Open() { ContainerId = Guid.NewGuid().ToString(), HostName = this.address.Host, MaxFrameSize = this.maxFrameSize, ChannelMax = this.channelMax }; } this.Connect(saslProfile, open); }
void SendOpen(Open open) { this.SendCommand(0, open); }
void OnOpen(Open open) { lock (this.ThisLock) { if (this.state == State.OpenSent) { this.state = State.Opened; } else if (this.state == State.ClosePipe) { this.state = State.CloseSent; } else { throw new AmqpException(ErrorCode.IllegalState, Fx.Format(SRAmqp.AmqpIllegalOperationState, "OnOpen", this.state)); } } if (open.ChannelMax < this.channelMax) { this.channelMax = open.ChannelMax; } if (open.MaxFrameSize < this.maxFrameSize) { this.maxFrameSize = open.MaxFrameSize; } uint idleTimeout = open.IdleTimeOut; if (idleTimeout > 0 && idleTimeout < uint.MaxValue) { idleTimeout -= 3000; if (idleTimeout > MaxIdleTimeout) { idleTimeout = MaxIdleTimeout; } this.heartBeatTimer = new Timer(onHeartBeatTimer, this, (int)idleTimeout, (int)idleTimeout); } if (this.onOpened != null) { this.onOpened(this, open); } }
void Connect(SaslProfile saslProfile, Open open) { ITransport transport; TcpTransport tcpTransport = new TcpTransport(); tcpTransport.Connect(this, this.address, DisableServerCertValidation); transport = tcpTransport; if (saslProfile != null) { transport = saslProfile.Open(this.address.Host, transport); } else if (this.address.User != null) { transport = new SaslPlainProfile(this.address.User, this.address.Password).Open(this.address.Host, transport); } this.transport = transport; // after getting the transport, move state to open pipe before starting the pump this.SendHeader(); this.SendOpen(open); this.state = State.OpenPipe; this.reader = new Pump(this); this.reader.Start(); }
internal Connection(IBufferManager bufferManager, AmqpSettings amqpSettings, Address address, IAsyncTransport transport, Open open, OnOpened onOpened) : this((ushort)(amqpSettings.MaxSessionsPerConnection - 1), (uint)amqpSettings.MaxFrameSize) { this.BufferManager = bufferManager; this.address = address; this.onOpened = onOpened; this.maxFrameSize = (uint)amqpSettings.MaxFrameSize; this.transport = transport; transport.SetConnection(this); // after getting the transport, move state to open pipe before starting the pump if (open == null) { open = new Open() { ContainerId = amqpSettings.ContainerId, HostName = amqpSettings.HostName ?? this.address.Host, ChannelMax = this.channelMax, MaxFrameSize = this.maxFrameSize }; } this.SendHeader(); this.SendOpen(open); this.state = State.OpenPipe; }
/// <summary> /// Creates a new connection with a custom open frame and a callback to handle remote open frame. /// </summary> /// <param name="address">The address of remote endpoint to connect to.</param> /// <param name="open">If specified, it is sent to open the connection, otherwise an open frame created from the AMQP settings property is sent.</param> /// <param name="onOpened">If specified, it is invoked when an open frame is received from the remote peer.</param> /// <returns>A task for the connection creation operation. On success, the result is an AMQP <see cref="Connection"/></returns> public async Task<Connection> CreateAsync(Address address, Open open, OnOpened onOpened) { IAsyncTransport transport; TransportProvider provider; if (this.transportFactories != null && this.transportFactories.TryGetValue(address.Scheme, out provider)) { transport = await provider.CreateAsync(address); } else if (TcpTransport.MatchScheme(address.Scheme)) { TcpTransport tcpTransport = new TcpTransport(this.BufferManager); await tcpTransport.ConnectAsync(address, this); transport = tcpTransport; } #if NETFX else if (WebSocketTransport.MatchScheme(address.Scheme)) { WebSocketTransport wsTransport = new WebSocketTransport(); await wsTransport.ConnectAsync(address, null); transport = wsTransport; } #endif else { throw new NotSupportedException(address.Scheme); } if (address.User != null) { SaslPlainProfile profile = new SaslPlainProfile(address.User, address.Password); transport = await profile.OpenAsync(address.Host, this.BufferManager, transport); } else if (this.saslSettings != null && this.saslSettings.Profile != null) { transport = await this.saslSettings.Profile.OpenAsync(address.Host, this.BufferManager, transport); } AsyncPump pump = new AsyncPump(this.BufferManager, transport); Connection connection = new Connection(this.BufferManager, this.AMQP, address, transport, open, onOpened); pump.Start(connection); return connection; }
void Connect(SaslProfile saslProfile, Open open) { ITransport transport; #if NETFX if (WebSocketTransport.MatchScheme(address.Scheme)) { WebSocketTransport wsTransport = new WebSocketTransport(); wsTransport.ConnectAsync(address).GetAwaiter().GetResult(); transport = wsTransport; } else #endif { TcpTransport tcpTransport = new TcpTransport(); tcpTransport.Connect(this, this.address, DisableServerCertValidation); transport = tcpTransport; } if (saslProfile != null) { transport = saslProfile.Open(this.address.Host, transport); } else if (this.address.User != null) { transport = new SaslPlainProfile(this.address.User, this.address.Password).Open(this.address.Host, transport); } this.transport = transport; // after getting the transport, move state to open pipe before starting the pump this.SendHeader(); this.SendOpen(open); this.state = State.OpenPipe; this.reader = new Pump(this); this.reader.Start(); }
static void OnOpen(Connection connection, Open open) { var thisPtr = (ListenerConnection)connection; thisPtr.RemoteContainerId = open.ContainerId; }