示例#1
0
        /// <exception cref="InvalidDataException"></exception>
        private static async Task <int> ReadAssertAsync(this AsyncBinaryReader br, int expected)
        {
            int x = await br.ReadInt32Async();

            if (x != expected)
            {
                throw new InvalidDataException("The remote sent an unexpected result.");
            }
            return(x);
        }
示例#2
0
        async Task <TResponse> AsyncCallAsync <TRequest, TResponse>(
            Method <TRequest, TResponse> method, TRequest request)
        {
            await pipeLock.WaitAsync();

            PipePair pipePair;

            availablePipePairs.TryTake(out pipePair);
            Debug.Assert(pipePair != null);
            try
            {
                var writer = new AsyncBinaryWriter(pipePair.OutPipe);
                var reader = new AsyncBinaryReader(pipePair.InPipe);

                // Send the RPC name.
                await writer.WriteAsync(method.FullName.Length);

                await writer.WriteAsync(Encoding.ASCII.GetBytes(method.FullName));

                // Send the request.
                using (var serializationContext = new SimpleSerializationContext())
                {
                    method.RequestMarshaller.ContextualSerializer(request, serializationContext);
                    byte[] requestBytes = serializationContext.GetPayload();
                    await writer.WriteAsync(requestBytes.Length);

                    await writer.WriteAsync(requestBytes);
                }

                // Read the response.
                int size = await reader.ReadInt32Async();

                byte[] responseBytes = await reader.ReadBytesAsync(size);

                var deserializationContext = new SimpleDeserializationContext(responseBytes);
                return(method.ResponseMarshaller.ContextualDeserializer(deserializationContext));
            }
            // Unfortunately, RpcExceptions can't be nested with InnerException.
            catch (EndOfStreamException e)
            {
                throw new RpcException(new Status(StatusCode.Unknown, e.ToString()),
                                       "Connection to server lost. Did it shut down?");
            }
            catch (Exception e) when(!(e is RpcException))
            {
                throw new RpcException(new Status(StatusCode.Unknown, e.ToString()),
                                       "Unknown failure: " + e);
            }
            finally
            {
                availablePipePairs.Add(pipePair);
                pipeLock.Release();
            }
        }
示例#3
0
        public async Task ValidateReadWriteStatistics()
        {
            InterceptData clientData = null, serverData = null;
            var           server = new WsServer();
            await server.StartAsync(new IPEndPoint(IPAddress.Loopback, 0), async stream =>
            {
                await stream.WrapSocketAsync(x =>
                                             Task.FromResult <WStreamSocket>(new Interceptor(x, out serverData))
                                             );
                var abr = new AsyncBinaryReader(stream);
                for (int i = 0; i < 100000; i++)
                {
                    Assert.Equal(i, await abr.ReadInt32Async());
                }
                await stream.CloseAsync();
            });

            var client     = new WsClient();
            var connection = await client.ConnectAsync(new Uri("ws://" + server.ListeningAddresses[0].Substring(7)));

            await connection.WrapSocketAsync(x =>
                                             Task.FromResult <WStreamSocket>(new Interceptor(x, out clientData))
                                             );

            var abw = new AsyncBinaryWriter(connection);

            for (int i = 0; i < 100000; i++)
            {
                await abw.WriteAsync(i);
            }

            await abw.FlushAsync();

            await Task.Delay(1000);

            Assert.Equal(4 * 100000, clientData.BytesWritten);
            Assert.Equal(4 * 100000, serverData.BytesRead);

            client.Dispose();
            server.Dispose();
        }
        public static async Task DecompressL33TZipAsync(
            Stream inputStream,
            Stream outputStream,
            IProgress <double> progress = null,
            CancellationToken ct        = default)
        {
            //Get extracted content length
            long fileLength;

            using (var reader = new AsyncBinaryReader(inputStream, new UTF8Encoding(), true))
            {
                var fileHeader = new string(await reader.ReadCharsAsync(4, ct));
                switch (fileHeader.ToLower())
                {
                case L33THeader:
                    fileLength = await reader.ReadInt32Async(ct);

                    break;

                case L66THeader:
                    fileLength = await reader.ReadInt64Async(ct);

                    break;

                default:
                    throw new InvalidOperationException($"Header '{fileHeader}' is not recognized as a valid type");
                }
                //Skip deflate specification (2 Byte)
                reader.BaseStream.Position += 2;
            }

            //Extract content
            var buffer = new byte[BufferSize];
            int bytesRead;
            var totalBytesRead = 0L;
            var lastProgress   = 0d;

            using var compressedStream = new DeflateStream(inputStream, CompressionMode.Decompress);
            while ((bytesRead = await compressedStream.ReadAsync(buffer, 0, buffer.Length, ct)) > 0)
            {
                ct.ThrowIfCancellationRequested();

                if (bytesRead > fileLength)
                {
                    totalBytesRead += fileLength;
                    await outputStream.WriteAsync(buffer, 0, (int)fileLength, ct);
                }
                else if (totalBytesRead + bytesRead <= fileLength)
                {
                    totalBytesRead += bytesRead;
                    await outputStream.WriteAsync(buffer, 0, bytesRead, ct);
                }
                else if (totalBytesRead + bytesRead > fileLength)
                {
                    var leftToRead = fileLength - totalBytesRead;
                    totalBytesRead += leftToRead;
                    await outputStream.WriteAsync(buffer, 0, (int)leftToRead, ct);
                }

                var newProgress = (double)totalBytesRead / fileLength * 100;

                if (newProgress - lastProgress > 1)
                {
                    progress?.Report(newProgress);
                    lastProgress = newProgress;
                }

                if (totalBytesRead >= fileLength)
                {
                    break;
                }
            }
        }
示例#5
0
        /// <summary>
        /// Asynchronously reads a bit set from the specified reader.
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>
        /// A <see cref="Task{Pdb20BitSet}"/> that represents the asynchronous read operation.
        /// </returns>
        public static async Task<Pdb70BitSet> ReadAsync(AsyncBinaryReader reader, CancellationToken cancellationToken)
        {
            var result = new Pdb70BitSet(await reader.ReadInt32Async(cancellationToken));
            if (result.Words.Length != 0)
            {
                var bytes = await reader.ReadBytesAsync(result.Words.Length * sizeof(int), cancellationToken);
                Buffer.BlockCopy(bytes, 0, result.Words, 0, bytes.Length);
            }

            return result;
        }
示例#6
0
        public async Task TestAsyncBinaryReader()
        {
            byte customByte = 39;
            bool customBool = Unsafe.As <byte, bool>(ref customByte);

            object[] expectedResults =
            {
                true,
                false,
                customBool,
                (byte)42,
                (sbyte)-28,
                (short)-279,
                (ushort)64221,
                (int)-288888,
                (uint)3310229011,
                (float)3811.55f,
                (long)-19195205991011,
                (ulong)11223372036854775807,
                (double)Math.PI,
                (decimal)295222.2811m
            };

            using (var ms = new MemoryStream())
            {
                using (var wr = new BinaryWriter(ms, Encoding.Default, leaveOpen: true))
                {
                    foreach (dynamic obj in expectedResults)
                    {
                        wr.Write(obj);
                    }
                }

                ms.Position = 0;

                using (var rd = new AsyncBinaryReader(ms, Encoding.Default, leaveOpen: true))
                {
                    foreach (var obj in expectedResults)
                    {
                        switch (obj)
                        {
                        case bool b8:
                            ////Assert.Equal(b8, await rd.ReadBooleanAsync());
                            if (b8)
                            {
                                Assert.True(await rd.ReadBooleanAsync());
                            }
                            else
                            {
                                Assert.False(await rd.ReadBooleanAsync());
                            }

                            break;

                        case byte u8:
                            Assert.Equal(u8, await rd.ReadByteAsync());
                            break;

                        case sbyte s8:
                            Assert.Equal(s8, await rd.ReadSByteAsync());
                            break;

                        case short s16:
                            Assert.Equal(s16, await rd.ReadInt16Async());
                            break;

                        case ushort u16:
                            Assert.Equal(u16, await rd.ReadUInt16Async());
                            break;

                        case int s32:
                            Assert.Equal(s32, await rd.ReadInt32Async());
                            break;

                        case uint u32:
                            Assert.Equal(u32, await rd.ReadUInt32Async());
                            break;

                        case long s64:
                            Assert.Equal(s64, await rd.ReadInt64Async());
                            break;

                        case ulong u64:
                            Assert.Equal(u64, await rd.ReadUInt64Async());
                            break;

                        case float f32:
                            Assert.Equal(f32, await rd.ReadSingleAsync());
                            break;

                        case double f64:
                            Assert.Equal(f64, await rd.ReadDoubleAsync());
                            break;

                        case decimal d128:
                            Assert.Equal(d128, await rd.ReadDecimalAsync());
                            break;
                        }
                    }
                }
            }
        }
        public async Task When_reading_an_Int32()
        {
            var sut = new AsyncBinaryReader(new TestStream(
                1, 0, 0, 0
            ));

            var i = await sut.ReadInt32Async(CancellationToken.None);
            Assert.Equal(1, i);
        }
        public async Task When_reading_an_Int32_from_a_stream_that_is_too_short()
        {
            var sut = new AsyncBinaryReader(new TestStream(
                1, 0, 0
            ));

            await Assert.ThrowsAsync<EndOfStreamException>(async () =>
            {
                await sut.ReadInt32Async(CancellationToken.None);
            });
        }