/// <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; }
/// <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); }
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; }
internal Connection(AmqpSettings amqpSettings, Address address, IAsyncTransport transport, Open open, OnOpened onOpened) : this((ushort)(amqpSettings.MaxSessionsPerConnection - 1), (uint)amqpSettings.MaxFrameSize) { 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 = null, OnOpened onOpened = null) { 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); } try { if (address.User != null) { SaslPlainProfile profile = new SaslPlainProfile(address.User, address.Password); transport = await profile.OpenAsync(address.Host, this.BufferManager, transport, null); } else if (this.saslSettings != null && this.saslSettings.Profile != null) { transport = await this.saslSettings.Profile.OpenAsync(address.Host, this.BufferManager, transport, null); } } catch { transport.Close(); throw; } AsyncPump pump = new AsyncPump(this.BufferManager, transport); Connection connection = new Connection(this.BufferManager, this.AMQP, address, transport, open, onOpened); pump.Start(connection); return(connection); }
internal Connection(ConnectionFactory factory, Address address, IAsyncTransport transport, Open open, OnOpened onOpened) : this(factory.amqpSettings.MaxSessionsPerConnection) { this.address = address; this.onOpened = onOpened; this.maxFrameSize = (uint)factory.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 = factory.amqpSettings.ContainerId, HostName = factory.amqpSettings.HostName ?? this.address.Host }; } this.SendHeader(); this.SendOpen(open); this.state = State.OpenPipe; }
/// <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> /// <remarks> /// The connection initialization includes establishing the underlying transport, /// which typically has blocking network I/O. Depending on the current synchronization /// context, it may cause deadlock or UI freeze. Please use the ConnectionFactory.CreateAsync /// method instead. /// </remarks> public Connection(Address address, SaslProfile saslProfile, Open open, OnOpened onOpened) : this(address, DefaultMaxSessions, DefaultMaxFrameSize) { this.onOpened = onOpened; this.Connect(saslProfile, open); }