Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,46 +36,57 @@ private static async Task ReadFromTransportAsync(Stream stream, PipeWriter write
var bufferMemory = new Memory<byte>(buffer);
#endif

try
#if NET6_0_OR_GREATER
await using var tokenRegistration = ct.Register(
static writer => ((PipeWriter)writer!).CancelPendingFlush(),
state: writer,
useSynchronizationContext: false);
#else
using var tokenRegistration = ct.Register(
static writer => ((PipeWriter)writer!).CancelPendingFlush(),
state: writer,
useSynchronizationContext: false);
#endif

while (true)
{
while (true)
try
{
try
{
#if NET6_0_OR_GREATER
var bytesRead = await stream.ReadAsync(bufferMemory, ct).ConfigureAwait(false);
var bytesRead = await stream.ReadAsync(bufferMemory, ct).ConfigureAwait(false);
#else
var bytesRead = await stream.ReadAsync(buffer, 0, bufferSize, ct).ConfigureAwait(false);
var bytesRead = await stream.ReadAsync(buffer, 0, bufferSize, ct).ConfigureAwait(false);
#endif

if (bytesRead == 0)
{
break;
}

var memory = writer.GetMemory(bytesRead);
buffer.AsSpan().CopyTo(memory.Span);
writer.Advance(bytesRead);
}
catch
{
break;
}

var result = await writer.FlushAsync(ct).ConfigureAwait(false);

if (result.IsCompleted)
if (bytesRead == 0)
{
break;
}

#if NET6_0_OR_GREATER
var memory = writer.GetMemory(bytesRead);
buffer.AsSpan()[..bytesRead].CopyTo(memory.Span);
writer.Advance(bytesRead);
#else
var memory = writer.GetMemory(bytesRead);
buffer.AsSpan().Slice(0, bytesRead).CopyTo(memory.Span);
writer.Advance(bytesRead);
#endif
}
catch
{
break;
}

// ReSharper disable once RedundantArgumentDefaultValue
var result = await writer.FlushAsync(default).ConfigureAwait(false);
if (result.IsCompleted || result.IsCanceled)
{
break;
}

await writer.CompleteAsync().ConfigureAwait(false);
}
catch (OperationCanceledException)
{
// we were canceled and stop executing.
}

await writer.CompleteAsync().ConfigureAwait(false);
}

private static async IAsyncEnumerable<OperationResult> ReadMessagesPipeAsync(
Expand All @@ -84,17 +95,25 @@ private static async IAsyncEnumerable<OperationResult> ReadMessagesPipeAsync(
{
using var message = new ArrayWriter();

#if NET6_0_OR_GREATER
await using var tokenRegistration = ct.Register(
static reader => ((PipeReader)reader!).CancelPendingRead(),
state: reader,
useSynchronizationContext: false);
#else
using var tokenRegistration = ct.Register(
static reader => ((PipeReader)reader!).CancelPendingRead(),
state: reader,
useSynchronizationContext: false);
#endif

while (true)
{
ReadResult result;

try
{
result = await reader.ReadAsync(ct).ConfigureAwait(false);
}
catch (OperationCanceledException)
// ReSharper disable once RedundantArgumentDefaultValue
var result = await reader.ReadAsync(default).ConfigureAwait(false);
if (result.IsCanceled)
{
yield break;
break;
}

var buffer = result.Buffer;
Expand All @@ -104,24 +123,26 @@ private static async IAsyncEnumerable<OperationResult> ReadMessagesPipeAsync(
{
position = buffer.PositionOf((byte) '\n');

if (position != null)
if (position == null)
{
WriteToMessage(message, buffer.Slice(0, position.Value));
continue;
}

WriteToMessage(message, buffer.Slice(0, position.Value));

if (IsMessageComplete(message))
if (IsMessageComplete(message))
{
if (!TryReadMessage(message.GetWrittenMemory(), out var operationResult))
{
if (!TryReadMessage(message.GetWrittenMemory(), out var operationResult))
{
await reader.CompleteAsync().ConfigureAwait(false);
yield break;
}

message.Reset();
yield return operationResult;
await reader.CompleteAsync().ConfigureAwait(false);
yield break;
}

buffer = buffer.Slice(buffer.GetPosition(1, position.Value));

message.Reset();
yield return operationResult;
}

buffer = buffer.Slice(buffer.GetPosition(1, position.Value));
} while (position != null);

reader.AdvanceTo(buffer.Start, buffer.End);
Expand Down Expand Up @@ -154,7 +175,7 @@ private static void WriteToMessage(ArrayWriter message, ReadOnlySequence<byte> b
{
var size = segment.Span.Length;
var span = message.GetSpan(size);
buffer.First.Span.CopyTo(span);
segment.Span.CopyTo(span);
message.Advance(size);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Runtime.Serialization;

namespace HotChocolate.Utilities;

Expand Down