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); } }
private void FlushMessages(TransportResponse result, CancellationToken token) { if (result?.Messages != null) { foreach (var message in result.Messages) { token.ThrowIfCancellationRequested(); _queue.Enqueue(message); } } }