示例#1
0
        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;
        }
示例#2
0
            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);
                }
            }
示例#3
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;
        }
示例#4
0
            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;
 }
示例#6
0
 public override bool WriteAsync(TransportAsyncCallbackArgs args) => throw new NotImplementedException();
示例#7
0
        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);
        }
示例#8
0
            void HandleProtocolHeaderReadComplete(TransportAsyncCallbackArgs args)
            {
                this.asyncIo.ioHandler.OnReceiveBuffer(new ByteBuffer(args.Buffer, 0, AmqpConstants.ProtocolHeaderSize));

                this.SetReadFrameSize();
            }