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; } }
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]); } } } }
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(); }
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(); }
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); }
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); } }