Exemplo n.º 1
0
        public override async Task <TransportResponse> Send(Message message, CancellationToken token)
        {
            using (new SemaphoreScope(_semaphore))
            {
                // Create the request.
                _logger.Write(BayeuxLogLevel.Debug, "[REQUEST] Channel = {0}", message.Channel);
                var request = CreateRequest(message);

                // Get the response.
                var response = await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, token);

                if (response.StatusCode != HttpStatusCode.OK)
                {
                    _logger.Write(BayeuxLogLevel.Warning, "[REQUEST] Received HTTP Status Code {0} for channel {1}.",
                                  response.StatusCode, message.Channel);
                    return(null);
                }

                var stream = await response.Content.ReadAsStreamAsync();

                var result = new TransportResponse();
                using (var reader = new StreamReader(stream))
                {
                    while (true)
                    {
                        var json = await reader.ReadLineAsync().WithCancellation(token);

                        if (json == null)
                        {
                            break;
                        }

                        var replies = JsonConvert.DeserializeObject <Envelope>(json);
                        foreach (var reply in replies)
                        {
                            if (reply.Channel == message.Channel)
                            {
                                _logger.Write(BayeuxLogLevel.Debug,
                                              "[RESPONSE] Channel = {0}, ClientId = {1}, Error = {2}", reply.Channel,
                                              reply.ClientId, reply.Error ?? "No error");
                                result.Response = reply;
                            }
                            else
                            {
                                if (result.Messages == null)
                                {
                                    result.Messages = new List <Message>();
                                }
                                _logger.Write(BayeuxLogLevel.Debug, "[MESSAGE] Channel = {0}", reply.Channel);
                                result.Messages.Add(reply);
                            }
                        }
                    }
                }
                return(result);
            }
        }
Exemplo n.º 2
0
 private void FlushMessages(TransportResponse result, CancellationToken token)
 {
     if (result?.Messages != null)
     {
         foreach (var message in result.Messages)
         {
             token.ThrowIfCancellationRequested();
             _queue.Enqueue(message);
         }
     }
 }