Merget release/2.1

This commit is contained in:
Pavel Krymets 2018-01-30 09:48:13 -08:00
commit 9482b4976e
7 changed files with 49 additions and 48 deletions

View File

@ -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>

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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);
}
}
}

View File

@ -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);