protected AmqpConnectionBase(string type, TransportBase transport, AmqpConnectionSettings settings, bool isInitiator) : base(type, transport.Identifier) { if (settings == null) { throw new ArgumentNullException("settings"); } Fx.Assert(transport != null, "transport must not be null."); this.settings = settings; this.asyncIO = new AsyncIO(this, (int)this.settings.MaxFrameSize(), transport, isInitiator); }
protected AmqpConnectionBase(string type, TransportBase transport, AmqpConnectionSettings settings, bool isInitiator) : base(type, transport.Identifier) { if (settings == null) { throw new ArgumentNullException("settings"); } Fx.Assert(transport != null, "transport must not be null."); this.settings = settings; this.asyncIO = new AsyncIO(this, (int)this.settings.MaxFrameSize(), this.settings.WriteBufferFullLimit, this.settings.WriteBufferEmptyLimit, transport, isInitiator); }
/// <summary> /// Initializes a listener. /// </summary> /// <param name="addresses">The addresses to listen on.</param> /// <param name="settings">The protocol settings of the listener.</param> /// <param name="connectionSettings">The connection settings applied to accepted connections.</param> public AmqpConnectionListener(IEnumerable <string> addresses, AmqpSettings settings, AmqpConnectionSettings connectionSettings) { if (settings.RuntimeProvider == null) { throw new ArgumentNullException("IRuntimeProvider"); } this.runtime = settings.RuntimeProvider; this.connectionSettings = connectionSettings; this.connections = new HashSet <AmqpConnection>(); this.onConnectionClosed = this.OnConnectionClosed; this.listener = CreateListener(addresses, settings); }
public AmqpConnection(TransportBase transport, ProtocolHeader protocolHeader, bool isInitiator, AmqpSettings amqpSettings, AmqpConnectionSettings connectionSettings) : base((isInitiator ? "out" : "in") + "-connection", transport, connectionSettings, isInitiator) { if (amqpSettings == null) { throw new ArgumentNullException("amqpSettings"); } this.initialHeader = protocolHeader; this.isInitiator = isInitiator; this.amqpSettings = amqpSettings; this.sessionsByLocalHandle = new HandleTable<AmqpSession>(this.Settings.ChannelMax ?? AmqpConstants.DefaultMaxConcurrentChannels - 1); this.sessionsByRemoteHandle = new HandleTable<AmqpSession>(this.Settings.ChannelMax ?? AmqpConstants.DefaultMaxConcurrentChannels - 1); this.SessionFactory = this; this.heartBeat = HeartBeat.None; }
public AmqpConnectionSettings Clone() { AmqpConnectionSettings newSettings = new AmqpConnectionSettings(); newSettings.ContainerId = this.ContainerId; newSettings.HostName = this.HostName; newSettings.MaxFrameSize = this.MaxFrameSize; newSettings.ChannelMax = this.ChannelMax; newSettings.IdleTimeOut = this.IdleTimeOut; newSettings.OutgoingLocales = this.OutgoingLocales; newSettings.IncomingLocales = this.IncomingLocales; newSettings.Properties = this.Properties; newSettings.OfferedCapabilities = this.OfferedCapabilities; newSettings.DesiredCapabilities = this.DesiredCapabilities; newSettings.Properties = this.Properties; newSettings.SendBufferSize = this.SendBufferSize; newSettings.ReceiveBufferSize = this.ReceiveBufferSize; newSettings.IgnoreMissingSessions = this.IgnoreMissingSessions; return(newSettings); }
/// <summary> doesn't clone - RemoteSettings: HostName/ContainerId </summary> public AmqpConnectionSettings Clone() { AmqpConnectionSettings newSettings = new AmqpConnectionSettings(); newSettings.ContainerId = this.ContainerId; newSettings.HostName = this.HostName; newSettings.MaxFrameSize = this.MaxFrameSize; newSettings.ChannelMax = this.ChannelMax; newSettings.IdleTimeOut = this.IdleTimeOut; newSettings.OutgoingLocales = this.OutgoingLocales; newSettings.IncomingLocales = this.IncomingLocales; newSettings.Properties = this.Properties; newSettings.OfferedCapabilities = this.OfferedCapabilities; newSettings.DesiredCapabilities = this.DesiredCapabilities; newSettings.Properties = this.Properties; newSettings.SendBufferSize = this.SendBufferSize; newSettings.ReceiveBufferSize = this.ReceiveBufferSize; newSettings.IgnoreMissingSessions = this.IgnoreMissingSessions; newSettings.WriteBufferFullLimit = this.WriteBufferFullLimit; newSettings.WriteBufferEmptyLimit = this.WriteBufferEmptyLimit; newSettings.MinIdleTimeout = this.MinIdleTimeout; return newSettings; }
public AmqpConnection(TransportBase transport, ProtocolHeader protocolHeader, AmqpSettings amqpSettings, AmqpConnectionSettings connectionSettings) : this(transport, protocolHeader, true, amqpSettings, connectionSettings) { }
public AmqpConnection(TransportBase transport, AmqpSettings amqpSettings, AmqpConnectionSettings connectionSettings) : this(transport, amqpSettings.GetDefaultHeader(), true, amqpSettings, connectionSettings) { }
async Task<AmqpSession> CreateSessionAsync(TimeSpan timeout) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); this.refreshTokenTimer.Cancel(); var amqpSettings = this.CreateAmqpSettings(); TransportBase transport; if (this.useWebSocketOnly) { // Try only Amqp transport over WebSocket transport = await this.CreateClientWebSocketTransport(timeoutHelper.RemainingTime()); } else { var tlsTransportSettings = this.CreateTlsTransportSettings(); var amqpTransportInitiator = new AmqpTransportInitiator(amqpSettings, tlsTransportSettings); try { transport = await amqpTransportInitiator.ConnectTaskAsync(timeoutHelper.RemainingTime()); } catch (Exception e) { if (Fx.IsFatal(e)) { throw; } // Amqp transport over TCP failed. Retry Amqp transport over WebSocket if (timeoutHelper.RemainingTime() != TimeSpan.Zero) { transport = await this.CreateClientWebSocketTransport(timeoutHelper.RemainingTime()); } else { throw; } } } AmqpConnectionSettings amqpConnectionSettings = new AmqpConnectionSettings() { MaxFrameSize = AmqpConstants.DefaultMaxFrameSize, ContainerId = Guid.NewGuid().ToString("N"), HostName = this.connectionString.AmqpEndpoint.Host }; var amqpConnection = new AmqpConnection(transport, amqpSettings, amqpConnectionSettings); await amqpConnection.OpenAsync(timeoutHelper.RemainingTime()); var sessionSettings = new AmqpSessionSettings() { Properties = new Fields() }; var amqpSession = amqpConnection.CreateSession(sessionSettings); await amqpSession.OpenAsync(timeoutHelper.RemainingTime()); // This adds itself to amqpConnection.Extensions var cbsLink = new AmqpCbsLink(amqpConnection); await this.SendCbsTokenAsync(cbsLink, timeoutHelper.RemainingTime()); return amqpSession; }
async Task<AmqpSession> CreateSessionAsync(TimeSpan timeout) { TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); this.refreshTokenTimer.Cancel(); var amqpSettings = this.CreateAmqpSettings(); var tlsTransportSettings = this.CreateTlsTransportSettings(); var amqpTransportInitiator = new AmqpTransportInitiator(amqpSettings, tlsTransportSettings); var transport = await amqpTransportInitiator.ConnectTaskAsync(timeoutHelper.RemainingTime()); AmqpConnectionSettings amqpConnectionSettings = new AmqpConnectionSettings() { MaxFrameSize = AmqpConstants.DefaultMaxFrameSize, ContainerId = Guid.NewGuid().ToString("N"), HostName = this.connectionString.AmqpEndpoint.Host }; var amqpConnection = new AmqpConnection(transport, amqpSettings, amqpConnectionSettings); await amqpConnection.OpenAsync(timeoutHelper.RemainingTime()); var sessionSettings = new AmqpSessionSettings() { Properties = new Fields() }; var amqpSession = amqpConnection.CreateSession(sessionSettings); await amqpSession.OpenAsync(timeoutHelper.RemainingTime()); // This adds itself to amqpConnection.Extensions var cbsLink = new AmqpCbsLink(amqpConnection); await this.SendCbsTokenAsync(cbsLink, timeoutHelper.RemainingTime()); return amqpSession; }
public AmqpConnection CreateConnection(TransportBase transport, ProtocolHeader protocolHeader, bool isInitiator, AmqpSettings amqpSettings, AmqpConnectionSettings connectionSettings) { return new AmqpConnection(transport, protocolHeader, false, amqpSettings, connectionSettings); }
public async Task <AmqpConnection> OpenConnectionAsync(Uri addressUri, SaslHandler saslHandler, TimeSpan timeout) { TransportSettings transportSettings; if (addressUri.Scheme.Equals(AmqpConstants.SchemeAmqp, StringComparison.OrdinalIgnoreCase)) { transportSettings = new TcpTransportSettings() { Host = addressUri.Host, Port = addressUri.Port > -1 ? addressUri.Port : AmqpConstants.DefaultPort }; } else if (addressUri.Scheme.Equals(AmqpConstants.SchemeAmqps, StringComparison.OrdinalIgnoreCase)) { TcpTransportSettings tcpSettings = new TcpTransportSettings() { Host = addressUri.Host, Port = addressUri.Port > -1 ? addressUri.Port : AmqpConstants.DefaultSecurePort }; transportSettings = new TlsTransportSettings(tcpSettings) { TargetHost = addressUri.Host }; } #if NET45 else if (addressUri.Scheme.Equals(WebSocketTransport.WebSockets, StringComparison.OrdinalIgnoreCase) || addressUri.Scheme.Equals(WebSocketTransport.SecureWebSockets, StringComparison.OrdinalIgnoreCase)) { transportSettings = new WebSocketTransportSettings() { Uri = addressUri }; } #endif else { throw new NotSupportedException(addressUri.Scheme); } AmqpSettings settings = new AmqpSettings(); if (saslHandler != null) { // Provider for "AMQP3100" SaslTransportProvider saslProvider = new SaslTransportProvider(); saslProvider.Versions.Add(new AmqpVersion(1, 0, 0)); saslProvider.AddHandler(saslHandler); settings.TransportProviders.Add(saslProvider); } // Provider for "AMQP0100" AmqpTransportProvider amqpProvider = new AmqpTransportProvider(); amqpProvider.Versions.Add(new AmqpVersion(new Version(1, 0, 0, 0))); settings.TransportProviders.Add(amqpProvider); AmqpTransportInitiator initiator = new AmqpTransportInitiator(settings, transportSettings); TransportBase transport = await Task.Factory.FromAsync( (c, s) => initiator.BeginConnect(timeout, c, s), (r) => initiator.EndConnect(r), null); try { AmqpConnectionSettings connectionSettings = new AmqpConnectionSettings() { ContainerId = Guid.NewGuid().ToString(), HostName = addressUri.Host }; AmqpConnection connection = new AmqpConnection(transport, settings, connectionSettings); await connection.OpenAsync(timeout); return(connection); } catch { transport.Abort(); throw; } }
async Task<AmqpSession> CreateSessionAsync(TimeSpan timeout) { var timeoutHelper = new TimeoutHelper(timeout); this.refreshTokenTimer.Cancel(); AmqpSettings amqpSettings = this.CreateAmqpSettings(); TlsTransportSettings tlsTransportSettings = this.CreateTlsTransportSettings(); var amqpTransportInitiator = new AmqpTransportInitiator(amqpSettings, tlsTransportSettings); TransportBase transport; switch (this.amqpTransportSettings.GetTransportType()) { case TransportType.Amqp_WebSocket_Only: transport = await this.CreateClientWebSocketTransport(timeoutHelper.RemainingTime()); break; case TransportType.Amqp_Tcp_Only: transport = await amqpTransportInitiator.ConnectTaskAsync(timeoutHelper.RemainingTime()); break; default: throw new InvalidOperationException("AmqpTransportSettings must specify WebSocketOnly or TcpOnly"); } var amqpConnectionSettings = new AmqpConnectionSettings() { MaxFrameSize = AmqpConstants.DefaultMaxFrameSize, ContainerId = Guid.NewGuid().ToString("N"), HostName = this.connectionString.AmqpEndpoint.Host }; var amqpConnection = new AmqpConnection(transport, amqpSettings, amqpConnectionSettings); await amqpConnection.OpenAsync(timeoutHelper.RemainingTime()); var sessionSettings = new AmqpSessionSettings() { Properties = new Fields() }; var amqpSession = amqpConnection.CreateSession(sessionSettings); await amqpSession.OpenAsync(timeoutHelper.RemainingTime()); // This adds itself to amqpConnection.Extensions var cbsLink = new AmqpCbsLink(amqpConnection); await this.SendCbsTokenAsync(cbsLink, timeoutHelper.RemainingTime()); return amqpSession; }
protected virtual async Task<AmqpSession> CreateSessionAsync(TimeSpan timeout) { this.OnCreateSession(); var timeoutHelper = new TimeoutHelper(timeout); AmqpSettings amqpSettings = CreateAmqpSettings(); TransportBase transport; switch (this.AmqpTransportSettings.GetTransportType()) { #if !WINDOWS_UWP case TransportType.Amqp_WebSocket_Only: transport = await this.CreateClientWebSocketTransportAsync(timeoutHelper.RemainingTime()); break; #endif case TransportType.Amqp_Tcp_Only: TlsTransportSettings tlsTransportSettings = this.CreateTlsTransportSettings(); var amqpTransportInitiator = new AmqpTransportInitiator(amqpSettings, tlsTransportSettings); transport = await amqpTransportInitiator.ConnectTaskAsync(timeoutHelper.RemainingTime()); break; default: throw new InvalidOperationException("AmqpTransportSettings must specify WebSocketOnly or TcpOnly"); } var amqpConnectionSettings = new AmqpConnectionSettings() { MaxFrameSize = AmqpConstants.DefaultMaxFrameSize, ContainerId = Guid.NewGuid().ToString("N"), HostName = this.hostName }; var amqpConnection = new AmqpConnection(transport, amqpSettings, amqpConnectionSettings); await amqpConnection.OpenAsync(timeoutHelper.RemainingTime()); var sessionSettings = new AmqpSessionSettings() { Properties = new Fields() }; var amqpSession = amqpConnection.CreateSession(sessionSettings); await amqpSession.OpenAsync(timeoutHelper.RemainingTime()); // This adds itself to amqpConnection.Extensions var cbsLink = new AmqpCbsLink(amqpConnection); return amqpSession; }
/// <summary> /// Opens a connection to the specified address. /// </summary> /// <param name="addressUri">The address Uri. User info is ignored.</param> /// <param name="saslHandler">The SASL handler which determines the SASL mechanism. Null means no SASL handshake.</param> /// <param name="timeout">The operation timeout.</param> /// <returns>An AMQP connection.</returns> public async Task <AmqpConnection> OpenConnectionAsync(Uri addressUri, SaslHandler saslHandler, TimeSpan timeout) { TransportSettings transportSettings; if (addressUri.Scheme.Equals(AmqpConstants.SchemeAmqp, StringComparison.OrdinalIgnoreCase)) { transportSettings = new TcpTransportSettings() { Host = addressUri.Host, Port = addressUri.Port > -1 ? addressUri.Port : AmqpConstants.DefaultPort }; } else if (addressUri.Scheme.Equals(AmqpConstants.SchemeAmqps, StringComparison.OrdinalIgnoreCase)) { TcpTransportSettings tcpSettings = new TcpTransportSettings() { Host = addressUri.Host, Port = addressUri.Port > -1 ? addressUri.Port : AmqpConstants.DefaultSecurePort }; var tls = new TlsTransportSettings(tcpSettings) { TargetHost = addressUri.Host }; TlsTransportProvider tlsProvider = this.settings.GetTransportProvider <TlsTransportProvider>(); if (tlsProvider != null) { tls.CertificateValidationCallback = tlsProvider.Settings.CertificateValidationCallback; tls.CheckCertificateRevocation = tlsProvider.Settings.CheckCertificateRevocation; tls.Certificate = tlsProvider.Settings.Certificate; tls.Protocols = tlsProvider.Settings.Protocols; } transportSettings = tls; } else if (addressUri.Scheme.Equals(WebSocketTransportSettings.WebSockets, StringComparison.OrdinalIgnoreCase) || addressUri.Scheme.Equals(WebSocketTransportSettings.SecureWebSockets, StringComparison.OrdinalIgnoreCase)) { transportSettings = new WebSocketTransportSettings() { Uri = addressUri }; } else { throw new NotSupportedException(addressUri.Scheme); } AmqpSettings settings = this.settings.Clone(); settings.TransportProviders.Clear(); if (saslHandler != null) { // Provider for "AMQP3100" SaslTransportProvider saslProvider = new SaslTransportProvider(AmqpVersion.V100); saslProvider.AddHandler(saslHandler); settings.TransportProviders.Add(saslProvider); } // Provider for "AMQP0100" AmqpTransportProvider amqpProvider = new AmqpTransportProvider(AmqpVersion.V100); settings.TransportProviders.Add(amqpProvider); AmqpTransportInitiator initiator = new AmqpTransportInitiator(settings, transportSettings); TransportBase transport = await Task.Factory.FromAsync( (c, s) => initiator.BeginConnect(timeout, c, s), (r) => initiator.EndConnect(r), null).ConfigureAwait(false); try { AmqpConnectionSettings connectionSettings = new AmqpConnectionSettings() { ContainerId = Guid.NewGuid().ToString(), HostName = addressUri.Host }; AmqpConnection connection = new AmqpConnection(transport, settings, connectionSettings); await connection.OpenAsync(timeout).ConfigureAwait(false); return(connection); } catch { transport.Abort(); throw; } }
public AmqpConnection(TransportBase transport, ProtocolHeader protocolHeader, bool isInitiator, AmqpSettings amqpSettings, AmqpConnectionSettings connectionSettings) : base((isInitiator ? "out" : "in") + "-connection", transport, connectionSettings, isInitiator) { if (amqpSettings == null) { throw new ArgumentNullException("amqpSettings"); } this.initialHeader = protocolHeader; this.isInitiator = isInitiator; this.amqpSettings = amqpSettings; this.sessionsByLocalHandle = new HandleTable <AmqpSession>(this.Settings.ChannelMax ?? AmqpConstants.DefaultMaxConcurrentChannels - 1); this.sessionsByRemoteHandle = new HandleTable <AmqpSession>(this.Settings.ChannelMax ?? AmqpConstants.DefaultMaxConcurrentChannels - 1); this.SessionFactory = this; this.heartBeat = HeartBeat.None; }
public AmqpConnection(TransportBase transport, ProtocolHeader protocolHeader, bool isInitiator, AmqpSettings amqpSettings, AmqpConnectionSettings connectionSettings) : this((isInitiator ? "out" : "in") + "-connection", transport, protocolHeader, isInitiator, amqpSettings, connectionSettings) { }
void OnAcceptTransport(TransportListener listener, TransportAsyncCallbackArgs args) { AmqpConnectionSettings connectionSettings = new AmqpConnectionSettings() { ContainerId = this.containerId, MaxFrameSize = this.maxFrameSize }; AmqpConnection connection = null; try { connection = this.CreateConnection( args.Transport, (ProtocolHeader)args.UserToken, false, this.settings, connectionSettings); connection.BeginOpen(connection.DefaultOpenTimeout, this.OnConnectionOpenComplete, connection); } catch (Exception ex) { if (connection != null) { connection.SafeClose(ex); } } }