Esempio n. 1
0
 public TransportListener(ITransportListener listener, string address, Int32 port)
 {
     this.tcpListener = null;
     this.listener = listener;
     this.address = address;
     this.port = port;
 }
        public BayeuxClient(string url, params ClientTransport[] transports)
        {
            //logger = Log.getLogger(GetType().FullName + "@" + this.GetHashCode());
            //Console.WriteLine(GetType().FullName + "@" + this.GetHashCode());

            handshakeListener  = new HandshakeTransportListener(this);
            connectListener    = new ConnectTransportListener(this);
            disconnectListener = new DisconnectTransportListener(this);
            publishListener    = new PublishTransportListener(this);

            if (transports == null || transports.Length == 0 || transports[0] == null)
            {
                throw new ArgumentNullException(nameof(transports));
            }

            foreach (var t in transports)
            {
                transportRegistry.Add(t);
            }

            foreach (var transportName in transportRegistry.KnownTransports)
            {
                var clientTransport = transportRegistry.GetTransport(transportName);
                if (clientTransport is HttpClientTransport httpTransport)
                {
                    httpTransport.Url = url;
                    httpTransport.SetCookieCollection(cookieCollection);
                }
            }

            bayeuxClientState = new DisconnectedState(this, null);
        }
Esempio n. 3
0
 public LongPollingRequest(ITransportListener listener, IList <IMutableMessage> messages,
                           HttpWebRequest request)
 {
     _listener = listener;
     _messages = messages;
     _request  = request;
 }
 public LongPollingRequest(ITransportListener _listener, IList <IMutableMessage> _messages,
                           HttpWebRequest _request)
 {
     listener = _listener;
     messages = _messages;
     request  = _request;
 }
 public TcpTransportBenchmark()
 {
     _uri = new Uri("net.tcp://localhost:55321");
     _cancellationToken  = TimeSpan.FromSeconds(60).ToCancellationToken();
     _envelopeSerializer = new EnvelopeSerializer(new DocumentTypeResolver().WithMessagingDocuments());
     _transportListener  = new TcpTransportListener(_uri, null, _envelopeSerializer);
 }
 public TransportListenerWrapper(ITransportListener wrappedListener, Action <ProtocolMessage> afterMessage,
                                 MessageHandler handler)
 {
     _wrappedListener = wrappedListener;
     _afterMessage    = afterMessage;
     _handler         = handler;
 }
Esempio n. 7
0
            public void send(ITransportListener listener, IList <IMutableMessage> messages)
            {
                LogHelper.Log($"BayeuxClientState: send()");

                foreach (var message in messages)
                {
                    if (message.Id == null)
                    {
                        message.Id = bayeuxClient.newMessageId();
                    }
                    if (clientId != null)
                    {
                        message.ClientId = clientId;
                    }

                    if (!bayeuxClient.extendSend(message))
                    {
                        messages.Remove(message);
                    }
                }
                if (messages.Count > 0)
                {
                    transport.send(listener, messages);
                }
            }
Esempio n. 8
0
            public void Send(ITransportListener listener, IList <IMutableMessage> messages, int clientTimeout = ClientTransport.DEFAULT_TIMEOUT)
            {
                foreach (var message in messages)
                {
                    if (message.Id == null)
                    {
                        message.Id = _bayeuxClient.NewMessageId();
                    }

                    if (ClientId != null)
                    {
                        message.ClientId = ClientId;
                    }

                    if (!_bayeuxClient.ExtendSend(message))
                    {
                        messages.Remove(message);
                    }
                }

                if (messages.Count > 0)
                {
                    Transport.Send(listener, messages, clientTimeout);
                }
            }
Esempio n. 9
0
        public async Task StartServerAsync()
        {
            var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

            store.Open(OpenFlags.ReadOnly);

            //var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "f864d23e92894c56df566b7ab7a9c6411d50d14d", false);
            var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "3fd0b5f28dc32f5f0bb9f44cf1f6816846e44cbe", false);

            if (certificates.Count == 0)
            {
                throw new InvalidOperationException("Server certificate not found");
            }

            store.Close();
#if DEBUG
            ITraceWriter traceWriter = new DebugTraceWriter("Server");
#else
            ITraceWriter traceWriter = new FileTraceWriter("server.log");
#endif

            _listener = new TcpTransportListener(
                _listenerUri,
                certificates[0],
                new EnvelopeSerializer(),
                traceWriter
                );


            await _listener.StartAsync();
        }
Esempio n. 10
0
            public void send(ITransportListener listener, IMutableMessage message)
            {
                IList <IMutableMessage> messages = new List <IMutableMessage>();

                messages.Add(message);
                send(listener, messages);
            }
 public LongPollingRequest(ITransportListener _listener, IList<IMutableMessage> _messages,
         HttpWebRequest _request)
 {
     listener = _listener;
     messages = _messages;
     request = _request;
 }
Esempio n. 12
0
        public BayeuxClient(String url, IList <ClientTransport> transports)
        {
            //logger = Log.getLogger(GetType().FullName + "@" + this.GetHashCode());
            //Console.WriteLine(GetType().FullName + "@" + this.GetHashCode());

            handshakeListener  = new HandshakeTransportListener(this);
            connectListener    = new ConnectTransportListener(this);
            disconnectListener = new DisconnectTransportListener(this);
            publishListener    = new PublishTransportListener(this);

            if (transports == null || transports.Count == 0)
            {
                throw new ArgumentException("Transport cannot be null");
            }

            foreach (ClientTransport t in transports)
            {
                transportRegistry.Add(t);
            }

            foreach (String transportName in transportRegistry.KnownTransports)
            {
                ClientTransport clientTransport = transportRegistry.getTransport(transportName);
                if (clientTransport is HttpClientTransport)
                {
                    HttpClientTransport httpTransport = (HttpClientTransport)clientTransport;
                    httpTransport.setURL(url);
                    httpTransport.setCookieCollection(cookieCollection);
                }
            }

            bayeuxClientState = new DisconnectedState(this, null);
        }
Esempio n. 13
0
        public BayeuxClient(String url, IList<ClientTransport> transports)
        {
            //logger = Log.getLogger(GetType().FullName + "@" + this.GetHashCode());
            //Console.WriteLine(GetType().FullName + "@" + this.GetHashCode());

            handshakeListener = new HandshakeTransportListener(this);
            connectListener = new ConnectTransportListener(this);
            disconnectListener = new DisconnectTransportListener(this);
            publishListener = new PublishTransportListener(this);

            if (transports == null || transports.Count == 0)
                throw new ArgumentException("Transport cannot be null");

            foreach (ClientTransport t in transports)
                transportRegistry.Add(t);

            foreach (String transportName in transportRegistry.KnownTransports)
            {
                ClientTransport clientTransport = transportRegistry.getTransport(transportName);
                if (clientTransport is HttpClientTransport)
                {
                    HttpClientTransport httpTransport = (HttpClientTransport)clientTransport;
                    httpTransport.setURL(url);
                    httpTransport.setCookieCollection(cookieCollection);
                }
            }

            bayeuxClientState = new DisconnectedState(this, null);
        }
Esempio n. 14
0
        /// <summary>
        /// Creates a server specified in the config file retrieved from <paramref name="configURI"/>. Fragment part of
        /// the <paramref name="configURI"/> may be used to select the server by its index, e.g.
        /// <c>"http://www.example.org/config.json#3"</c>. If no fragment is provided, or index is invalid, first server
        /// with supported protocol is chosen. For each connected client <paramref name="onNewClient"/> is called with
        /// constructed Connection object.
        /// </summary>
        /// <remarks>
        /// Note that <paramref name="onNewClient"/> may be executed on a different thread than the one you are calling
        /// from, depending on the implementation of the protocol specified in the config file.
        /// </remarks>
        public ServiceDescription StartServer(string uri, int port, string transportName, string protocolName,
                                              Config ServerConfig, Action <Connection> onNewClient)
        {
            IProtocol protocol = protocolRegistry.GetProtocol(protocolName);
            ITransportConnectionFactory transportConnectionFactory = TransportRegistry.Instance
                                                                     .GetTransport(transportName)
                                                                     .TransportConnectionFactory;
            ITransportListener transportListener = transportConnectionFactory.StartConnectionListener(uri, port);

            transportListener.NewClientConnected += (object sender, NewConnectionEventArgs e) =>
            {
                Connection newConnection = new Connection(e.Connection, protocol);
                newConnection.LoadIDL(ServerConfig);
                onNewClient(newConnection);
            };

            var server = new ServiceDescription();

            server.protocol = new ProtocolConfig
            {
                name = protocolName
            };
            server.transport = new TransportConfig
            {
                name = transportName,
                url  = transportName + "://" + uri + ":" + port
            };
            server.implementedServices = "*";
            return(server);
        }
Esempio n. 15
0
        public BayeuxClient(string url, IList <ClientTransport> transports)
        {
            _handshakeListener  = new HandshakeTransportListener(this);
            _connectListener    = new ConnectTransportListener(this);
            _disconnectListener = new DisconnectTransportListener(this);
            _publishListener    = new PublishTransportListener(this);

            if (transports == null || transports.Count == 0)
            {
                throw new ArgumentException("Transport cannot be null");
            }

            foreach (var t in transports)
            {
                _transportRegistry.Add(t);
            }

            foreach (var transportName in _transportRegistry.KnownTransports)
            {
                var clientTransport = _transportRegistry.GetTransport(transportName);
                if (!(clientTransport is HttpClientTransport))
                {
                    continue;
                }

                var httpTransport = (HttpClientTransport)clientTransport;
                httpTransport.Url = url;
            }

            _bayeuxClientState = new DisconnectedState(this, null);
        }
Esempio n. 16
0
 public WebSocketTransportBenchmark()
 {
     _uri = new Uri("ws://localhost:8081");
     _cancellationToken  = TimeSpan.FromSeconds(60).ToCancellationToken();
     _envelopeSerializer = new EnvelopeSerializer(new DocumentTypeResolver().WithMessagingDocuments());
     _transportListener  = new WebSocketTransportListener(_uri, null, _envelopeSerializer, null, webSocketMessageType: System.Net.WebSockets.WebSocketMessageType.Text);
 }
Esempio n. 17
0
 public TransportListener(ITransportListener listener, string address, Int32 port)
 {
     this.tcpListener = null;
     this.listener    = listener;
     this.address     = address;
     this.port        = port;
 }
Esempio n. 18
0
        public async Task StartServerAsync()
        {
            var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);

            //var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "f864d23e92894c56df566b7ab7a9c6411d50d14d", false);
            var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "3fd0b5f28dc32f5f0bb9f44cf1f6816846e44cbe", false);
            
            if (certificates.Count == 0)
            {
                throw new InvalidOperationException("Server certificate not found");
            }

            store.Close();
#if DEBUG
            ITraceWriter traceWriter = new DebugTraceWriter("Server"); 
#else
            ITraceWriter traceWriter = new FileTraceWriter("server.log"); 
#endif

            _listener = new TcpTransportListener(
                _listenerUri,
                certificates[0],
                new EnvelopeSerializer(),
                traceWriter
                );


            await _listener.StartAsync();
        }
        public override void Send(
            ITransportListener listener,
            IList <IMutableMessage> messages,
            int requestTimeout = 1200)
        {
            //Console.WriteLine();
            //Console.WriteLine("send({0} message(s))", messages.Count);
            var url = Url;

            if (_appendMessageType && messages.Count == 1 && messages[0].Meta)
            {
                var type = messages[0].Channel.Substring(ChannelFields.META.Length);
                if (url.EndsWith("/"))
                {
                    url = url.Substring(0, url.Length - 1);
                }

                url += type;
            }

            var request = (HttpWebRequest)WebRequest.Create(url);

            request.Method      = "POST";
            request.ContentType = "application/json;charset=UTF-8";

            if (request.CookieContainer == null)
            {
                request.CookieContainer = new CookieContainer();
            }

            request.CookieContainer.Add(GetCookieCollection());

            if (request.Headers == null)
            {
                request.Headers = new WebHeaderCollection();
            }

            request.Headers.Add(GetHeaderCollection());

            var content = JsonConvert.SerializeObject(ObjectConverter.ToListOfDictionary(messages));

            _logger?.LogDebug($"Send: {content}");

            var longPollingRequest = new LongPollingRequest(listener, messages, request, requestTimeout);

            var exchange = new TransportExchange(this, listener, messages, longPollingRequest)
            {
                Content = content,
                Request = request
            };

            lock (this)
            {
                _exchanges.Add(exchange);
            }

            longPollingRequest.Exchange = exchange;
            AddRequest(longPollingRequest);
        }
Esempio n. 20
0
            public void Send(ITransportListener listener, IMutableMessage message, int clientTimeout = ClientTransport.DEFAULT_TIMEOUT)
            {
                IList <IMutableMessage> messages = new List <IMutableMessage>
                {
                    message
                };

                Send(listener, messages, clientTimeout);
            }
            public void Send(ITransportListener listener, IMutableMessage message)
            {
                IList <IMutableMessage> messages = new List <IMutableMessage>
                {
                    message
                };

                Send(listener, messages);
            }
Esempio n. 22
0
 public TransportExchange(LongPollingTransport parent, ITransportListener listener, IList <IMutableMessage> messages,
                          LongPollingRequest lprequest)
 {
     _parent   = parent;
     Listener  = listener;
     Messages  = messages;
     Request   = null;
     LpRequest = lprequest;
     IsSending = true;
 }
Esempio n. 23
0
 public TransportExchange(LongPollingTransport _parent, ITransportListener _listener, IList <IMutableMessage> _messages,
                          LongPollingRequest _lprequest)
 {
     parent    = _parent;
     listener  = _listener;
     messages  = _messages;
     request   = null;
     lprequest = _lprequest;
     isSending = true;
 }
 public LongPollingRequest(
     ITransportListener listener,
     IList <IMutableMessage> messages,
     HttpWebRequest request,
     int requestTimeout = DEFAULT_TIMEOUT)
 {
     _listener     = listener;
     _messages     = messages;
     _request      = request;
     RequestTimout = requestTimeout;
 }
Esempio n. 25
0
        static async Task ListenAsync(ITransportListener transportListener, CancellationToken cancellationToken)
        {
            // List of all active consumer tasks
            var consumerTasks = new List <Task>();


            while (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    // Awaits for a new transport connection
                    var transport = await transportListener.AcceptTransportAsync(cancellationToken);

                    Console.WriteLine("Transport connection received.");
                    await transport.OpenAsync(null, cancellationToken);

                    // Creates a new server channel, setting the session parameters
                    var sessionId   = Guid.NewGuid();
                    var sendTimeout = TimeSpan.FromSeconds(60);

                    var serverChannel = new ServerChannel(
                        sessionId.ToString(),
                        _serverNode,
                        transport,
                        sendTimeout);

                    var consumerTask = Task.Run(async() => await ConsumeAsync(serverChannel, cancellationToken),
                                                cancellationToken);

                    var continuation = consumerTask
                                       .ContinueWith(t =>
                    {
                        if (t.Exception != null)
                        {
                            Console.WriteLine("Consumer task failed: {0}", t.Exception.InnerException.Message);
                        }

                        consumerTasks.Remove(consumerTask);
                    }, cancellationToken);

                    consumerTasks.Add(consumerTask);
                }
                catch (OperationCanceledException ex) when(cancellationToken.IsCancellationRequested)
                {
                    break;
                }
                catch (Exception ex)
                {
                    Console.WriteLine("The listener failed with an error: {0}", ex);
                }
            }

            await Task.WhenAll(consumerTasks);
        }
Esempio n. 26
0
 public ServerBuilder(Node serverNode, ITransportListener transportListener)
 {
     ServerNode        = serverNode ?? throw new ArgumentNullException(nameof(serverNode));
     TransportListener = transportListener ?? throw new ArgumentNullException(nameof(transportListener));
     Authenticator     = (node, authentication) => Task.FromResult(
         new AuthenticationResult(null, new Node(Guid.NewGuid().ToString(), ServerNode.Domain, "default")));
     ServerChannelFactory = transport =>
                            new ServerChannel(Guid.NewGuid().ToString(), ServerNode, transport, TimeSpan.FromSeconds(30));
     ChannelListenerFactory = () => new ChannelListener(m => TaskUtil.TrueCompletedTask,
                                                        n => TaskUtil.TrueCompletedTask, c => TaskUtil.TrueCompletedTask);
 }
Esempio n. 27
0
        public override void send(ITransportListener listener, IList <IMutableMessage> messages)
        {
            //Console.WriteLine();
            //Console.WriteLine("send({0} message(s))", messages.Count);
            String url = getURL();

            if (_appendMessageType && messages.Count == 1 && messages[0].Meta)
            {
                String type = messages[0].Channel.Substring(Channel_Fields.META.Length);
                if (url.EndsWith("/"))
                {
                    url = url.Substring(0, url.Length - 1);
                }
                url += type;
            }

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            request.Method      = "POST";
            request.ContentType = "application/json;charset=UTF-8";

#if !SILVERLIGHT
            if (request.CookieContainer == null)
            {
                request.CookieContainer = new CookieContainer();
            }
            request.CookieContainer.Add(getCookieCollection());
#endif

#if !SILVERLIGHT
            JavaScriptSerializer jsonParser = new JavaScriptSerializer();
            String content = jsonParser.Serialize(ObjectConverter.ToListOfDictionary(messages));
#endif

#if SILVERLIGHT
            String content = JsonConvert.SerializeObject(ObjectConverter.ToListOfDictionary(messages));
#endif

            LongPollingRequest longPollingRequest = new LongPollingRequest(listener, messages, request);

            TransportExchange exchange = new TransportExchange(this, listener, messages, longPollingRequest);
            exchange.content = content;
            exchange.request = request;
            lock (this)
            {
                _exchanges.Add(exchange);
            }

            longPollingRequest.exchange = exchange;
            addRequest(longPollingRequest);
        }
Esempio n. 28
0
        public TcpTransportTests()
        {
            _uri = new Uri("net.tcp://localhost:55321");
            _cancellationToken  = TimeSpan.FromSeconds(30).ToCancellationToken();
            _envelopeSerializer = new FakeEnvelopeSerializer(10);
            _transportListener  = new TcpTransportListener(_uri, null, _envelopeSerializer);
            _transportListener.StartAsync(_cancellationToken).Wait();
            var serverTcpTransportTask = _transportListener.AcceptTransportAsync(_cancellationToken);

            _clientTransport = new TcpTransport(_envelopeSerializer);
            _clientTransport.OpenAsync(_uri, _cancellationToken).Wait();
            _serverTransport = (TcpTransport)serverTcpTransportTask.Result;
            _serverTransport.OpenAsync(_uri, _cancellationToken).Wait();
        }
Esempio n. 29
0
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            if (disposing)
            {
                DisposeSocketConnection();
                Listener = null;
            }

            _disposed = true;
        }
Esempio n. 30
0
        public async Task SendAsync_AfterServerDisconnect_ClientAutomaticallyReconnects()
        {
            ITransport         clientTransport   = null;
            ITransport         serverTransport   = null;
            ITransportListener transportListener = null;

            try
            {
                // Arrange
                transportListener = CreateTransportListener(ListenerUri, EnvelopeSerializer);
                await transportListener.StartAsync(CancellationToken);

                clientTransport = CreateClientTransport(EnvelopeSerializer);
                var serverTransportTask = transportListener.AcceptTransportAsync(CancellationToken);
                await clientTransport.OpenAsync(ListenerUri, CancellationToken);

                serverTransport = await serverTransportTask;
                await serverTransport.OpenAsync(ListenerUri, CancellationToken);

                var message = Dummy.CreateMessage(Dummy.CreateTextContent());

                // Act
                await transportListener.StopAsync(CancellationToken);

                await serverTransport.CloseAsync(CancellationToken);

                transportListener = CreateTransportListener(ListenerUri, EnvelopeSerializer);
                await transportListener.StartAsync(CancellationToken);

                serverTransport = await transportListener.AcceptTransportAsync(CancellationToken);

                await serverTransport.OpenAsync(ListenerUri, CancellationToken);

                await clientTransport.SendAsync(message, CancellationToken);

                var actual = await serverTransport.ReceiveAsync(CancellationToken);

                // Assert
                var actualMessage = actual.ShouldBeOfType <Message>();
                CompareMessages(message, actualMessage);
            }
            finally
            {
                (clientTransport as IDisposable)?.Dispose();
                (serverTransport as IDisposable)?.Dispose();
                (transportListener as IDisposable)?.Dispose();
            }
        }
        public async Task SetUp()
        {
            _uri = CreateUri();
            _cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
            _cancellationToken  = _cts.Token;
            _envelopeSerializer = new EnvelopeSerializer(new DocumentTypeResolver().WithMessagingDocuments());
            _transportListener  = CreateTransportListener(_uri, _envelopeSerializer);
            await _transportListener.StartAsync(_cancellationToken);

            var serverTcpTransportTask = _transportListener.AcceptTransportAsync(_cancellationToken);

            _clientTransport = new SynchronizedTransportDecorator(CreateClientTransport(_envelopeSerializer));
            await _clientTransport.OpenAsync(_uri, _cancellationToken);

            _serverTransport = new SynchronizedTransportDecorator(await serverTcpTransportTask);
            await _serverTransport.OpenAsync(_uri, _cancellationToken);
        }
Esempio n. 32
0
 public ServerBuilder(Node serverNode, ITransportListener transportListener)
 {
     ServerNode        = serverNode ?? throw new ArgumentNullException(nameof(serverNode));
     TransportListener = transportListener ?? throw new ArgumentNullException(nameof(transportListener));
     Authenticator     = (node, authentication, cancellationToken) => Task.FromResult(
         new AuthenticationResult(DomainRole.Member));
     ServerChannelFactory = transport =>
                            new ServerChannel(
         Guid.NewGuid().ToString(),
         ServerNode,
         transport,
         TimeSpan.FromSeconds(30),
         EnvelopeBufferSize);
     ChannelListenerFactory = _ => new ChannelListener(m => TaskUtil.TrueCompletedTask,
                                                       n => TaskUtil.TrueCompletedTask, c => TaskUtil.TrueCompletedTask);
     EnvelopeBufferSize = 1;
 }
Esempio n. 33
0
        /// <summary>
        /// Sends the specified messages to a Bayeux server asynchronously.
        /// </summary>
        /// <param name="listener">The listener used to process the request response.</param>
        /// <param name="messages">The list of messages will be sent in one request.</param>
        public virtual void Send(ITransportListener listener, params IMutableMessage[] messages)
        {
            if (messages == null)
            {
                throw new ArgumentNullException("messages");
            }

            List <IMutableMessage> validMessages = new List <IMutableMessage>();

            foreach (IMutableMessage message in messages)
            {
                if (message != null)
                {
                    string msgId = message.Id;
                    if (String.IsNullOrEmpty(msgId))
                    {
                        msgId      = _session.NewMessageId();
                        message.Id = msgId;
                    }

                    if (!String.IsNullOrEmpty(_clientId))                    // TODO: && String.IsNullOrEmpty(message.ClientId)
                    {
                        message.ClientId = _clientId;
                    }

                    if (_session.ExtendSend(message))
                    {
                        // Extensions may have modified the messageId, but we need to own
                        // the messageId in case of meta messages to link request/response
                        // in non request/response transports such as websocket
                        message.Id = msgId;

                        validMessages.Add(message);
                    }
                }
            }

            if (validMessages.Count > 0)
            {
                // DEBUG
                Debug.Print("Sending messages: {0}", ObjectConverter.Serialize(validMessages));

                _transport.Send(listener, validMessages.ToArray());
            }
        }
        public WebSocketTransportBinaryTests()
        {
            var trace = new CustomTraceWriter();

            _uri = new Uri("ws://localhost:8081");
            _cancellationToken  = TimeSpan.FromSeconds(30).ToCancellationToken();
            _envelopeSerializer = new EnvelopeSerializer(new DocumentTypeResolver().WithMessagingDocuments());
            _transportListener  = new WebSocketTransportListener(_uri, null, _envelopeSerializer, trace, webSocketMessageType: System.Net.WebSockets.WebSocketMessageType.Binary);
            _transportListener.StartAsync(_cancellationToken).Wait();

            var serverTcpTransportTask = _transportListener.AcceptTransportAsync(_cancellationToken);

            _clientTransport = new ClientWebSocketTransport(_envelopeSerializer, trace, webSocketMessageType: System.Net.WebSockets.WebSocketMessageType.Binary);
            _clientTransport.OpenAsync(_uri, _cancellationToken).Wait();

            _serverTransport = (WebSocketTransport)serverTcpTransportTask.Result;
            _serverTransport.OpenAsync(_uri, _cancellationToken).Wait();
        }
Esempio n. 35
0
		/// <summary>
		/// Initializes a new instance of the <see cref="LongPollingRequest"/> class.
		/// </summary>
		public LongPollingRequest(
			LongPollingTransport transport,
			HttpWebRequest request,
			ITransportListener listener,
			params IMessage[] messages)
		{
			if (null == transport)
				throw new ArgumentNullException("transport");
			if (null == request)
				throw new ArgumentNullException("request");
			if (messages == null || messages.Length == 0 || messages[0] == null)
				throw new ArgumentNullException("messages");

			_transport = transport;
			_request = request;
			_listener = listener;
			_messages = messages;
		}
        public override void send(ITransportListener listener, IList<IMutableMessage> messages)
        {
            //Console.WriteLine();
            //Console.WriteLine("send({0} message(s))", messages.Count);
            String url = getURL();

            if (_appendMessageType && messages.Count == 1 && messages[0].Meta)
            {
                String type = messages[0].Channel.Substring(Channel_Fields.META.Length);
                if (url.EndsWith("/"))
                    url = url.Substring(0, url.Length - 1);
                url += type;
            }

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json;charset=UTF-8";

            if (request.CookieContainer == null)
                request.CookieContainer = new CookieContainer();
            request.CookieContainer.Add(getCookieCollection());

            JavaScriptSerializer jsonParser = new JavaScriptSerializer();
            String content = jsonParser.Serialize(ObjectConverter.ToListOfDictionary(messages));

            LongPollingRequest longPollingRequest = new LongPollingRequest(listener, messages, request);

            TransportExchange exchange = new TransportExchange(this, listener, messages, longPollingRequest);
            exchange.content = content;
            exchange.request = request;
            lock (this)
            {
                _exchanges.Add(exchange);
            }

            longPollingRequest.exchange = exchange;
            addRequest(longPollingRequest);
        }
Esempio n. 37
0
		/// <summary>
		/// Sends the specified messages to a Bayeux server asynchronously.
		/// </summary>
		/// <param name="listener">The listener used to process the request response.</param>
		/// <param name="messages">The list of messages will be sent in one request.</param>
		public abstract void Send(ITransportListener listener, params IMutableMessage[] messages);
Esempio n. 38
0
		/// <summary>
		/// Sends the specified messages to a Bayeux server asynchronously.
		/// </summary>
		/// <param name="listener">The listener used to process the request response.</param>
		/// <param name="messages">The list of messages will be sent in one request.</param>
		public virtual void Send(ITransportListener listener, params IMutableMessage[] messages)
		{
			if (messages == null)
				throw new ArgumentNullException("messages");

			List<IMutableMessage> validMessages = new List<IMutableMessage>();
			foreach (IMutableMessage message in messages)
			{
				if (message != null)
				{
					string msgId = message.Id;
					if (String.IsNullOrEmpty(msgId))
					{
						msgId = _session.NewMessageId();
						message.Id = msgId;
					}

					if (!String.IsNullOrEmpty(_clientId))// TODO: && String.IsNullOrEmpty(message.ClientId)
						message.ClientId = _clientId;

					if (_session.ExtendSend(message))
					{
						// Extensions may have modified the messageId, but we need to own
						// the messageId in case of meta messages to link request/response
						// in non request/response transports such as websocket
						message.Id = msgId;

						validMessages.Add(message);
					}
				}
			}

			if (validMessages.Count > 0)
			{
				// DEBUG
				Debug.Print("Sending messages: {0}", ObjectConverter.Serialize(validMessages));

				_transport.Send(listener, validMessages.ToArray());
			}
		}
Esempio n. 39
0
 public void send(ITransportListener listener, IMutableMessage message)
 {
     IList<IMutableMessage> messages = new List<IMutableMessage>();
     messages.Add(message);
     send(listener, messages);
 }
Esempio n. 40
0
            public void send(ITransportListener listener, IList<IMutableMessage> messages)
            {
                foreach (IMutableMessage message in messages)
                {
                    if (message.Id == null)
                        message.Id = bayeuxClient.newMessageId();
                    if (clientId != null)
                        message.ClientId = clientId;

                    if (!bayeuxClient.extendSend(message))
                        messages.Remove(message);
                }
                if (messages.Count > 0)
                {
                    transport.send(listener, messages);
                }
            }
Esempio n. 41
0
 public FailedTransportListener(ITransportListener listener, Exception error)
 {
     this.Listener = listener;
     this.Error    = error;
 }
Esempio n. 42
0
		/// <summary>
		/// <p>Creates a <see cref="BayeuxClient"/> that will connect to the Bayeux server
		/// at the given URL and with the given transport(s).</p>
		/// <p>This constructor allocates a new scheduler; it is recommended that
		/// when creating a large number of <see cref="BayeuxClient"/>s a shared scheduler is used.</p>
		/// </summary>
		/// <param name="url">The Bayeux server URL to connect to.</param>
		/// <param name="transports">The default (mandatory) and additional optional transports to use.</param>
		public BayeuxClient(string url, params ClientTransport[] transports)
		{
			if (transports == null || transports.Length == 0 || transports[0] == null)
				throw new ArgumentNullException("transports");

			foreach (ClientTransport t in transports)
				_transportRegistry.Add(t);

			HttpClientTransport clientTransport;
			foreach (string transportName in _transportRegistry.KnownTransports)
			{
				clientTransport = _transportRegistry.GetTransport(transportName) as HttpClientTransport;
				if (clientTransport != null)
				{
					if (!String.IsNullOrEmpty(url))
						clientTransport.Url = url;
					clientTransport.CookieProvider = _cookieProvider;
				}
			}

			_handshakeListener = new HandshakeTransportListener(this);
			_connectListener = new ConnectTransportListener(this);
			_disconnectListener = new DisconnectTransportListener(this);
			_publishListener = new PublishTransportListener(this);

#pragma warning disable 0420
			Interlocked.Exchange<BayeuxClientState>(ref _bayeuxClientState, new DisconnectedState(this, transports[0]));
#pragma warning restore 0420
		}
 public TransportExchange(LongPollingTransport _parent, ITransportListener _listener, IList<IMutableMessage> _messages,
         LongPollingRequest _lprequest)
 {
     parent = _parent;
     listener = _listener;
     messages = _messages;
     request = null;
     lprequest = _lprequest;
     isSending = true;
 }
Esempio n. 44
0
 public abstract void send(ITransportListener listener, IList<IMutableMessage> messages);
Esempio n. 45
0
		/// <summary>
		/// Sends the specified messages to a Bayeux server asynchronously.
		/// </summary>
		/// <param name="listener">The listener used to process the request response.</param>
		/// <param name="messages">The list of messages will be sent in one HTTP request.</param>
		public override void Send(ITransportListener listener, params IMutableMessage[] messages)
		{
			if (messages == null || messages.Length == 0 || messages[0] == null)
				throw new ArgumentNullException("messages");

			string url = this.Url;

			if (null == url) url = String.Empty;
			else url = url.Trim();

			// Builds the request URL based on the message channel name
			Match uriMatch = uriRegex.Match(url);
			if (uriMatch.Success)
			{
				string afterPath = (uriMatch.Groups.Count > 7) ? uriMatch.Groups[7].Value : null;
				// Append message type into the URL ?
				if ((afterPath == null || afterPath.Trim().Length == 0)
					&& messages.Length == 1 && messages[0].IsMeta)
				{
					string type = messages[0].Channel.Substring(Channel.Meta.Length);
					url = url.TrimEnd('\\', '/') + "/" + type.Trim('\\', '/');
				}
			}

			try
			{
				// Creates a new HttpWebRequest object
				HttpWebRequest request = WebRequest.Create(new Uri(url, UriKind.RelativeOrAbsolute)) as HttpWebRequest;
				request.Method = WebRequestMethods.Http.Post;
				request.Accept = "application/json";
				request.ContentType = request.Accept + ";charset=" + Encoding.UTF8.WebName;
				request.KeepAlive = true;
				request.AllowWriteStreamBuffering = true;	// Is needed for KeepAlive
				request.AllowAutoRedirect = true;
				request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
				request.Proxy = null;	// Skips the proxy auto-detect step (~ 7s)

				// Setups HTTP request headers
				this.ApplyRequestHeaders(request);

				// Setups HTTP request cookies
				this.ApplyRequestCookies(request);

				// Calculates the HTTP request timeout (in milliseconds)
				int maxNetworkDelay = this.GetOption<int>(MaxNetworkDelayOption, request.Timeout);
				if (messages.Length == 1
					&& Channel.MetaConnect.Equals(messages[0].Channel, StringComparison.OrdinalIgnoreCase))
				{
					IDictionary<string, object> advice = messages[0].Advice;
					if (advice == null)
						advice = _advice;

					object val;
					if (advice != null && advice.TryGetValue(Message.TimeoutField, out val))
					{
						long timeout = ObjectConverter.ToPrimitive<long>(val, 0);
						if (timeout != 0)
							maxNetworkDelay += unchecked((int)timeout);
					}
				}
				request.Timeout = maxNetworkDelay;

				//if (null != _customize) _customize(request);

				// Creates a new HTTP Transport Exchange
				LongPollingRequest httpExchange;
				lock (_exchanges)
				{
					if (_aborted)
						throw new InvalidOperationException("The client transport has been aborted.");

					httpExchange = new LongPollingRequest(this, request, listener, messages);
					_exchanges.Add(httpExchange);
				}

				// Processes the HTTP request
				httpExchange.Send();
			}
			catch (Exception ex)
			{
				if (listener != null)
					listener.OnException(ex, messages);
				else
				{
					// DEBUG
					Trace.TraceError("Failed to send messages:{0}{1}{0}--- via transport: {2}{0}{3}",
						Environment.NewLine, ObjectConverter.Serialize(messages), this.ToString(), ex.ToString());
				}
			}
		}