| File: src\aspnetcore\src\SignalR\common\Shared\TextMessageParser.cs | Web Access |
| Project: ..\..\..\src\aspnetcore\src\SignalR\common\SignalR.Common\src\Microsoft.AspNetCore.SignalR.Common.csproj (Microsoft.AspNetCore.SignalR.Common) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Buffers; using System.Runtime.CompilerServices; namespace Microsoft.AspNetCore.Internal; internal static class TextMessageParser { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool TryParseMessage(ref ReadOnlySequence<byte> buffer, out ReadOnlySequence<byte> payload) { if (buffer.IsSingleSegment) { var span = buffer.First.Span; var index = span.IndexOf(TextMessageFormatter.RecordSeparator); if (index == -1) { payload = default; return false; } payload = buffer.Slice(0, index); buffer = buffer.Slice(index + 1); return true; } else { return TryParseMessageMultiSegment(ref buffer, out payload); } } private static bool TryParseMessageMultiSegment(ref ReadOnlySequence<byte> buffer, out ReadOnlySequence<byte> payload) { var position = buffer.PositionOf(TextMessageFormatter.RecordSeparator); if (position == null) { payload = default; return false; } payload = buffer.Slice(0, position.Value); // Skip record separator buffer = buffer.Slice(buffer.GetPosition(1, position.Value)); return true; } }