예제 #1
0
        public static void EncodeAsString(string encodingName)
        {
            var encoding = Encoding.GetEncoding(encodingName);

            using var stream = new MemoryStream();
            var g   = Guid.NewGuid();
            var dt  = DateTime.Now;
            var dto = DateTimeOffset.Now;
            var t   = TimeSpan.FromMilliseconds(1096);

            stream.WriteInt64(42L, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteUInt64(12UL, StringLengthEncoding.PlainLittleEndian, encoding, provider: InvariantCulture);
            stream.WriteInt32(34, StringLengthEncoding.PlainBigEndian, encoding, provider: InvariantCulture);
            stream.WriteUInt32(78, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteInt16(90, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteUInt16(12, StringLengthEncoding.Plain, encoding, format: "X", provider: InvariantCulture);
            stream.WriteUInt16(12, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteByte(10, StringLengthEncoding.Plain, encoding, format: "X", provider: InvariantCulture);
            stream.WriteSByte(11, StringLengthEncoding.Plain, encoding, format: "X", provider: InvariantCulture);
            stream.WriteByte(10, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteSByte(11, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteGuid(g, StringLengthEncoding.Plain, encoding);
            stream.WriteGuid(g, StringLengthEncoding.Plain, encoding, format: "X");
            stream.WriteDateTime(dt, StringLengthEncoding.Plain, encoding, format: "O", provider: InvariantCulture);
            stream.WriteDateTimeOffset(dto, StringLengthEncoding.Plain, encoding, format: "O", provider: InvariantCulture);
            stream.WriteDateTime(dt, StringLengthEncoding.Plain, encoding, format: "O", provider: InvariantCulture);
            stream.WriteDateTimeOffset(dto, StringLengthEncoding.Plain, encoding, format: "O", provider: InvariantCulture);
            stream.WriteDecimal(42.5M, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteSingle(32.2F, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteDouble(56.6D, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteTimeSpan(t, StringLengthEncoding.Plain, encoding, provider: InvariantCulture);
            stream.WriteTimeSpan(t, StringLengthEncoding.Plain, encoding, "G", provider: InvariantCulture);

            stream.Position = 0;
            var         decodingContext = new DecodingContext(encoding);
            Span <byte> buffer          = stackalloc byte[256];

            Equal(42L, stream.ReadInt64(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(12UL, stream.ReadUInt64(StringLengthEncoding.PlainLittleEndian, in decodingContext, buffer, provider: InvariantCulture));
            Equal(34, stream.ReadInt32(StringLengthEncoding.PlainBigEndian, in decodingContext, buffer, provider: InvariantCulture));
            Equal(78U, stream.ReadUInt32(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(90, stream.ReadInt16(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal("C", stream.ReadString(StringLengthEncoding.Plain, in decodingContext, buffer));
            Equal(12, stream.ReadUInt16(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal("A", stream.ReadString(StringLengthEncoding.Plain, in decodingContext, buffer));
            Equal("B", stream.ReadString(StringLengthEncoding.Plain, in decodingContext, buffer));
            Equal(10, stream.ReadByte(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(11, stream.ReadSByte(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(g, stream.ReadGuid(StringLengthEncoding.Plain, in decodingContext, buffer));
            Equal(g, stream.ReadGuid(StringLengthEncoding.Plain, in decodingContext, buffer, "X"));
            Equal(dt, stream.ReadDateTime(StringLengthEncoding.Plain, in decodingContext, buffer, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(dto, stream.ReadDateTimeOffset(StringLengthEncoding.Plain, in decodingContext, buffer, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(dt, stream.ReadDateTime(StringLengthEncoding.Plain, in decodingContext, buffer, formats: new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(dto, stream.ReadDateTimeOffset(StringLengthEncoding.Plain, in decodingContext, buffer, formats: new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(42.5M, stream.ReadDecimal(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(32.2F, stream.ReadSingle(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(56.6D, stream.ReadDouble(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(t, stream.ReadTimeSpan(StringLengthEncoding.Plain, in decodingContext, buffer, provider: InvariantCulture));
            Equal(t, stream.ReadTimeSpan(StringLengthEncoding.Plain, in decodingContext, buffer, formats: new[] { "G" }, provider: InvariantCulture));
        }
예제 #2
0
        public IEnumerable<DecodingInstruction> ExecuteDecode(DecodingContext context)
        {
            JsonToken token = context.Input.Peek();

            if (context.KnownType == null || context.KnownType == typeof(object))
            {
                if (token == JsonToken.BeginArray)
                {
                    yield return new ProvideNextNode(new ListNode());
                }
                else if (token == JsonToken.BeginObject)
                {
                    yield return new ProvideNextNode(new DictNode());
                }
                else
                {
                    yield return new ProvideNextNode(new ValudeNode());
                }
            }
            else if (token == JsonToken.Null)
            {
                yield return new ProvideNextNode(new ValudeNode());
            }

            yield break;
        }
예제 #3
0
        public IEnumerable<DecodingInstruction> ExecuteDecode(DecodingContext context)
        {
            if (_action != null)
                context.Value = _action(context.Value);

            yield break;
        }
예제 #4
0
        public static void EncodeAsString(BufferWriter <byte> writer, Encoding encoding)
        {
            var encodingContext = new EncodingContext(encoding, true);

            using (writer)
            {
                var g   = Guid.NewGuid();
                var bi  = new BigInteger(RandomBytes(64));
                var dt  = DateTime.Now;
                var dto = DateTimeOffset.Now;
                writer.WriteInt64(42L, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteUInt64(12UL, LengthFormat.PlainLittleEndian, in encodingContext, provider: InvariantCulture);
                writer.WriteInt32(34, LengthFormat.PlainBigEndian, in encodingContext, provider: InvariantCulture);
                writer.WriteUInt32(78, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteInt16(90, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteUInt16(12, LengthFormat.Plain, in encodingContext, format: "X", provider: InvariantCulture);
                writer.WriteUInt16(12, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteByte(10, LengthFormat.Plain, in encodingContext, format: "X", provider: InvariantCulture);
                writer.WriteSByte(11, LengthFormat.Plain, in encodingContext, format: "X", provider: InvariantCulture);
                writer.WriteByte(10, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteSByte(11, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteGuid(g, LengthFormat.Plain, in encodingContext);
                writer.WriteGuid(g, LengthFormat.Plain, in encodingContext, format: "X");
                writer.WriteDateTime(dt, LengthFormat.Plain, in encodingContext, format: "O", provider: InvariantCulture);
                writer.WriteDateTimeOffset(dto, LengthFormat.Plain, in encodingContext, format: "O", provider: InvariantCulture);
                writer.WriteDateTime(dt, LengthFormat.Plain, in encodingContext, format: "O", provider: InvariantCulture);
                writer.WriteDateTimeOffset(dto, LengthFormat.Plain, in encodingContext, format: "O", provider: InvariantCulture);
                writer.WriteDecimal(42.5M, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteSingle(32.2F, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteDouble(56.6D, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);
                writer.WriteBigInteger(bi, LengthFormat.Plain, in encodingContext, provider: InvariantCulture);

                var decodingContext = new DecodingContext(encoding, true);
                var reader          = IAsyncBinaryReader.Create(writer.WrittenMemory);
                Equal(42L, reader.ReadInt64(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal(12UL, reader.ReadUInt64(LengthFormat.PlainLittleEndian, in decodingContext, provider: InvariantCulture));
                Equal(34, reader.ReadInt32(LengthFormat.PlainBigEndian, in decodingContext, provider: InvariantCulture));
                Equal(78U, reader.ReadUInt32(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal(90, reader.ReadInt16(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal("C", reader.ReadString(LengthFormat.Plain, in decodingContext));
                Equal(12, reader.ReadUInt16(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal("A", reader.ReadString(LengthFormat.Plain, in decodingContext));
                Equal("B", reader.ReadString(LengthFormat.Plain, in decodingContext));
                Equal(10, reader.ReadByte(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal(11, reader.ReadSByte(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal(g, reader.ReadGuid(LengthFormat.Plain, in decodingContext));
                Equal(g, reader.ReadGuid(LengthFormat.Plain, in decodingContext, "X"));
                Equal(dt, reader.ReadDateTime(LengthFormat.Plain, in decodingContext, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(dto, reader.ReadDateTimeOffset(LengthFormat.Plain, in decodingContext, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(dt, reader.ReadDateTime(LengthFormat.Plain, in decodingContext, formats: new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(dto, reader.ReadDateTimeOffset(LengthFormat.Plain, in decodingContext, formats: new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(42.5M, reader.ReadDecimal(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal(32.2F, reader.ReadSingle(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal(56.6D, reader.ReadDouble(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
                Equal(bi, reader.ReadBigInteger(LengthFormat.Plain, in decodingContext, provider: InvariantCulture));
            }
        }
예제 #5
0
        public override Result <ProcessedPayload> Decode(IPayload payload, DecodingContext context)
        {
            if (CurrentEncodingIs(payload, EncodingName) && payload.Data is string data)
            {
                return(Result.Ok(new ProcessedPayload(
                                     data.FromBase64(),
                                     RemoveCurrentEncodingPart(payload))));
            }

            return(Result.Ok(new ProcessedPayload(payload)));
        }
예제 #6
0
        public override Result <ProcessedPayload> Decode(IPayload payload, DecodingContext context)
        {
            // Assume all the other steps will always work with Utf8
            if (CurrentEncodingIs(payload, EncodingName))
            {
                return(Result.Ok(new ProcessedPayload(
                                     (payload.Data as byte[]).GetText(),
                                     RemoveCurrentEncodingPart(payload))));
            }

            return(Result.Ok(new ProcessedPayload(payload)));
        }
예제 #7
0
            public void WithBase64EncodingBeforeOtherEncodings_SavesDecodedDataToTheContext()
            {
                var payload = new Message {
                    Data = _base64Data, Encoding = "utf-8/base64"
                };

                var context = new DecodingContext();

                MessageHandler.DecodePayload(payload, context);

                context.PreviousPayload.GetBytes().Should().BeEquivalentTo(_binaryData);
                context.PreviousPayload.Encoding.Should().BeEquivalentTo("utf-8");
            }
예제 #8
0
        public IEnumerable<DecodingInstruction> ExecuteDecode(DecodingContext context)
        {
            context.Input -= JsonToken.BeginArray;

            IList list;
            if (_listType == null || _listType.IsInterface || _listType.IsArray)
            {
                if (_genericArgument == null)
                {
                    list = new List<object>();
                }
                else
                {
                    list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(_genericArgument));
                }
            }
            else
            {
                // Create the desired instance directly
                list = (IList)Activator.CreateInstance(_listType);
            }

            for (int index = 0; context.Input.Peek() != JsonToken.EndArray; index++)
            {
                if (index > 0)
                {
                    context.Input -= JsonToken.ValueSeperator;
                }

                DoDecode instruction = new DoDecode(context.Input, _genericArgument);
                yield return instruction;

                list.Add(instruction.Value);
            }

            context.Input -= JsonToken.EndArray;

            if (_listType == null || !_listType.IsArray)
            {
                context.Value = list;
            }
            else
            {
                Array array = Array.CreateInstance(_listType.GetElementType(), list.Count);
                list.CopyTo(array, 0);

                context.Value = array;
            }
        }
예제 #9
0
        public IEnumerable<DecodingInstruction> ExecuteDecode(DecodingContext context)
        {
            if (_mapping.UsesReferencing && context.Input.Peek().Type == JsonTokenType.Number)
            {
                double reference = context.Input.Pop().Value<double>();
                context.Value = context.Process.References.FollowReference(reference);

                yield break;
            }

            context.Input -= JsonToken.BeginObject;

            object reflected = Activator.CreateInstance(context.KnownType);

            if (_mapping.UsesReferencing)
            {
                context.Process.References.Reference(reflected);
            }

            for (int index = 0; context.Input.Peek() != JsonToken.EndObject; index++)
            {
                if (index > 0)
                {
                    context.Input -= JsonToken.ValueSeperator;
                }

                string key = context.Input.Pop().Value<string>();

                if (key!=null && _mapping.FieldMappings.ContainsKey(key))
                {
                    JsonFieldMappingBase fieldMapping = _mapping.FieldMappings[key];

                    context.Input -= JsonToken.NameSeperator;

                    DoDecode instruction = new DoDecode(context.Input, fieldMapping.DesiredType);
                    yield return instruction;
                    object value = fieldMapping.Decode(instruction.Value);
                    fieldMapping.Set(reflected, value);
                }
                else
                {
                    //yield return null;
                }
            }

            context.Input -= JsonToken.EndObject;
            context.Value = reflected;
        }
예제 #10
0
            public void WhenBase64IsNotTheFirstEncoding_ShouldSaveTheOriginalPayloadInContext()
            {
                var message = new Message {
                    Data = new { Text = "Hello" }
                };

                MessageHandler.EncodePayload(message, new DecodingContext());
                var payloadData     = message.Data as string;
                var payloadEncoding = message.Encoding;

                var context = new DecodingContext();

                MessageHandler.DecodePayload(message, context);
                context.PreviousPayload.GetBytes().Should().BeEquivalentTo(payloadData.GetBytes());
                context.PreviousPayload.Encoding.Should().Be(payloadEncoding);
            }
예제 #11
0
        public async Task ActAsServerAsync(Socket clientSocket)
        {
            var channel = new SocketChannel();

            channel.Assign(clientSocket);

            _encodingContext = new EncodingContext(channel);
            _decodingContext = new DecodingContext(_channel);
            _encoder         = new FrameEncoder(_encodingContext);
            _decoder         = new FrameDecoder();
            await channel.ReceiveAsync(_decodingContext.Buffer, _decodingContext.Offset, _decodingContext.Capacity);

            if (_decodingContext.BytesLeftToProcess < ClientPreface.Length)
            {
                //TODO: Invalid protocol
            }

            // ReSharper disable once LoopCanBeConvertedToQuery
            for (var i = 0; i < ClientPreface.Length; i++)
            {
                if (ClientPreface[i] != _decodingContext.Buffer[_decodingContext.Offset + i])
                {
                    throw new Http2Exception(Http2ErrorCode.ProtocolError, "ClientPreface was not valid.");
                }
            }
            _decodingContext.Offset             += ClientPreface.Length;
            _decodingContext.BytesLeftToProcess -= ClientPreface.Length;

            // didn't get the settings frame directly
            if (_decodingContext.BytesLeftToProcess == 0)
            {
                await _decodingContext.ReceiveMoreAsync();
            }

            var frame = await _decoder.DecodeAsync(_decodingContext) as SettingsFrame;

            if (frame == null)
            {
                throw new Http2Exception(Http2ErrorCode.ProtocolError, "Expected SETTINGS frame after client preface.");
            }

            //ack on client frame
            await _encoder.EncodeAsync(new SettingsFrame { IsAcknowledgment = true });

            // our own settings.
            await _encoder.EncodeAsync(new SettingsFrame());
        }
예제 #12
0
        /// <summary>
        /// Reads the string using the specified encoding.
        /// </summary>
        /// <param name="stream">The stream to read from.</param>
        /// <param name="length">The length of the string, in bytes.</param>
        /// <param name="context">The text decoding context.</param>
        /// <param name="buffer">The buffer that is allocated by the caller.</param>
        /// <returns>The string decoded from the log entry content stream.</returns>
        public static string ReadString(this Stream stream, int length, DecodingContext context, byte[] buffer)
        {
            //TODO: Should be rewritten for .NET Standard 2.1
            var maxChars = context.Encoding.GetMaxCharCount(buffer.Length);

            if (maxChars == 0)
            {
                throw new ArgumentException(ExceptionMessages.BufferTooSmall, nameof(buffer));
            }
            var decoder = context.GetDecoder();
            var charBuffer = new ArrayRental <char>(maxChars);
            var result = default(ArrayRental <char>);
            int currentPos = 0, resultOffset = 0;

            try
            {
                do
                {
                    var readLength = Math.Min(length - currentPos, buffer.Length);
                    var n          = stream.Read(buffer, 0, readLength);
                    if (n == 0)
                    {
                        throw new EndOfStreamException();
                    }
                    var charsRead = decoder.GetChars(buffer, 0, n, (char[])charBuffer, 0);
                    if (currentPos == 0 && n == length)
                    {
                        return(new string((char[])charBuffer, 0, charsRead));
                    }
                    if (result.IsEmpty)
                    {
                        result = new ArrayRental <char>(length);
                    }
                    Memory.Copy(ref charBuffer[0], ref result[resultOffset], (uint)charsRead);
                    resultOffset += charsRead;
                    currentPos   += n;
                }while (currentPos < length);
                return(new string((char[])result, 0, resultOffset));
            }
            finally
            {
                charBuffer.Dispose();
                result.Dispose();
            }
        }
예제 #13
0
        public override Result <ProcessedPayload> Encode(IPayload payload, DecodingContext context)
        {
            var data = payload.Data;

            if (IsEmpty(data))
            {
                return(Result.Ok(new ProcessedPayload(payload)));
            }

            if (data is byte[] bytes)
            {
                return(Result.Ok(new ProcessedPayload(
                                     bytes.ToBase64(),
                                     AddEncoding(payload, EncodingName))));
            }

            return(Result.Ok(new ProcessedPayload(payload)));
        }
예제 #14
0
 ValueTask <TimeSpan> IAsyncBinaryReader.ReadTimeSpanAsync(StringLengthEncoding lengthFormat, DecodingContext context, string[] formats, TimeSpanStyles style, IFormatProvider?provider, CancellationToken token)
 => StreamExtensions.ReadTimeSpanAsync(input, lengthFormat, context, buffer, formats, style, provider, token);
예제 #15
0
 ValueTask <DateTimeOffset> IAsyncBinaryReader.ReadDateTimeOffsetAsync(StringLengthEncoding lengthFormat, DecodingContext context, DateTimeStyles style, IFormatProvider?provider, CancellationToken token)
 => StreamExtensions.ReadDateTimeOffsetAsync(input, lengthFormat, context, buffer, style, provider, token);
예제 #16
0
 ValueTask <Guid> IAsyncBinaryReader.ReadGuidAsync(StringLengthEncoding lengthFormat, DecodingContext context, string format, CancellationToken token)
 => StreamExtensions.ReadGuidAsync(input, lengthFormat, context, buffer, format, token);
예제 #17
0
 ValueTask <double> IAsyncBinaryReader.ReadDoubleAsync(StringLengthEncoding lengthFormat, DecodingContext context, NumberStyles style, IFormatProvider?provider, CancellationToken token)
 => StreamExtensions.ReadDoubleAsync(input, lengthFormat, context, buffer, style, provider, token);
예제 #18
0
 ValueTask <BigInteger> IAsyncBinaryReader.ReadBigIntegerAsync(LengthFormat lengthFormat, DecodingContext context, NumberStyles style, IFormatProvider?provider, CancellationToken token)
 => EndOfStream <BigInteger>();
 ValueTask <string> IAsyncBinaryReader.ReadStringAsync(int length, DecodingContext context, CancellationToken token)
 => reader.ReadStringAsync(length, context, token);
예제 #20
0
 public override Result <ProcessedPayload> Encode(IPayload payload, DecodingContext context)
 {
     return(Result.Ok(new ProcessedPayload(payload)));
 }
예제 #21
0
        public IEnumerable<DecodingInstruction> ExecuteDecode(DecodingContext context)
        {
            context.Input -= JsonToken.BeginObject;

            IDictionary dict;

            #if NET40
            IDictionary<string, object> expando = null;
            #endif

            if (_dictType == null)
            {
                #if NET40
                dict = null;
                expando = new ExpandoObject();
                #else
                dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).MakeGenericType(typeof(string), _genericArgument));
                #endif
            }
            else if(_dictType.IsInterface)
            {
                if (_genericArgument != null)
                    dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).MakeGenericType(typeof(string), _genericArgument));
                else
                    dict = (IDictionary)Activator.CreateInstance(typeof(Dictionary<string, object>));

            }
            else
            {
                // Create the desired instance directly
                dict = (IDictionary)Activator.CreateInstance(_dictType);
            }

            for (int index = 0; context.Input.Peek() != JsonToken.EndObject; index++)
            {
                if (index > 0)
                {
                    context.Input -= JsonToken.ValueSeperator;
                }

                string key = context.Input.Pop().Value<string>();

                context.Input -= JsonToken.NameSeperator;

                DoDecode instruction = new DoDecode(context.Input, _genericArgument);
                yield return instruction;

                #if NET40
                if (dict == null)
                {
                    expando.Add(key, instruction.Value);
                }
                else
                {
                    dict.Add(key, instruction.Value);
                }
                #else
                dict.Add(key, instruction.Value);
                #endif
            }

            context.Input -= JsonToken.EndObject;

            #if NET40
            if (dict == null)
            {
                context.Value = expando;
            }
            else
            {
                context.Value = dict;
            }
            #else
            context.Value = dict;
            #endif
        }
예제 #22
0
 public ValueTask <string> ReadStringAsync(int length, DecodingContext context, CancellationToken token)
 => EndOfStream <string>();
예제 #23
0
 ValueTask <Guid> IAsyncBinaryReader.ReadGuidAsync(LengthFormat lengthFormat, DecodingContext context, CancellationToken token)
 => StreamExtensions.ReadGuidAsync(stream, lengthFormat, context, buffer, token);
예제 #24
0
 public IEnumerable<DecodingInstruction> ExecuteDecode(DecodingContext context)
 {
     context.Value = context.Input.Pop().Value(context.KnownType == null ? typeof(object) : context.KnownType);
     yield break;
 }
예제 #25
0
 /// <summary>
 /// Decodes string asynchronously from pipe.
 /// </summary>
 /// <param name="reader">The pipe reader.</param>
 /// <param name="length">The length of the string, in bytes.</param>
 /// <param name="context">The text decoding context.</param>
 /// <param name="token">The token that can be used to cancel the operation.</param>
 /// <returns>The decoded string.</returns>
 /// <exception cref="EndOfStreamException"><paramref name="reader"/> doesn't contain the necessary number of bytes to restore string.</exception>
 /// <exception cref="OperationCanceledException">The operation has been canceled.</exception>
 public static async ValueTask <string> ReadStringAsync(this PipeReader reader, int length, DecodingContext context, CancellationToken token = default)
 {
     if (length == 0)
     {
         return(string.Empty);
     }
     using var resultBuffer = new ArrayBuffer <char>(length);
     return(await ReadAsync <string, StringReader <ArrayBuffer <char> > >(reader, new StringReader <ArrayBuffer <char> >(context, resultBuffer), token).ConfigureAwait(false));
 }
예제 #26
0
 /// <summary>
 /// Decodes string asynchronously from pipe.
 /// </summary>
 /// <param name="reader">The pipe reader.</param>
 /// <param name="lengthFormat">Represents string length encoding format.</param>
 /// <param name="context">The text decoding context.</param>
 /// <param name="token">The token that can be used to cancel the operation.</param>
 /// <returns>The decoded string.</returns>
 /// <exception cref="EndOfStreamException"><paramref name="reader"/> doesn't contain the necessary number of bytes to restore string.</exception>
 /// <exception cref="OperationCanceledException">The operation has been canceled.</exception>
 /// <exception cref="ArgumentOutOfRangeException"><paramref name="lengthFormat"/> is invalid.</exception>
 public static async ValueTask <string> ReadStringAsync(this PipeReader reader, StringLengthEncoding lengthFormat, DecodingContext context, CancellationToken token = default)
 => await ReadStringAsync(reader, await reader.ReadLengthAsync(lengthFormat, token).ConfigureAwait(false), context, token).ConfigureAwait(false);
        public static async Task WriteReadPrimitivesAsync(IAsyncBinaryReaderWriterSource source, bool littleEndian, Encoding encoding)
        {
            await using (source)
            {
                const byte    value8   = 254;
                const short   value16  = 42;
                const int     value32  = int.MaxValue;
                const long    value64  = long.MaxValue;
                const decimal valueM   = 42M;
                const float   valueF   = 56.6F;
                const double  valueD   = 67.7D;
                var           valueG   = Guid.NewGuid();
                var           valueDT  = DateTime.Now;
                var           valueDTO = DateTimeOffset.Now;
                var           valueT   = TimeSpan.FromMilliseconds(1024);

                var writer = source.CreateWriter();
                await writer.WriteInt16Async(value16, littleEndian);

                await writer.WriteInt32Async(value32, littleEndian);

                await writer.WriteInt64Async(value64, littleEndian);

                await writer.WriteAsync(valueM);

                var encodingContext = new EncodingContext(encoding, true);
                await writer.WriteByteAsync(value8, StringLengthEncoding.Plain, encodingContext, provider : InvariantCulture);

                await writer.WriteInt16Async(value16, StringLengthEncoding.Compressed, encodingContext, provider : InvariantCulture);

                await writer.WriteInt32Async(value32, StringLengthEncoding.Plain, encodingContext, provider : InvariantCulture);

                await writer.WriteInt64Async(value64, StringLengthEncoding.PlainBigEndian, encodingContext, provider : InvariantCulture);

                await writer.WriteDecimalAsync(valueM, StringLengthEncoding.PlainLittleEndian, encodingContext, provider : InvariantCulture);

                await writer.WriteSingleAsync(valueF, StringLengthEncoding.Plain, encodingContext, provider : InvariantCulture);

                await writer.WriteDoubleAsync(valueD, StringLengthEncoding.Plain, encodingContext, provider : InvariantCulture);

                await writer.WriteGuidAsync(valueG, StringLengthEncoding.Plain, encodingContext);

                await writer.WriteGuidAsync(valueG, StringLengthEncoding.Plain, encodingContext, "X");

                await writer.WriteDateTimeAsync(valueDT, StringLengthEncoding.Plain, encodingContext, format : "O", provider : InvariantCulture);

                await writer.WriteDateTimeOffsetAsync(valueDTO, StringLengthEncoding.Plain, encodingContext, format : "O", provider : InvariantCulture);

                await writer.WriteDateTimeAsync(valueDT, StringLengthEncoding.Plain, encodingContext, format : "O", provider : InvariantCulture);

                await writer.WriteDateTimeOffsetAsync(valueDTO, StringLengthEncoding.Plain, encodingContext, format : "O", provider : InvariantCulture);

                await writer.WriteTimeSpanAsync(valueT, StringLengthEncoding.Plain, encodingContext);

                await writer.WriteTimeSpanAsync(valueT, StringLengthEncoding.Plain, encodingContext, "G", InvariantCulture);

                var reader = source.CreateReader();
                Equal(value16, await reader.ReadInt16Async(littleEndian));
                Equal(value32, await reader.ReadInt32Async(littleEndian));
                Equal(value64, await reader.ReadInt64Async(littleEndian));
                Equal(valueM, await reader.ReadAsync <decimal>());
                var decodingContext = new DecodingContext(encoding, true);
                Equal(value8, await reader.ReadByteAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
                Equal(value16, await reader.ReadInt16Async(StringLengthEncoding.Compressed, decodingContext, provider: InvariantCulture));
                Equal(value32, await reader.ReadInt32Async(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
                Equal(value64, await reader.ReadInt64Async(StringLengthEncoding.PlainBigEndian, decodingContext, provider: InvariantCulture));
                Equal(valueM, await reader.ReadDecimalAsync(StringLengthEncoding.PlainLittleEndian, decodingContext, provider: InvariantCulture));
                Equal(valueF, await reader.ReadSingleAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
                Equal(valueD, await reader.ReadDoubleAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
                Equal(valueG, await reader.ReadGuidAsync(StringLengthEncoding.Plain, decodingContext));
                Equal(valueG, await reader.ReadGuidAsync(StringLengthEncoding.Plain, decodingContext, "X"));
                Equal(valueDT, await reader.ReadDateTimeAsync(StringLengthEncoding.Plain, decodingContext, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(valueDTO, await reader.ReadDateTimeOffsetAsync(StringLengthEncoding.Plain, decodingContext, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(valueDT, await reader.ReadDateTimeAsync(StringLengthEncoding.Plain, decodingContext, new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(valueDTO, await reader.ReadDateTimeOffsetAsync(StringLengthEncoding.Plain, decodingContext, new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
                Equal(valueT, await reader.ReadTimeSpanAsync(StringLengthEncoding.Plain, decodingContext, InvariantCulture));
                Equal(valueT, await reader.ReadTimeSpanAsync(StringLengthEncoding.Plain, decodingContext, new[] { "G" }, TimeSpanStyles.None, InvariantCulture));
            }
        }
예제 #28
0
 public ValueTask <string> ReadStringAsync(StringLengthEncoding lengthFormat, DecodingContext context, CancellationToken token = default)
 => StreamExtensions.ReadStringAsync(input, lengthFormat, context, buffer, token);
 ValueTask <string> IAsyncBinaryReader.ReadStringAsync(StringLengthEncoding lengthFormat, DecodingContext context, CancellationToken token)
 => reader.ReadStringAsync(lengthFormat, context, token);
예제 #30
0
 ValueTask <Guid> IAsyncBinaryReader.ReadGuidAsync(LengthFormat lengthFormat, DecodingContext context, string format, CancellationToken token)
 => EndOfStream <Guid>();
예제 #31
0
 ValueTask <DateTime> IAsyncBinaryReader.ReadDateTimeAsync(LengthFormat lengthFormat, DecodingContext context, string[] formats, DateTimeStyles style, IFormatProvider?provider, CancellationToken token)
 => StreamExtensions.ReadDateTimeAsync(stream, lengthFormat, context, buffer, style, provider, token);
예제 #32
0
 ValueTask <byte> IAsyncBinaryReader.ReadByteAsync(LengthFormat lengthFormat, DecodingContext context, NumberStyles style, IFormatProvider?provider, CancellationToken token)
 => StreamExtensions.ReadByteAsync(stream, lengthFormat, context, buffer, style, provider, token);
예제 #33
0
 public ValueTask <string> ReadStringAsync(StringLengthEncoding lengthFormat, DecodingContext context, CancellationToken token)
 => EndOfStream <string>();
예제 #34
0
 ValueTask <TimeSpan> IAsyncBinaryReader.ReadTimeSpanAsync(LengthFormat lengthFormat, DecodingContext context, IFormatProvider?provider, CancellationToken token)
 => StreamExtensions.ReadTimeSpanAsync(stream, lengthFormat, context, buffer, provider, token);
예제 #35
0
        public static async Task EncodeAsStringAsync(string encodingName)
        {
            var encoding = Encoding.GetEncoding(encodingName);

            using var stream = new MemoryStream();
            var g   = Guid.NewGuid();
            var dt  = DateTime.Now;
            var dto = DateTimeOffset.Now;
            var t   = TimeSpan.FromMilliseconds(1096);
            await stream.WriteInt64Async(42L, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteUInt64Async(12UL, StringLengthEncoding.PlainLittleEndian, encoding, provider : InvariantCulture);

            await stream.WriteInt32Async(34, StringLengthEncoding.PlainBigEndian, encoding, provider : InvariantCulture);

            await stream.WriteUInt32Async(78, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteInt16Async(90, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteUInt16Async(12, StringLengthEncoding.Plain, encoding, format : "X", provider : InvariantCulture);

            await stream.WriteUInt16Async(12, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteByteAsync(10, StringLengthEncoding.Plain, encoding, format : "X", provider : InvariantCulture);

            await stream.WriteSByteAsync(11, StringLengthEncoding.Plain, encoding, format : "X", provider : InvariantCulture);

            await stream.WriteByteAsync(10, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteSByteAsync(11, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteGuidAsync(g, StringLengthEncoding.Plain, encoding);

            await stream.WriteGuidAsync(g, StringLengthEncoding.Plain, encoding, format : "X");

            await stream.WriteDateTimeAsync(dt, StringLengthEncoding.Plain, encoding, format : "O", provider : InvariantCulture);

            await stream.WriteDateTimeOffsetAsync(dto, StringLengthEncoding.Plain, encoding, format : "O", provider : InvariantCulture);

            await stream.WriteDateTimeAsync(dt, StringLengthEncoding.Plain, encoding, format : "O", provider : InvariantCulture);

            await stream.WriteDateTimeOffsetAsync(dto, StringLengthEncoding.Plain, encoding, format : "O", provider : InvariantCulture);

            await stream.WriteDecimalAsync(42.5M, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteSingleAsync(32.2F, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteDoubleAsync(56.6D, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteTimeSpanAsync(t, StringLengthEncoding.Plain, encoding, provider : InvariantCulture);

            await stream.WriteTimeSpanAsync(t, StringLengthEncoding.Plain, encoding, "G", provider : InvariantCulture);

            stream.Position = 0;
            var decodingContext = new DecodingContext(encoding);

            Equal(42L, await stream.ReadInt64Async(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(12UL, await stream.ReadUInt64Async(StringLengthEncoding.PlainLittleEndian, decodingContext, provider: InvariantCulture));
            Equal(34, await stream.ReadInt32Async(StringLengthEncoding.PlainBigEndian, decodingContext, provider: InvariantCulture));
            Equal(78U, await stream.ReadUInt32Async(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(90, await stream.ReadInt16Async(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal("C", await stream.ReadStringAsync(StringLengthEncoding.Plain, decodingContext.Encoding));
            Equal(12, await stream.ReadUInt16Async(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal("A", await stream.ReadStringAsync(StringLengthEncoding.Plain, decodingContext.Encoding));
            Equal("B", await stream.ReadStringAsync(StringLengthEncoding.Plain, decodingContext.Encoding));
            Equal(10, await stream.ReadByteAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(11, await stream.ReadSByteAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(g, await stream.ReadGuidAsync(StringLengthEncoding.Plain, decodingContext));
            Equal(g, await stream.ReadGuidAsync(StringLengthEncoding.Plain, decodingContext, "X"));
            Equal(dt, await stream.ReadDateTimeAsync(StringLengthEncoding.Plain, decodingContext, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(dto, await stream.ReadDateTimeOffsetAsync(StringLengthEncoding.Plain, decodingContext, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(dt, await stream.ReadDateTimeAsync(StringLengthEncoding.Plain, decodingContext, formats: new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(dto, await stream.ReadDateTimeOffsetAsync(StringLengthEncoding.Plain, decodingContext, formats: new[] { "O" }, style: DateTimeStyles.RoundtripKind, provider: InvariantCulture));
            Equal(42.5M, await stream.ReadDecimalAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(32.2F, await stream.ReadSingleAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(56.6D, await stream.ReadDoubleAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(t, await stream.ReadTimeSpanAsync(StringLengthEncoding.Plain, decodingContext, provider: InvariantCulture));
            Equal(t, await stream.ReadTimeSpanAsync(StringLengthEncoding.Plain, decodingContext, formats: new[] { "G" }, provider: InvariantCulture));
        }
예제 #36
0
 public ValueTask <string> ReadStringAsync(int length, DecodingContext context, CancellationToken token = default)
 => StreamExtensions.ReadStringAsync(stream, length, context, buffer, token);