コード例 #1
0
ファイル: Rfc1751.cs プロジェクト: Ibasa/Ripple
        public static ReadOnlyMemory <byte> Decode(string words, out bool parityError)
        {
            var split = words.Split(" ", StringSplitOptions.RemoveEmptyEntries);

            if (split.Length % 6 != 0)
            {
                throw new ArgumentException("RFC1751 works in 6 word blocks", "words");
            }
            parityError = false;

            if (split.Length == 0)
            {
                return(new byte[0]);
            }

            var builder = new System.Buffers.ArrayBufferWriter <byte>(8);

            for (int i = 0; i < split.Length; i += 6)
            {
                var bits = Decode(split[i], split[i + 1], split[i + 2], split[i + 3], split[i + 4], split[i + 5], out var parity);
                parityError |= parity;

                var span = builder.GetSpan(8);
                BinaryPrimitives.WriteUInt64LittleEndian(span, bits);
                builder.Advance(8);
            }
            return(builder.WrittenMemory);
        }
コード例 #2
0
        protected Api()
        {
            jsonBuffer = new System.Buffers.ArrayBufferWriter <byte>();
            var jsonOptions = new System.Text.Json.JsonWriterOptions()
            {
                SkipValidation = true
            };

            jsonWriter = new System.Text.Json.Utf8JsonWriter(jsonBuffer, jsonOptions);
        }
コード例 #3
0
        private static T ToObject <T>(JsonElement element, JsonSerializerOptions options = null)
        {
            var bufferWriter = new System.Buffers.ArrayBufferWriter <byte>();

            using (var writer = new Utf8JsonWriter(bufferWriter))
            {
                element.WriteTo(writer);
            }

            return(JsonSerializer.Deserialize <T>(bufferWriter.WrittenSpan, options));
        }
コード例 #4
0
        public static async Task <Message> Deserialize(Stream stream, CancellationToken cancellationToken)
        {
            // TypeModel.DeserializeWithLengthPrefix does not work. We'll do it ourselves.
            const int BufferCapacity = 256; // This is arbitrary.
            var       bufferWriter   = new System.Buffers.ArrayBufferWriter <byte>();
            var       expectedLength = await GetMessageLength(stream, cancellationToken).ConfigureAwait(false);

            while (bufferWriter.WrittenCount < expectedLength)
            {
                var buffer    = bufferWriter.GetMemory(BufferCapacity);
                var byteCount = await stream.ReadAsync(buffer, cancellationToken).ConfigureAwait(false);

                bufferWriter.Advance(byteCount);
            }

            Debug.Assert(bufferWriter.WrittenCount == expectedLength, $"Expected {expectedLength}, but got {bufferWriter.WrittenCount}");
            return(TypeModel.Deserialize <Message>(bufferWriter.WrittenMemory));
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: uruk-project/Jwt
        private static ReadOnlyMemory <byte> CreateJws()
        {
            var descriptor = new JweDescriptor(encryptionKey1, KeyManagementAlgorithm.A128KW, EncryptionAlgorithm.A128CbcHS256)
            {
                Payload = new JwsDescriptor(signingKey1, SignatureAlgorithm.HS256)
                {
                    Payload = new JwtPayload
                    {
                        { JwtClaimNames.Iat, 1500000000L },
                        { JwtClaimNames.Exp, 2000000000L },
                        { JwtClaimNames.Iss, "https://idp.example.com/" },
                        { JwtClaimNames.Aud, "636C69656E745F6964" },
                        { JwtClaimNames.Sub, "*****@*****.**" },
                        { JwtClaimNames.Jti, "12345667890" }
                    }
                }
            };

            var bufferWriter = new System.Buffers.ArrayBufferWriter <byte>();
            var context      = new EncodingContext(bufferWriter, null, 0, false);

            descriptor.Encode(context);
            return(bufferWriter.WrittenMemory);
        }
コード例 #6
0
        public static object ToOutputData(DefTable table, List <Record> records, string dataType)
        {
            switch (dataType)
            {
            case "data_bin":
            {
                var buf = ThreadLocalTemporalByteBufPool.Alloc(1024 * 1024);
                BinaryExportor.Ins.WriteList(table, records, buf);
                var bytes = buf.CopyData();
                ThreadLocalTemporalByteBufPool.Free(buf);
                return(bytes);
            }

            case "data_json":
            case "data_json2":
            {
                // data_json与data_json2格式区别在于
                // data_json的map格式是 [[key1,value1],[] ..]
                // data_json2的map格式是 { key1:value1, ...}
                var ss         = new MemoryStream();
                var jsonWriter = new Utf8JsonWriter(ss, new JsonWriterOptions()
                    {
                        Indented       = !table.Assembly.OutputCompactJson,
                        SkipValidation = false,
                        Encoder        = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),
                    });
                if (dataType == "data_json")
                {
                    JsonExportor.Ins.WriteAsArray(records, jsonWriter);
                }
                else
                {
                    Json2Exportor.Ins.WriteAsObject(table, records, jsonWriter);
                }
                jsonWriter.Flush();
                return(DataUtil.StreamToBytes(ss));
            }

            case "data_lua":
            {
                var content = new StringBuilder();

                switch (table.Mode)
                {
                case ETableMode.ONE:
                {
                    LuaExportor.Ins.ExportTableSingleton(table, records[0], content);
                    break;
                }

                case ETableMode.MAP:
                {
                    LuaExportor.Ins.ExportTableMap(table, records, content);
                    break;
                }

                case ETableMode.LIST:
                {
                    LuaExportor.Ins.ExportTableList(table, records, content);
                    break;
                }

                default:
                {
                    throw new NotSupportedException();
                }
                }
                return(string.Join('\n', content));
            }

            case "data_protobuf_bin":
            {
                var ms = new MemoryStream();
                ProtobufBinExportor.Ins.WriteList(table, records, ms);
                return(DataUtil.StreamToBytes(ms));
            }

            case "data_protobuf_json":
            {
                var ss         = new MemoryStream();
                var jsonWriter = new Utf8JsonWriter(ss, new JsonWriterOptions()
                    {
                        Indented       = !table.Assembly.OutputCompactJson,
                        SkipValidation = false,
                        Encoder        = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),
                    });
                ProtobufJsonExportor.Ins.WriteAsTable(records, jsonWriter);
                jsonWriter.Flush();
                return(DataUtil.StreamToBytes(ss));
            }

            case "data_msgpack":
            {
                var ms     = new System.Buffers.ArrayBufferWriter <byte>();
                var writer = new MessagePackWriter(ms);
                MsgPackExportor.Ins.WriteList(table, records, ref writer);
                writer.Flush();
                return(ms.WrittenSpan.ToArray());
            }

            case "data_flatbuffers_json":
            {
                var ss         = new MemoryStream();
                var jsonWriter = new Utf8JsonWriter(ss, new JsonWriterOptions()
                    {
                        Indented       = !table.Assembly.OutputCompactJson,
                        SkipValidation = false,
                        Encoder        = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),
                    });
                FlatBuffersJsonExportor.Ins.WriteAsTable(records, jsonWriter);
                jsonWriter.Flush();
                return(DataUtil.StreamToBytes(ss));
            }

            //case "data_erlang":
            //{
            //    var content = new StringBuilder();
            //    switch (table.Mode)
            //    {
            //        case ETableMode.ONE:
            //        {
            //            ErlangExport.Ins.ExportTableSingleton(table, records[0], content);
            //            break;
            //        }
            //        case ETableMode.MAP:
            //        {
            //            ErlangExport.Ins.ExportTableMap(table, records, content);
            //            break;
            //        }
            //        default:
            //        {
            //            throw new NotSupportedException();
            //        }
            //    }
            //    return content.ToString();
            //}
            default:
            {
                throw new ArgumentException($"not support datatype:{dataType}");
            }
            }
        }
コード例 #7
0
ファイル: WebSocketApi.cs プロジェクト: Ibasa/Ripple
        private async Task ReceiveLoop()
        {
            var response = new System.Buffers.ArrayBufferWriter <byte>();

            while (!cancellationTokenSource.IsCancellationRequested)
            {
                var buffer = response.GetMemory();
                try
                {
                    var result = await socket.ReceiveAsync(buffer, cancellationTokenSource.Token);

                    response.Advance(result.Count);
                    if (result.EndOfMessage)
                    {
                        var json = System.Text.Json.JsonDocument.Parse(response.WrittenMemory);

                        var type = json.RootElement.GetProperty("type").GetString();
                        if (type == "response")
                        {
                            var id     = json.RootElement.GetProperty("id").GetUInt32();
                            var status = json.RootElement.GetProperty("status").GetString();
                            if (status == "success")
                            {
                                lock (responses)
                                {
                                    if (responses.TryGetValue(id, out var task))
                                    {
                                        responses.Remove(id);
                                        task.SetResult(json.RootElement.GetProperty("result").Clone());
                                    }
                                }
                            }
                            else if (status == "error")
                            {
                                var             error   = json.RootElement.GetProperty("error").GetString();
                                var             request = json.RootElement.GetProperty("request").Clone();
                                RippleException exception;
                                if (json.RootElement.TryGetProperty("error_exception", out var element))
                                {
                                    exception = new RippleSubmitRequestException(error, element.GetString(), request);
                                }
                                else
                                {
                                    exception = new RippleRequestException(error, request);
                                }

                                lock (responses)
                                {
                                    if (responses.TryGetValue(id, out var task))
                                    {
                                        responses.Remove(id);
                                        task.SetException(exception);
                                    }
                                }
                            }
                            else
                            {
                                lock (responses)
                                {
                                    if (responses.TryGetValue(id, out var task))
                                    {
                                        responses.Remove(id);
                                        task.SetException(new NotSupportedException(string.Format("{0} not a supported status", status)));
                                    }
                                }
                            }
                        }
                        else if (type == "path_find")
                        {
                            var id = json.RootElement.GetProperty("id").GetUInt32();
                            var pathFindResponse = new PathFindResponse(json.RootElement);
                            try
                            {
                                OnPathFind?.Invoke(this, id, pathFindResponse);
                            }
                            catch (Exception exc)
                            {
                                // TODO: We don't want user exceptions from the OnPathFind event to tear down this thread but we should bubble them up somehow.
                            }
                        }

                        response.Clear();
                    }
                }
                catch (TaskCanceledException taskCanceledException)
                {
                    if (taskCanceledException.CancellationToken == cancellationTokenSource.Token)
                    {
                        // We canceled the receive, while loop will now terminate and task completes successfully
                    }
                    else
                    {
                        // Something else unexpected was cancelled, rethrow
                        throw;
                    }
                }
            }
            socket.Dispose();
        }