public static TransportBase CreateTransport(string host, int port, string sslHost, bool doSslUpgrade, SaslHandler saslHandler) { AmqpSettings settings = GetAmqpSettings(true, sslHost, doSslUpgrade, saslHandler); TransportSettings transportSettings = GetTcpSettings(host, port, false); if (!doSslUpgrade && sslHost != null) { TlsTransportSettings tlsSettings = new TlsTransportSettings(transportSettings); tlsSettings.TargetHost = sslHost; tlsSettings.CertificateValidationCallback = (s, c, h, e) => { return true; }; transportSettings = tlsSettings; } ManualResetEvent complete = new ManualResetEvent(false); AmqpTransportInitiator initiator = new AmqpTransportInitiator(settings, transportSettings); TransportAsyncCallbackArgs args = new TransportAsyncCallbackArgs(); args.CompletedCallback = (a) => { complete.Set(); }; initiator.ConnectAsync(TimeSpan.FromSeconds(120), args); complete.WaitOne(); complete.Dispose(); if (args.Exception != null) { throw args.Exception; } return args.Transport; }
int Read() { ManualResetEvent readComplete = new ManualResetEvent(false); TransportAsyncCallbackArgs args = new TransportAsyncCallbackArgs(); byte[] buffer = new byte[4]; args.SetBuffer(buffer, 0, buffer.Length); args.CompletedCallback = (o) => { readComplete.Set(); }; this.transport.ReadAsync(args); if (!args.CompletedSynchronously) { readComplete.WaitOne(); } if (args.Exception != null) { throw args.Exception; } if (args.BytesTransfered == 0) { Debug.WriteLine("Read got eof."); return 0; } else { return BitConverter.ToInt32(buffer, 0); } }
internal static TransportBase EstablistClientTransport(TransportSettings settings) { ManualResetEvent complete = new ManualResetEvent(false); TransportBase transport = null; Action<TransportAsyncCallbackArgs> onTransport = (a) => { if (a.Exception != null) { Debug.WriteLine(a.Exception.Message); } else { Debug.WriteLine("Initiator established a transport."); transport = a.Transport; } complete.Set(); }; TransportInitiator initiator = settings.CreateInitiator(); Debug.WriteLine("Initiator is connecting to the server..."); TransportAsyncCallbackArgs args = new TransportAsyncCallbackArgs(); args.CompletedCallback = onTransport; initiator.ConnectAsync(TimeSpan.FromSeconds(10), args); complete.WaitOne(); complete.Dispose(); return transport; }
void Write(int number) { byte[] buffer = BitConverter.GetBytes(number); ManualResetEvent writeComplete = new ManualResetEvent(false); TransportAsyncCallbackArgs args = new TransportAsyncCallbackArgs(); args.SetBuffer(buffer, 0, buffer.Length); args.CompletedCallback = (o) => { writeComplete.Set(); }; this.transport.WriteAsync(args); if (!args.CompletedSynchronously) { writeComplete.WaitOne(); } if (args.Exception != null) { throw args.Exception; } }
public TestHelperTransportListener(string type, TransportAsyncCallbackArgs callbackArgs) : base(type) { this.callbackArgs = callbackArgs; }
public override bool WriteAsync(TransportAsyncCallbackArgs args) => throw new NotImplementedException();
private async Task <TransportBase> InitializeTransport(TimeSpan timeout) { if (Logging.IsEnabled) { Logging.Enter(this, timeout, $"{nameof(InitializeTransport)}"); } TransportBase transport; switch (AmqpTransportSettings.GetTransportType()) { case TransportType.Amqp_WebSocket_Only: transport = await CreateClientWebSocketTransportAsync(timeout).ConfigureAwait(false); SaslTransportProvider provider = AmqpSettings.GetTransportProvider <SaslTransportProvider>(); if (provider != null) { if (Logging.IsEnabled) { Logging.Info(this, $"{nameof(InitializeTransport)}: Using SaslTransport"); } SentProtocolHeader = new ProtocolHeader(provider.ProtocolId, provider.DefaultVersion); ByteBuffer buffer = new ByteBuffer(new byte[AmqpConstants.ProtocolHeaderSize]); SentProtocolHeader.Encode(buffer); TaskCompletionSource = new TaskCompletionSource <TransportBase>(); var args = new TransportAsyncCallbackArgs(); args.SetBuffer(buffer.Buffer, buffer.Offset, buffer.Length); args.CompletedCallback = OnWriteHeaderComplete; args.Transport = transport; bool operationPending = transport.WriteAsync(args); if (Logging.IsEnabled) { Logging.Info(this, $"{nameof(InitializeTransport)}: Sent Protocol Header: {SentProtocolHeader.ToString()} operationPending: {operationPending} completedSynchronously: {args.CompletedSynchronously}"); } if (!operationPending) { args.CompletedCallback(args); } transport = await TaskCompletionSource.Task.ConfigureAwait(false); await transport.OpenAsync(timeout).ConfigureAwait(false); } break; case TransportType.Amqp_Tcp_Only: var amqpTransportInitiator = new AmqpTransportInitiator(AmqpSettings, TlsTransportSettings); transport = await amqpTransportInitiator.ConnectTaskAsync(timeout).ConfigureAwait(false); break; default: throw new InvalidOperationException("AmqpTransportSettings must specify WebSocketOnly or TcpOnly"); } if (Logging.IsEnabled) { Logging.Exit(this, timeout, $"{nameof(InitializeTransport)}"); } return(transport); }
void HandleProtocolHeaderReadComplete(TransportAsyncCallbackArgs args) { this.asyncIo.ioHandler.OnReceiveBuffer(new ByteBuffer(args.Buffer, 0, AmqpConstants.ProtocolHeaderSize)); this.SetReadFrameSize(); }