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); }
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; }
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); } }
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); } }
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 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; }
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); }
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); }
/// <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); }
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); }
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); }
public TransportListener(ITransportListener listener, string address, Int32 port) { this.tcpListener = null; this.listener = listener; this.address = address; this.port = port; }
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); }
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); }
public TransportExchange(LongPollingTransport parent, ITransportListener listener, IList <IMutableMessage> messages, LongPollingRequest lprequest) { _parent = parent; Listener = listener; Messages = messages; Request = null; LpRequest = lprequest; IsSending = true; }
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; }
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); }
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); }
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); }
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(); }
protected virtual void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { DisposeSocketConnection(); Listener = null; } _disposed = true; }
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); }
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; }
/// <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(); }
/// <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); }
/// <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);
/// <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 void send(ITransportListener listener, IMutableMessage message) { IList<IMutableMessage> messages = new List<IMutableMessage>(); messages.Add(message); send(listener, messages); }
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); } }
public FailedTransportListener(ITransportListener listener, Exception error) { this.Listener = listener; this.Error = error; }
/// <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; }
public abstract void send(ITransportListener listener, IList<IMutableMessage> messages);
/// <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()); } } }