private async Task <MemoryStream> SendRequestImpl <TRequest>(TRequest request, TimeSpan?timeout) where TRequest : IRequest { if (_disposed) { throw new ObjectDisposedException(nameof(LogicalConnection)); } var requestId = _requestIdCounter.GetRequestId(); var responseTask = _responseReader.GetResponseTask(requestId); var stream = CreateAndSerializeHeader(request, requestId); MsgPackSerializer.Serialize(request, stream, _msgPackContext); var totalLength = stream.Position - Constants.PacketSizeBufferSize; var packetLength = new PacketSize((uint)(totalLength)); AddPacketSize(stream, packetLength); ArraySegment <byte> buffer; if (!stream.TryGetBuffer(out buffer)) { throw new InvalidOperationException("broken buffer"); } //keep API for the sake of backward comp. _requestWriter.Write( // merged header and body buffer); try { if (timeout.HasValue) { var cts = new CancellationTokenSource(timeout.Value); responseTask = responseTask.WithCancellation(cts.Token); } var responseStream = await responseTask.ConfigureAwait(false); _logWriter?.WriteLine($"Response with requestId {requestId} is recieved, length: {responseStream.Length}."); return(responseStream); } catch (ArgumentException) { _logWriter?.WriteLine($"Response with requestId {requestId} failed, content:\n{buffer.ToReadableString()} "); throw; } catch (TimeoutException) { PingsFailedByTimeoutCount++; throw; } }
private async Task <MemoryStream> SendRequestImpl <TRequest>(TRequest request, TimeSpan?timeout) where TRequest : IRequest { if (_disposed) { throw new ObjectDisposedException(nameof(LogicalConnection)); } var bodyBuffer = MsgPackSerializer.Serialize(request, _msgPackContext); var requestId = _requestIdCounter.GetRequestId(); var responseTask = _responseReader.GetResponseTask(requestId); var headerBuffer = CreateAndSerializeHeader(request, requestId, bodyBuffer); _requestWriter.Write( headerBuffer, new ArraySegment <byte>(bodyBuffer, 0, bodyBuffer.Length)); try { if (timeout.HasValue) { var cts = new CancellationTokenSource(timeout.Value); responseTask = responseTask.WithCancellation(cts.Token); } var responseStream = await responseTask.ConfigureAwait(false); _logWriter?.WriteLine($"Response with requestId {requestId} is recieved, length: {responseStream.Length}."); return(responseStream); } catch (ArgumentException) { _logWriter?.WriteLine($"Response with requestId {requestId} failed, header:\n{headerBuffer.ToReadableString()} \n body: \n{bodyBuffer.ToReadableString()}"); throw; } catch (TimeoutException) { PingsFailedByTimeoutCount++; throw; } }