示例#1
0
        private void SkipAttachmentStream(BlittableJsonReaderObject data)
        {
            if (data.TryGet(nameof(AttachmentName.Hash), out LazyStringValue _) == false ||
                data.TryGet(nameof(AttachmentName.Size), out long size) == false ||
                data.TryGet(nameof(DocumentItem.AttachmentStream.Tag), out LazyStringValue _) == false)
            {
                throw new ArgumentException($"Data of attachment stream is not valid: {data}");
            }

            while (size > 0)
            {
                var sizeToRead = (int)Math.Min(32 * 1024, size);
                var read       = _parser.Skip(sizeToRead);
                if (read.Done == false)
                {
                    var read2 = _peepingTomStream.Read(_buffer.Buffer.Array, _buffer.Buffer.Offset, _buffer.Length);
                    if (read2 == 0)
                    {
                        throw new EndOfStreamException("Stream ended without reaching end of stream content");
                    }

                    _parser.SetBuffer(_buffer, 0, read2);
                }
                size -= read.BytesRead;
            }
        }
示例#2
0
        public void PeepingTomStreamTest(int originalSize, int chunkSizeToRead, int offset, JsonOperationContext context)
        {
            var bytes = new byte[originalSize];

            for (var i = 0; i < bytes.Length; i++)
            {
                bytes[i] = (byte)((i % 26) + 'a');
            }

            using (var stream = new MemoryStream())
                using (var peeping = new PeepingTomStream(stream, context))
                {
                    stream.Write(bytes, 0, originalSize);
                    stream.Flush();
                    stream.Position = 0;

                    var totalRead = 0;
                    do
                    {
                        int read;
                        do
                        {
                            var buffer = new byte[originalSize + offset];
                            read       = peeping.Read(buffer, offset, chunkSizeToRead);
                            totalRead += read;
                            Assert.True(read <= chunkSizeToRead);
                        } while (read != 0);
                    } while (totalRead < originalSize);

                    Assert.Equal(originalSize, totalRead);
                    var peepWindow = peeping.PeepInReadStream();
                    var length     = peepWindow.Length;

                    Assert.True(length <= PeepingTomStream.BufferWindowSize);
                    Assert.True(length >= 0);

                    var expectedLength = originalSize < PeepingTomStream.BufferWindowSize ? originalSize : PeepingTomStream.BufferWindowSize;

                    if (expectedLength != length)
                    {
                        var expected = System.Text.Encoding.UTF8.GetString(bytes, bytes.Length - expectedLength, expectedLength);
                        var actual   = System.Text.Encoding.UTF8.GetString(peepWindow);
                        Assert.Equal(expected, actual);
                    }
                    Assert.Equal(expectedLength, length);

                    for (var i = 0; i < peepWindow.Length; i++)
                    {
                        var expectedByte = (byte)(((originalSize - peepWindow.Length + i) % 26) + 'a');
                        if (expectedByte != peepWindow[i])
                        {
                            Assert.Equal(expectedByte, peepWindow[i]);
                        }
                    }
                }
        }
示例#3
0
        public static void ReadObject(BlittableJsonDocumentBuilder builder, PeepingTomStream peepingTomStream, UnmanagedJsonParser parser, JsonOperationContext.ManagedPinnedBuffer buffer)
        {
            builder.ReadNestedObject();
            while (builder.Read() == false)
            {
                var read = peepingTomStream.Read(buffer.Buffer.Array, buffer.Buffer.Offset, buffer.Length);
                if (read == 0)
                {
                    throw new EndOfStreamException("Stream ended without reaching end of json content" + GetPeepingTomBufferAsString(peepingTomStream));
                }

                parser.SetBuffer(buffer, 0, read);
            }
            builder.FinalizeDocument();
        }
示例#4
0
        public static void ReadProperty(BlittableJsonDocumentBuilder builder, PeepingTomStream peepingTomStream, UnmanagedJsonParser parser, JsonOperationContext.MemoryBuffer buffer)
        {
            builder.ReadProperty();
            while (builder.Read() == false)
            {
                var read = peepingTomStream.Read(buffer.Memory.Memory.Span);
                if (read == 0)
                {
                    throw new EndOfStreamException("Stream ended without reaching end of json content" + GetPeepingTomBufferAsString(peepingTomStream));
                }

                parser.SetBuffer(buffer, 0, read);
            }
            builder.FinalizeDocument();
        }
示例#5
0
        public static bool Read(PeepingTomStream stream, UnmanagedJsonParser parser, JsonParserState state, JsonOperationContext.ManagedPinnedBuffer buffer)
        {
            while (parser.Read() == false)
            {
                var read = stream.Read(buffer.Buffer.Array, buffer.Buffer.Offset, buffer.Length);
                if (read == 0)
                {
                    if (state.CurrentTokenType != JsonParserToken.EndObject)
                    {
                        throw new EndOfStreamException("Stream ended without reaching end of json content");
                    }

                    return(false);
                }

                parser.SetBuffer(buffer, 0, read);
            }
            return(true);
        }
示例#6
0
        private static void PeepingTomStreamTest(int originalSize, int chunkSizeToRead, int offset, int?seed, JsonOperationContext context, CancellationToken token)
        {
            try
            {
                var bytes = new byte[originalSize];
                for (var i = 0; i < bytes.Length; i++)
                {
                    bytes[i] = (byte)((i % 26) + 'a');
                }

                using (var stream = new MemoryStream())
                    using (context.GetMemoryBuffer(out var memoryBuffer))
                    {
                        // fill the buffer with garbage
                        var random = seed == null ? new Random() : new Random(seed.Value);
                        random.NextBytes(memoryBuffer.Memory.Memory.Span);

                        using (var peeping = new PeepingTomStream(stream, memoryBuffer))
                        {
                            stream.Write(bytes, 0, originalSize);
                            stream.Flush();
                            stream.Position = 0;

                            var totalRead = 0;
                            do
                            {
                                token.ThrowIfCancellationRequested();

                                int read = -1;
                                do
                                {
                                    token.ThrowIfCancellationRequested();

                                    var buffer = new Span <byte>(new byte[originalSize + offset]);
                                    read       = peeping.Read(buffer.Slice(offset, chunkSizeToRead));
                                    totalRead += read;
                                    Assert.True(read <= chunkSizeToRead);
                                } while (read != 0);
                            } while (totalRead < originalSize);

                            Assert.Equal(originalSize, totalRead);

                            var peepWindow = peeping.PeepInReadStream();

                            var length = peepWindow.Length;

                            Assert.True(length <= PeepingTomStream.BufferWindowSize);
                            Assert.True(length >= 0);

                            var expectedLength = originalSize < PeepingTomStream.BufferWindowSize ? originalSize : PeepingTomStream.BufferWindowSize;

                            if (expectedLength != length)
                            {
                                var expected = System.Text.Encoding.UTF8.GetString(bytes, bytes.Length - expectedLength, expectedLength);
                                var actual   = System.Text.Encoding.UTF8.GetString(peepWindow);
                                Assert.Equal(expected, actual);
                            }
                            Assert.Equal(expectedLength, length);

                            for (var i = 0; i < peepWindow.Length; i++)
                            {
                                token.ThrowIfCancellationRequested();

                                try
                                {
                                    var expectedByte = (byte)(((originalSize - peepWindow.Length + i) % 26) + 'a');
                                    if (expectedByte != peepWindow[i])
                                    {
                                        Assert.Equal(expectedByte, peepWindow[i]);
                                    }
                                }
                                catch (Exception e)
                                {
                                    throw new InvalidOperationException("Failure at index: " + i, e);
                                }
                            }
                        }
                    }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException($"Failed with originalSize {originalSize}, chunkSizeToRead {chunkSizeToRead},  offset {offset}", e);
            }
        }