Merget release/2.1
This commit is contained in:
commit
9482b4976e
|
|
@ -31,7 +31,7 @@
|
|||
<MicrosoftAspNetCoreTestHostPackageVersion>2.1.0-preview1-27982</MicrosoftAspNetCoreTestHostPackageVersion>
|
||||
<MicrosoftAspNetCoreTestingPackageVersion>2.1.0-preview1-27982</MicrosoftAspNetCoreTestingPackageVersion>
|
||||
<MicrosoftAspNetCoreWebSocketsPackageVersion>2.1.0-preview1-27982</MicrosoftAspNetCoreWebSocketsPackageVersion>
|
||||
<MicrosoftCSharpPackageVersion>4.5.0-preview1-26102-01</MicrosoftCSharpPackageVersion>
|
||||
<MicrosoftCSharpPackageVersion>4.5.0-preview2-26125-06</MicrosoftCSharpPackageVersion>
|
||||
<MicrosoftEntityFrameworkCoreDesignPackageVersion>2.1.0-preview1-27982</MicrosoftEntityFrameworkCoreDesignPackageVersion>
|
||||
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>2.1.0-preview1-27982</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
|
||||
<MicrosoftEntityFrameworkCoreToolsPackageVersion>2.1.0-preview1-27982</MicrosoftEntityFrameworkCoreToolsPackageVersion>
|
||||
|
|
@ -53,23 +53,23 @@
|
|||
<MicrosoftExtensionsSecurityHelperSourcesPackageVersion>2.1.0-preview1-27982</MicrosoftExtensionsSecurityHelperSourcesPackageVersion>
|
||||
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>2.1.0-preview1-27982</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
|
||||
<MicrosoftNETCoreApp20PackageVersion>2.0.0</MicrosoftNETCoreApp20PackageVersion>
|
||||
<MicrosoftNETCoreApp21PackageVersion>2.1.0-preview1-26102-01</MicrosoftNETCoreApp21PackageVersion>
|
||||
<MicrosoftNETCoreApp21PackageVersion>2.1.0-preview2-26124-07</MicrosoftNETCoreApp21PackageVersion>
|
||||
<MicrosoftNETTestSdkPackageVersion>15.3.0</MicrosoftNETTestSdkPackageVersion>
|
||||
<MoqPackageVersion>4.7.49</MoqPackageVersion>
|
||||
<MsgPackCliPackageVersion>0.9.0-beta2</MsgPackCliPackageVersion>
|
||||
<NewtonsoftJsonPackageVersion>10.0.1</NewtonsoftJsonPackageVersion>
|
||||
<StackExchangeRedisStrongNamePackageVersion>1.2.4</StackExchangeRedisStrongNamePackageVersion>
|
||||
<SystemBuffersPackageVersion>4.5.0-preview1-26102-01</SystemBuffersPackageVersion>
|
||||
<SystemIOPipelinesPackageVersion>0.1.0-e180104-2</SystemIOPipelinesPackageVersion>
|
||||
<SystemMemoryPackageVersion>4.5.0-preview1-26102-01</SystemMemoryPackageVersion>
|
||||
<SystemNumericsVectorsPackageVersion>4.5.0-preview1-26102-01</SystemNumericsVectorsPackageVersion>
|
||||
<SystemBuffersPackageVersion>4.5.0-preview2-26125-06</SystemBuffersPackageVersion>
|
||||
<SystemIOPipelinesPackageVersion>0.1.0-preview2-180130-1</SystemIOPipelinesPackageVersion>
|
||||
<SystemMemoryPackageVersion>4.5.0-preview2-26125-06</SystemMemoryPackageVersion>
|
||||
<SystemNumericsVectorsPackageVersion>4.5.0-preview2-26125-06</SystemNumericsVectorsPackageVersion>
|
||||
<SystemReactiveLinqPackageVersion>3.1.1</SystemReactiveLinqPackageVersion>
|
||||
<SystemReflectionEmitPackageVersion>4.3.0</SystemReflectionEmitPackageVersion>
|
||||
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.5.0-preview1-26102-01</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
||||
<SystemThreadingChannelsPackageVersion>4.5.0-preview1-26102-01</SystemThreadingChannelsPackageVersion>
|
||||
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.5.0-preview2-26125-06</SystemRuntimeCompilerServicesUnsafePackageVersion>
|
||||
<SystemThreadingChannelsPackageVersion>4.5.0-preview2-26125-06</SystemThreadingChannelsPackageVersion>
|
||||
<SystemThreadingTasksExtensionsPackageVersion>4.5.0-preview2-25707-02</SystemThreadingTasksExtensionsPackageVersion>
|
||||
<XunitPackageVersion>2.3.1</XunitPackageVersion>
|
||||
<XunitRunnerVisualStudioPackageVersion>2.3.1</XunitRunnerVisualStudioPackageVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(DotNetPackageVersionPropsPath)" Condition=" '$(DotNetPackageVersionPropsPath)' != '' " />
|
||||
</Project>
|
||||
</Project>
|
||||
|
|
@ -8,7 +8,7 @@ namespace System.IO.Pipelines
|
|||
{
|
||||
internal static class PipelineReaderExtensions
|
||||
{
|
||||
public static async Task CopyToAsync(this IPipeReader input, Stream stream, int bufferSize, CancellationToken cancellationToken)
|
||||
public static async Task CopyToAsync(this PipeReader input, Stream stream, int bufferSize, CancellationToken cancellationToken)
|
||||
{
|
||||
// TODO: Use bufferSize argument
|
||||
while (!cancellationToken.IsCancellationRequested)
|
||||
|
|
@ -26,7 +26,7 @@ namespace System.IO.Pipelines
|
|||
}
|
||||
finally
|
||||
{
|
||||
input.Advance(inputBuffer.End);
|
||||
input.AdvanceTo(inputBuffer.End);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,19 +11,19 @@ namespace System.IO.Pipelines
|
|||
internal static class StreamExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Copies the content of a <see cref="Stream"/> into a <see cref="IPipeWriter"/>.
|
||||
/// Copies the content of a <see cref="Stream"/> into a <see cref="PipeWriter"/>.
|
||||
/// </summary>
|
||||
/// <param name="stream"></param>
|
||||
/// <param name="writer"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
public static Task CopyToAsync(this Stream stream, IPipeWriter writer, CancellationToken cancellationToken = default)
|
||||
public static Task CopyToAsync(this Stream stream, PipeWriter writer, CancellationToken cancellationToken = default)
|
||||
{
|
||||
// 81920 is the default bufferSize, there is not stream.CopyToAsync overload that takes only a cancellationToken
|
||||
return stream.CopyToAsync(new PipelineWriterStream(writer), bufferSize: 81920, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
public static async Task CopyToEndAsync(this Stream stream, IPipeWriter writer, CancellationToken cancellationToken = default)
|
||||
public static async Task CopyToEndAsync(this Stream stream, PipeWriter writer, CancellationToken cancellationToken = default)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -38,14 +38,14 @@ namespace System.IO.Pipelines
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Copies a <see cref="ReadOnlyBuffer"/> to a <see cref="Stream"/> asynchronously
|
||||
/// Copies a <see cref="ReadOnlyBuffer{Byte}"/> to a <see cref="Stream"/> asynchronously
|
||||
/// </summary>
|
||||
/// <param name="buffer">The <see cref="ReadOnlyBuffer"/> to copy</param>
|
||||
/// <param name="buffer">The <see cref="ReadOnlyBuffer{Byte}"/> to copy</param>
|
||||
/// <param name="stream">The target <see cref="Stream"/></param>
|
||||
/// <returns></returns>
|
||||
public static Task CopyToAsync(this ReadOnlyBuffer buffer, Stream stream)
|
||||
public static Task CopyToAsync(this ReadOnlyBuffer<byte> buffer, Stream stream)
|
||||
{
|
||||
if (buffer.IsSingleSpan)
|
||||
if (buffer.IsSingleSegment)
|
||||
{
|
||||
return WriteToStream(stream, buffer.First);
|
||||
}
|
||||
|
|
@ -53,7 +53,7 @@ namespace System.IO.Pipelines
|
|||
return CopyMultipleToStreamAsync(buffer, stream);
|
||||
}
|
||||
|
||||
private static async Task CopyMultipleToStreamAsync(this ReadOnlyBuffer buffer, Stream stream)
|
||||
private static async Task CopyMultipleToStreamAsync(this ReadOnlyBuffer<byte> buffer, Stream stream)
|
||||
{
|
||||
foreach (var memory in buffer)
|
||||
{
|
||||
|
|
@ -77,12 +77,12 @@ namespace System.IO.Pipelines
|
|||
}
|
||||
}
|
||||
|
||||
public static Task CopyToEndAsync(this IPipeReader input, Stream stream)
|
||||
public static Task CopyToEndAsync(this PipeReader input, Stream stream)
|
||||
{
|
||||
return input.CopyToEndAsync(stream, 4096, CancellationToken.None);
|
||||
}
|
||||
|
||||
public static async Task CopyToEndAsync(this IPipeReader input, Stream stream, int bufferSize, CancellationToken cancellationToken)
|
||||
public static async Task CopyToEndAsync(this PipeReader input, Stream stream, int bufferSize, CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
@ -98,9 +98,9 @@ namespace System.IO.Pipelines
|
|||
|
||||
private class PipelineWriterStream : Stream
|
||||
{
|
||||
private readonly IPipeWriter _writer;
|
||||
private readonly PipeWriter _writer;
|
||||
|
||||
public PipelineWriterStream(IPipeWriter writer)
|
||||
public PipelineWriterStream(PipeWriter writer)
|
||||
{
|
||||
_writer = writer;
|
||||
}
|
||||
|
|
@ -148,9 +148,8 @@ namespace System.IO.Pipelines
|
|||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
var output = _writer.Alloc();
|
||||
output.Write(new ReadOnlySpan<byte>(buffer, offset, count));
|
||||
await output.FlushAsync(cancellationToken);
|
||||
_writer.Write(new ReadOnlySpan<byte>(buffer, offset, count));
|
||||
await _writer.FlushAsync(cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
namespace System.IO.Pipelines
|
||||
{
|
||||
internal class StreamPipeConnection : IPipeConnection
|
||||
internal class StreamPipeConnection : IDuplexPipe
|
||||
{
|
||||
public StreamPipeConnection(PipeOptions options, Stream stream)
|
||||
{
|
||||
|
|
@ -11,9 +11,9 @@ namespace System.IO.Pipelines
|
|||
Output = CreateWriter(options, stream);
|
||||
}
|
||||
|
||||
public IPipeReader Input { get; }
|
||||
public PipeReader Input { get; }
|
||||
|
||||
public IPipeWriter Output { get; }
|
||||
public PipeWriter Output { get; }
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
|
@ -21,7 +21,7 @@ namespace System.IO.Pipelines
|
|||
Output.Complete();
|
||||
}
|
||||
|
||||
public static IPipeReader CreateReader(PipeOptions options, Stream stream)
|
||||
public static PipeReader CreateReader(PipeOptions options, Stream stream)
|
||||
{
|
||||
if (!stream.CanRead)
|
||||
{
|
||||
|
|
@ -34,7 +34,7 @@ namespace System.IO.Pipelines
|
|||
return pipe.Reader;
|
||||
}
|
||||
|
||||
public static IPipeWriter CreateWriter(PipeOptions options, Stream stream)
|
||||
public static PipeWriter CreateWriter(PipeOptions options, Stream stream)
|
||||
{
|
||||
if (!stream.CanWrite)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Sequences;
|
||||
using System.IO.Pipelines;
|
||||
|
|
@ -24,7 +25,7 @@ namespace Microsoft.AspNetCore.Sockets.Internal.Formatters
|
|||
private InternalParseState _internalParserState = InternalParseState.ReadMessagePayload;
|
||||
private List<byte[]> _data = new List<byte[]>();
|
||||
|
||||
public ParseResult ParseMessage(ReadOnlyBuffer buffer, out Position consumed, out Position examined, out byte[] message)
|
||||
public ParseResult ParseMessage(ReadOnlyBuffer<byte> buffer, out SequencePosition consumed, out SequencePosition examined, out byte[] message)
|
||||
{
|
||||
consumed = buffer.Start;
|
||||
examined = buffer.End;
|
||||
|
|
@ -35,7 +36,7 @@ namespace Microsoft.AspNetCore.Sockets.Internal.Formatters
|
|||
|
||||
while (buffer.Length > 0)
|
||||
{
|
||||
if (ReadOnlyBuffer.Seek(start, end, out var lineEnd, ByteLF) == -1)
|
||||
if (!(buffer.PositionOf(ByteLF) is SequencePosition lineEnd))
|
||||
{
|
||||
// For the case of data: Foo\r\n\r\<Anytine except \n>
|
||||
if (_internalParserState == InternalParseState.ReadEndOfMessage)
|
||||
|
|
@ -50,7 +51,7 @@ namespace Microsoft.AspNetCore.Sockets.Internal.Formatters
|
|||
return ParseResult.Incomplete;
|
||||
}
|
||||
|
||||
lineEnd = buffer.Move(lineEnd, 1);
|
||||
lineEnd = buffer.GetPosition(lineEnd, 1);
|
||||
var line = ConvertBufferToSpan(buffer.Slice(start, lineEnd));
|
||||
buffer = buffer.Slice(line.Length);
|
||||
|
||||
|
|
@ -148,9 +149,9 @@ namespace Microsoft.AspNetCore.Sockets.Internal.Formatters
|
|||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private ReadOnlySpan<byte> ConvertBufferToSpan(ReadOnlyBuffer buffer)
|
||||
private ReadOnlySpan<byte> ConvertBufferToSpan(ReadOnlyBuffer<byte> buffer)
|
||||
{
|
||||
if (buffer.IsSingleSpan)
|
||||
if (buffer.IsSingleSegment)
|
||||
{
|
||||
return buffer.First.Span;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
|||
var stream = await response.Content.ReadAsStreamAsync();
|
||||
var pipelineReader = StreamPipeConnection.CreateReader(new PipeOptions(_memoryPool), stream);
|
||||
var readCancellationRegistration = cancellationToken.Register(
|
||||
reader => ((IPipeReader)reader).CancelPendingRead(), pipelineReader);
|
||||
reader => ((PipeReader)reader).CancelPendingRead(), pipelineReader);
|
||||
try
|
||||
{
|
||||
while (true)
|
||||
|
|
@ -122,7 +122,7 @@ namespace Microsoft.AspNetCore.Sockets.Client
|
|||
}
|
||||
finally
|
||||
{
|
||||
pipelineReader.Advance(consumed, examined);
|
||||
pipelineReader.AdvanceTo(consumed, examined);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Sequences;
|
||||
using System.IO.Pipelines;
|
||||
|
|
@ -32,7 +33,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
public void ParseSSEMessageSuccessCases(string encodedMessage, string expectedMessage)
|
||||
{
|
||||
var buffer = Encoding.UTF8.GetBytes(encodedMessage);
|
||||
var readableBuffer = new ReadOnlyBuffer(buffer);
|
||||
var readableBuffer = new ReadOnlyBuffer<byte>(buffer);
|
||||
var parser = new ServerSentEventsMessageParser();
|
||||
|
||||
var parseResult = parser.ParseMessage(readableBuffer, out var consumed, out var examined, out var message);
|
||||
|
|
@ -58,7 +59,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
public void ParseSSEMessageFailureCases(string encodedMessage, string expectedExceptionMessage)
|
||||
{
|
||||
var buffer = Encoding.UTF8.GetBytes(encodedMessage);
|
||||
var readableBuffer = new ReadOnlyBuffer(buffer);
|
||||
var readableBuffer = new ReadOnlyBuffer<byte>(buffer);
|
||||
var parser = new ServerSentEventsMessageParser();
|
||||
|
||||
var ex = Assert.Throws<FormatException>(() => { parser.ParseMessage(readableBuffer, out var consumed, out var examined, out var message); });
|
||||
|
|
@ -86,7 +87,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
public void ParseSSEMessageIncompleteParseResult(string encodedMessage)
|
||||
{
|
||||
var buffer = Encoding.UTF8.GetBytes(encodedMessage);
|
||||
var readableBuffer = new ReadOnlyBuffer(buffer);
|
||||
var readableBuffer = new ReadOnlyBuffer<byte>(buffer);
|
||||
var parser = new ServerSentEventsMessageParser();
|
||||
|
||||
var parseResult = parser.ParseMessage(readableBuffer, out var consumed, out var examined, out var message);
|
||||
|
|
@ -114,7 +115,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
var pipe = new Pipe(new PipeOptions(pool));
|
||||
|
||||
byte[] message = null;
|
||||
Position consumed = default, examined = default;
|
||||
SequencePosition consumed = default, examined = default;
|
||||
|
||||
for (var i = 0; i < messageParts.Length; i++)
|
||||
{
|
||||
|
|
@ -123,7 +124,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
var result = await pipe.Reader.ReadAsync();
|
||||
|
||||
var parseResult = parser.ParseMessage(result.Buffer, out consumed, out examined, out message);
|
||||
pipe.Reader.Advance(consumed, examined);
|
||||
pipe.Reader.AdvanceTo(consumed, examined);
|
||||
|
||||
// parse result should be complete only after we parsed the last message part
|
||||
var expectedResult =
|
||||
|
|
@ -167,7 +168,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
var parseResult = parser.ParseMessage(result.Buffer, out var consumed, out var examined, out var buffer);
|
||||
Assert.Equal(ServerSentEventsMessageParser.ParseResult.Incomplete, parseResult);
|
||||
|
||||
pipe.Reader.Advance(consumed, examined);
|
||||
pipe.Reader.AdvanceTo(consumed, examined);
|
||||
|
||||
// Send the rest of the data and parse the complete message
|
||||
await pipe.Writer.WriteAsync(Encoding.UTF8.GetBytes(encodedMessagePart2));
|
||||
|
|
@ -195,8 +196,8 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
var parseResult = parser.ParseMessage(result.Buffer, out var consumed, out var examined, out var message);
|
||||
Assert.Equal(ServerSentEventsMessageParser.ParseResult.Completed, parseResult);
|
||||
Assert.Equal("foo", Encoding.UTF8.GetString(message));
|
||||
Assert.Equal(consumed, result.Buffer.Move(result.Buffer.Start, message1.Length));
|
||||
pipe.Reader.Advance(consumed, examined);
|
||||
Assert.Equal(consumed, result.Buffer.GetPosition(result.Buffer.Start, message1.Length));
|
||||
pipe.Reader.AdvanceTo(consumed, examined);
|
||||
Assert.Equal(consumed, examined);
|
||||
|
||||
parser.Reset();
|
||||
|
|
@ -205,7 +206,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
parseResult = parser.ParseMessage(result.Buffer, out consumed, out examined, out message);
|
||||
Assert.Equal(ServerSentEventsMessageParser.ParseResult.Completed, parseResult);
|
||||
Assert.Equal("bar", Encoding.UTF8.GetString(message));
|
||||
pipe.Reader.Advance(consumed, examined);
|
||||
pipe.Reader.AdvanceTo(consumed, examined);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -223,7 +224,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
|
|||
public void ParseMessagesWithMultipleDataLines(string encodedMessage, string expectedMessage)
|
||||
{
|
||||
var buffer = Encoding.UTF8.GetBytes(encodedMessage);
|
||||
var readableBuffer = new ReadOnlyBuffer(buffer);
|
||||
var readableBuffer = new ReadOnlyBuffer<byte>(buffer);
|
||||
var parser = new ServerSentEventsMessageParser();
|
||||
|
||||
var parseResult = parser.ParseMessage(readableBuffer, out var consumed, out var examined, out var message);
|
||||
|
|
|
|||
Loading…
Reference in New Issue