示例#1
0
    private void WriteToBuffer(ReadOnlySpan <byte> span)
    {
        // get what was read into the buffer
        var remaining = _limit - _bytesBuffered;

        if (remaining == 0)
        {
            return;
        }

        if (span.Length == 0 && !HasLogged)
        {
            // Done reading, log the string.
            LogRequestBody();
            return;
        }

        var innerCount = Math.Min(remaining, span.Length);

        if (span.Slice(0, innerCount).TryCopyTo(_tailMemory.Span))
        {
            _tailBytesBuffered += innerCount;
            _bytesBuffered     += innerCount;
            _tailMemory         = _tailMemory.Slice(innerCount);
        }
        else
        {
            BuffersExtensions.Write(this, span.Slice(0, innerCount));
        }

        if (_limit - _bytesBuffered == 0 && !HasLogged)
        {
            LogRequestBody();
        }
    }
 private System.Threading.Tasks.Task ForwardInput(Pipe inputPipe, StreamWriter input)
 {
     return(System.Threading.Tasks.Task.Run(async() =>
     {
         try
         {
             while (true)
             {
                 var readContent = await inputPipe.Reader.ReadAsync();
                 if (readContent.Buffer.Length == 0)
                 {
                     await System.Threading.Tasks.Task.Delay(100);
                 }
                 else
                 {
                     var content = BuffersExtensions.ToArray(readContent.Buffer);
                     outputPane.WriteAsync($"[Client -> Server] {Encoding.UTF8.GetString(content)}").Forget();
                     inputPipe.Reader.AdvanceTo(readContent.Buffer.End);
                     await input.WriteAsync(Encoding.UTF8.GetString(content).ToCharArray());
                 }
             }
         }
         catch (Exception e)
         {
             throw;
         }
     }));
 }
        public void SequencePositionOfMultiSegment()
        {
            var(first, last) = BufferList.Create(
                new byte[] { 1, 2 },
                new byte[] { 3, 4 }
                );
            var bytes = new ReadOnlySequence <byte>(first, 0, last, last.Memory.Length);

            Assert.Equal(4, bytes.Length);

            // Static method call to avoid calling instance methods
            Assert.False(Sequence.PositionOf(bytes, 0).HasValue);

            for (int i = 0; i < bytes.Length; i++)
            {
                var value = (byte)(i + 1);

                var listPosition = MemoryListExtensions.PositionOf(first, value).GetValueOrDefault();
                var(node, index) = listPosition.Get <IMemoryList <byte> >();

                if (listPosition != default)
                {
                    Assert.Equal(value, node.Memory.Span[index]);
                }

                var robPosition         = BuffersExtensions.PositionOf(bytes, value);
                var robSequencePosition = Sequence.PositionOf(bytes, value);

                Assert.Equal(listPosition, robPosition);
                Assert.Equal(listPosition, robSequencePosition);

                var robSlice = bytes.Slice(1);
                robPosition         = BuffersExtensions.PositionOf(robSlice, value);
                robSequencePosition = Sequence.PositionOf(robSlice, value);

                if (i > 0)
                {
                    Assert.Equal(listPosition, robPosition);
                    Assert.Equal(listPosition, robSequencePosition);
                }
                else
                {
                    Assert.False(robPosition.HasValue);
                    Assert.False(robSequencePosition.HasValue);
                }

                if (listPosition != default)
                {
                    robSlice = bytes.Slice(listPosition);
                    Assert.Equal(value, robSlice.First.Span[0]);
                }
            }
        }
示例#4
0
 public JsonWriter(byte[] originData)
 {
     buffer = new ArrayBufferWriter <byte>();
     BuffersExtensions.Write(buffer, new ReadOnlySpan <byte>(originData));
     writer = new Utf8JsonWriter(buffer, options);
 }