/// <summary>
        /// Turns result data into a rpc response
        /// </summary>
        /// <param name="id">Rpc request id</param>
        /// <param name="serializer">Json serializer function to use for objects for the response</param>
        /// <returns>Rpc response for request</returns>
        public RpcResponse ToRpcResponse(RpcId id, Func <object, JToken> serializer)
        {
            JToken   data  = this.Data == null ? null : serializer(this.Data);
            RpcError error = new RpcError(this.ErrorCode, this.Message, data);

            return(new RpcResponse(id, error));
        }
Exemplo n.º 2
0
 private RpcRequestParseResult(RpcId id, string?method, RpcParameters?parameters, RpcError?error)
 {
     this.Id         = id;
     this.Method     = method;
     this.Parameters = parameters;
     this.Error      = error;
 }
Exemplo n.º 3
0
        public virtual PhpValue call(Context ctx, PhpString name, PhpArray args)
        {
            string responseJson = null;

            try
            {
                // 创建ID
                RpcId rpcId = new RpcId(Guid.NewGuid().ToString());
                // 将List<object>或者Dictionary<string, object>隐式转换成RpcParameters
                RpcParameters rpcParameters = ArrayUtil.array2collection(ctx, args);
                // 构建请求
                RpcRequest rpcRequest = new RpcRequest(rpcId, name.ToString(ctx), rpcParameters);
                // 发送请求
                RpcResponse rpcResponse = _client.SendRequestAsync(rpcRequest, "").Result;
                // 获取响应
                PhpValue returnJson = JsonSerialization.json_decode(ctx, new PhpString(rpcResponse.Result.ToString()), true);
                return(PhpValue.Create(new PhpArray()
                {
                    { new IntStringKey("id"), PhpValue.Create(rpcResponse.Id.StringValue) },
                    { new IntStringKey("jsonrpc"), PhpValue.Create("2.0") },
                    { new IntStringKey("result"), !returnJson.IsArray ? PhpValue.FromClr(rpcResponse.Result) : returnJson },
                }));
            }
            catch (Exception ex)
            {
                if (ex.InnerException is RpcClientInvalidStatusCodeException)
                {
                    responseJson = (ex.InnerException as RpcClientInvalidStatusCodeException)?.Content;
                }
            }
            return(String.IsNullOrEmpty(responseJson) ? PhpValue.False : JsonSerialization.json_decode(ctx, new PhpString(responseJson), true));
        }
Exemplo n.º 4
0
        public virtual RpcRequest ToRpcRequest()
        {
            if (!string.IsNullOrWhiteSpace(_secret))
            {
                AddParam(_secret);
            }
            PrepareParam();
            var id = new RpcId(Guid.ToString());

            return(new RpcRequest(id, MethodName, _parameters));
        }
Exemplo n.º 5
0
        public void When_writing_id_and_is_a_string_then_write_correctly()
        {
            var id    = Autofixture.Create <int>();
            var rpcId = new RpcId(id.ToString(), RpcIdKind.String);

            // Act
            var result = JsonConvert.SerializeObject(rpcId);

            // Assert
            result.Should().Be($"\"{id}\"");
        }
Exemplo n.º 6
0
        public void ParseRequests_Valid(string json, object id, string method, object[] parameters)
        {
            DefaultRpcParser parser = new DefaultRpcParser(null, Options.Create(new RpcServerConfiguration()));

            ParsingResult result = parser.ParseRequests(json);

            Assert.NotNull(result);
            Assert.Equal(1, result.RequestCount);
            Assert.Single(result.Requests);
            Assert.Equal(RpcId.FromObject(id), result.Requests[0].Id);
            Assert.Equal(method, result.Requests[0].Method);
            ParserTests.CompareParameters(parameters, result.Requests[0].Parameters);
            Assert.False(result.IsBulkRequest);
        }
Exemplo n.º 7
0
 private static void CompareId(object id, RpcId jId)
 {
     if (!jId.HasValue)
     {
         Assert.Null(id);
         return;
     }
     if (jId.IsString)
     {
         Assert.Equal(id, jId.StringValue);
         return;
     }
     id = Convert.ToDouble(id);
     Assert.Equal(id, jId.NumberValue);
 }
Exemplo n.º 8
0
        public void Test_Receive()
        {
            StreamBuffer buffer       = new StreamBuffer(100);
            InputStream  inputStream  = new InputStream(buffer);
            OutputStream outputStream = new OutputStream(buffer);

            outputStream.write((int)1);
            outputStream.write((short)2);
            outputStream.write("abcd");

            RpcId rpcId = new RpcId(RpcController.makeRpcName("TestRpc", "rpcReceive", 3));

            _rpcNetwork.handleRpc(rpcId.value, inputStream);
            Assert.AreEqual(2, _rpcImpl.receiveRpcCount);
        }
Exemplo n.º 9
0
        public override int GetHashCode()
        {
            int hash = 1;

            if (RpcId != 0)
            {
                hash ^= RpcId.GetHashCode();
            }
            if (Status != 0)
            {
                hash ^= Status.GetHashCode();
            }
            hash ^= payloads_.GetHashCode();
            if (_unknownFields != null)
            {
                hash ^= _unknownFields.GetHashCode();
            }
            return(hash);
        }
Exemplo n.º 10
0
        private static void CompareId(object id, RpcId jId)
        {
            if (!jId.HasValue)
            {
                Assert.Null(id);
                return;
            }
            switch (jId.Type)
            {
            case RpcIdType.Number:
                id = Convert.ToDouble(id);
                Assert.Equal(id, jId.NumberValue);
                break;

            case RpcIdType.String:
                Assert.Equal(id, jId.StringValue);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(jId.Type));
            }
        }
Exemplo n.º 11
0
 public static void FinishedRequest(this ILogger logger, RpcId id)
 {
     LoggerExtensions.finishedRequest(logger, id, null);
 }
Exemplo n.º 12
0
 public static void InvokingRequest(this ILogger logger, RpcId id)
 {
     LoggerExtensions.invokingRequest(logger, id, null);
 }
Exemplo n.º 13
0
        private RpcRequestParseResult ParseResult(ref Utf8JsonReader jsonReader, Memory <byte> bytes)
        {
            RpcId         id         = default;
            string?       method     = null;
            RpcParameters?parameters = null;
            string?       rpcVersion = null;

            try
            {
                if (jsonReader.TokenType == JsonTokenType.StartObject)
                {
                    jsonReader.Read();
                }
                while (jsonReader.TokenType != JsonTokenType.EndObject)
                {
                    string propertyName = jsonReader.GetString();
                    jsonReader.Read();
                    switch (propertyName)
                    {
                    case JsonRpcContants.IdPropertyName:
                        switch (jsonReader.TokenType)
                        {
                        case JsonTokenType.String:
                            id = new RpcId(jsonReader.GetString());
                            break;

                        case JsonTokenType.Number:
                            if (!jsonReader.TryGetInt64(out long longId))
                            {
                                var idError = new RpcError(RpcErrorCode.ParseError, "Unable to parse rpc id as an integer");
                                return(RpcRequestParseResult.Fail(id, idError));
                            }
                            id = new RpcId(longId);
                            break;

                        default:
                            var error = new RpcError(RpcErrorCode.ParseError, "Unable to parse rpc id as a string or an integer");
                            return(RpcRequestParseResult.Fail(id, error));
                        }
                        break;

                    case JsonRpcContants.VersionPropertyName:
                        rpcVersion = jsonReader.GetString();
                        break;

                    case JsonRpcContants.MethodPropertyName:
                        method = jsonReader.GetString();
                        break;

                    case JsonRpcContants.ParamsPropertyName:
                        RpcParameters ps;
                        switch (jsonReader.TokenType)
                        {
                        case JsonTokenType.StartArray:
                            jsonReader.Read();
                            var list = new List <IRpcParameter>();
                            while (jsonReader.TokenType != JsonTokenType.EndArray)
                            {
                                IRpcParameter parameter = this.GetParameter(ref jsonReader, bytes);
                                list.Add(parameter);
                            }
                            //TODO array vs list?
                            ps = new RpcParameters(list.ToArray());
                            break;

                        case JsonTokenType.StartObject:
                            jsonReader.Read();
                            var dict = new Dictionary <string, IRpcParameter>();
                            while (jsonReader.TokenType != JsonTokenType.EndObject)
                            {
                                string key = jsonReader.GetString();
                                jsonReader.Read();
                                IRpcParameter parameter = this.GetParameter(ref jsonReader, bytes);
                                dict.Add(key, parameter);
                            }
                            ps = new RpcParameters(dict);
                            break;

                        default:
                            return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, "The request parameter format is invalid.")));
                        }
                        parameters = ps;
                        break;
                    }
                    jsonReader.Read();
                }

                if (string.IsNullOrWhiteSpace(method))
                {
                    return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, "The request method is required.")));
                }
                if (string.IsNullOrWhiteSpace(rpcVersion))
                {
                    return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, "The jsonrpc version must be specified.")));
                }
                if (!string.Equals(rpcVersion, "2.0", StringComparison.OrdinalIgnoreCase))
                {
                    return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, $"The jsonrpc version '{rpcVersion}' is not supported. Supported versions: '2.0'")));
                }

                return(RpcRequestParseResult.Success(id, method !, parameters));
            }
            catch (Exception ex)
            {
                RpcError error;
                if (ex is RpcException rpcException)
                {
                    error = rpcException.ToRpcError(this.serverConfig.Value.ShowServerExceptions);
                }
                else
                {
                    error = new RpcError(RpcErrorCode.ParseError, "Failed to parse request.", ex);
                }
                return(RpcRequestParseResult.Fail(id, error));
            }
        }
Exemplo n.º 14
0
 /// <summary>
 /// Turns result data into a rpc response
 /// </summary>
 /// <param name="id">Rpc request id</param>
 /// <param name="serializer">Json serializer function to use for objects for the response</param>
 /// <returns>Rpc response for request</returns>
 public RpcResponse ToRpcResponse(RpcId id)
 {
     return(new RpcResponse(id, this.ReturnObject, this.ReturnObject?.GetType()));
 }
Exemplo n.º 15
0
 public override void forward(RpcId rpcId, params object[] args)
 {
     this.isForwarded = true;
     this.rpcId       = rpcId;
     this.paramCount  = args.Length;
 }
Exemplo n.º 16
0
 /// <param name="id">Request id</param>
 /// <param name="error">Request error</param>
 public RpcResponse(RpcId id, RpcError error) : this(id)
 {
     this.Error = error;
 }
Exemplo n.º 17
0
        /// <summary>
        /// Turns result data into a rpc response
        /// </summary>
        /// <param name="id">Rpc request id</param>
        /// <param name="serializer">Json serializer function to use for objects for the response</param>
        /// <returns>Rpc response for request</returns>
        public RpcResponse ToRpcResponse(RpcId id, Func <object, JToken> serializer)
        {
            JToken jToken = this.ReturnObject == null ? null : serializer(this.ReturnObject);

            return(new RpcResponse(id, jToken));
        }
Exemplo n.º 18
0
 private RpcRequestParseResult(RpcId id, RpcRequest request, RpcError error)
 {
     this.Id      = id;
     this.Request = request;
     this.Error   = error;
 }
Exemplo n.º 19
0
 public static RpcRequestParseResult Fail(RpcId id, RpcError error)
 {
     return(new RpcRequestParseResult(id, null, error));
 }
Exemplo n.º 20
0
        public RpcResponse DeserializeResponse(JToken token, IDictionary <RpcId, Type> typeMap)
        {
            JToken?idToken = token[JsonRpcContants.IdPropertyName];

            if (idToken == null)
            {
                throw new RpcClientParseException("Unable to parse request id.");
            }
            RpcId id;

            switch (idToken.Type)
            {
            case JTokenType.Null:
                id = new RpcId();
                break;

            case JTokenType.Integer:
                id = new RpcId(idToken.Value <long>());
                break;

            case JTokenType.String:
            case JTokenType.Guid:
                id = new RpcId(idToken.Value <string>());
                break;

            default:
                throw new RpcClientParseException("Unable to parse rpc id as string or integer.");
            }
            if (!typeMap.TryGetValue(id, out Type type))
            {
                throw new RpcClientParseException("Unable to detect result type, cannot deserialize.");
            }
            JToken?errorToken = token[JsonRpcContants.ErrorPropertyName];

            if (errorToken != null && errorToken.HasValues)
            {
                int    code      = errorToken.Value <int>(JsonRpcContants.ErrorCodePropertyName);
                string message   = errorToken.Value <string>(JsonRpcContants.ErrorMessagePropertyName);
                JToken?dataToken = errorToken[JsonRpcContants.ErrorDataPropertyName];

                object?data = null;
                if (dataToken != null)
                {
                    if (this.errorTypes != null && this.errorTypes.TryGetValue(code, out Type errorCodeType))
                    {
                        data = dataToken.ToObject(errorCodeType);
                    }
                    else
                    {
                        data = dataToken.ToString();
                    }
                }
                var error = new RpcError(code, message, data: data);
                return(new RpcResponse(id, error));
            }
            else
            {
                object?result;
                if (this.jsonSerializerSettings == null)
                {
                    result = token[JsonRpcContants.ResultPropertyName]?.ToObject(type);
                }
                else
                {
                    //TODo cache serializer?
                    JsonSerializer serializer = JsonSerializer.Create(this.jsonSerializerSettings);
                    result = token[JsonRpcContants.ResultPropertyName]?.ToObject(type, serializer);
                }
                return(new RpcResponse(id, result));
            }
        }
Exemplo n.º 21
0
 public RpcRequest(RpcId id, string method, RpcParameters?parameters = null)
 {
     this.Id         = id;
     this.Method     = method;
     this.Parameters = parameters;
 }
Exemplo n.º 22
0
        /// <summary>
        /// Turns result data into a rpc response
        /// </summary>
        /// <param name="id">Rpc request id</param>
        /// <param name="serializer">Json serializer function to use for objects for the response</param>
        /// <returns>Rpc response for request</returns>
        public RpcResponse ToRpcResponse(RpcId id)
        {
            RpcError error = new RpcError(this.ErrorCode, this.Message, this.Data);

            return(new RpcResponse(id, error));
        }
Exemplo n.º 23
0
 /// <summary>
 /// Turns result data into a rpc response
 /// </summary>
 /// <param name="id">Rpc request id</param>
 /// <param name="serializer">Json serializer function to use for objects for the response</param>
 /// <returns>Rpc response for request</returns>
 public RpcResponse ToRpcResponse(RpcId id)
 {
     return(new RpcResponse(id, this.ReturnObject));
 }
Exemplo n.º 24
0
 public RpcResponse <T> GetResponse <T>(RpcId id)
 {
     return(RpcResponse <T> .FromResponse(this.responses[id]));
 }
Exemplo n.º 25
0
 public RpcResponse(RpcId id, T result)
     : base(id, result)
 {
 }
Exemplo n.º 26
0
 public RpcResponse(RpcId id, RpcError error)
     : base(id, error)
 {
 }
Exemplo n.º 27
0
 /// <param name="id">Request id</param>
 protected RpcResponse(RpcId id)
 {
     this.Id = id;
 }
Exemplo n.º 28
0
        private RpcRequestParseResult ParseResult(JsonElement.ObjectEnumerator objectEnumerator)
        {
            RpcId         id         = default;
            string?       method     = null;
            RpcParameters?parameters = null;
            string?       rpcVersion = null;

            try
            {
                foreach (JsonProperty property in objectEnumerator)
                {
                    switch (property.Name)
                    {
                    case JsonRpcContants.IdPropertyName:
                        switch (property.Value.ValueKind)
                        {
                        case JsonValueKind.String:
                            id = new RpcId(property.Value.GetString());
                            break;

                        case JsonValueKind.Number:
                            if (!property.Value.TryGetInt64(out long longId))
                            {
                                var idError = new RpcError(RpcErrorCode.ParseError, "Unable to parse rpc id as an integer");
                                return(RpcRequestParseResult.Fail(id, idError));
                            }
                            id = new RpcId(longId);
                            break;

                        default:
                            var error = new RpcError(RpcErrorCode.ParseError, "Unable to parse rpc id as a string or an integer");
                            return(RpcRequestParseResult.Fail(id, error));
                        }
                        break;

                    case JsonRpcContants.VersionPropertyName:
                        rpcVersion = property.Value.GetString();
                        break;

                    case JsonRpcContants.MethodPropertyName:
                        method = property.Value.GetString();
                        break;

                    case JsonRpcContants.ParamsPropertyName:
                        RpcParameters ps;
                        switch (property.Value.ValueKind)
                        {
                        case JsonValueKind.Array:
                            IRpcParameter[] items = property.Value
                                                    .EnumerateArray()
                                                    .Select(this.GetParameter)
                                                    .Cast <IRpcParameter>()
                                                    .ToArray();
                            //TODO array vs list?
                            ps = new RpcParameters(items);
                            break;

                        case JsonValueKind.Object:
                            Dictionary <string, IRpcParameter> dict = property.Value
                                                                      .EnumerateObject()
                                                                      .ToDictionary(j => j.Name, j => (IRpcParameter)this.GetParameter(j.Value));
                            ps = new RpcParameters(dict);
                            break;

                        default:
                            return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, "The request parameter format is invalid.")));
                        }
                        parameters = ps;
                        break;
                    }
                }

                if (string.IsNullOrWhiteSpace(method))
                {
                    return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, "The request method is required.")));
                }
                if (string.IsNullOrWhiteSpace(rpcVersion))
                {
                    return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, "The jsonrpc version must be specified.")));
                }
                if (!string.Equals(rpcVersion, "2.0", StringComparison.OrdinalIgnoreCase))
                {
                    return(RpcRequestParseResult.Fail(id, new RpcError(RpcErrorCode.InvalidRequest, $"The jsonrpc version '{rpcVersion}' is not supported. Supported versions: '2.0'")));
                }

                return(RpcRequestParseResult.Success(id, method !, parameters));
            }
            catch (Exception ex)
            {
                RpcError error;
                if (ex is RpcException rpcException)
                {
                    error = rpcException.ToRpcError(this.serverConfig.Value.ShowServerExceptions);
                }
                else
                {
                    error = new RpcError(RpcErrorCode.ParseError, "Failed to parse request.", ex);
                }
                return(RpcRequestParseResult.Fail(id, error));
            }
        }
Exemplo n.º 29
0
 /// <param name="id">Request id</param>
 /// <param name="result">Response result object</param>
 public RpcResponse(RpcId id, object?result) : this(id)
 {
     this.Result = result;
 }
Exemplo n.º 30
0
        public RpcResponse DeserializeResponse(JToken token, Func <RpcId, Type> resultTypeResolver = null)
        {
            RpcId  id      = null;
            JToken idToken = token[JsonRpcContants.IdPropertyName];

            if (idToken == null)
            {
                throw new RpcClientParseException("Unable to parse request id.");
            }
            switch (idToken.Type)
            {
            case JTokenType.Null:
                break;

            case JTokenType.Integer:
            case JTokenType.Float:
                id = new RpcId(idToken.Value <double>());
                break;

            case JTokenType.String:
            case JTokenType.Guid:
                id = new RpcId(idToken.Value <string>());
                break;

            default:
                throw new RpcClientParseException("Unable to parse rpc id as string or number.");
            }
            JToken errorToken = token[JsonRpcContants.ErrorPropertyName];

            if (errorToken != null && errorToken.HasValues)
            {
                int    code      = errorToken.Value <int>(JsonRpcContants.ErrorCodePropertyName);
                string message   = errorToken.Value <string>(JsonRpcContants.ErrorMessagePropertyName);
                JToken dataToken = errorToken[JsonRpcContants.ErrorDataPropertyName];

                object data = null;
                if (dataToken != null)
                {
                    data = this.errorDataSerializer.Deserialize(code, dataToken.ToString());
                }
                var error = new RpcError(code, message, data: data);
                return(new RpcResponse(id, error));
            }
            else
            {
                Type   resultType = resultTypeResolver?.Invoke(id);
                object result;
                if (resultType == null)
                {
                    //dont deserialize
                    //TODO tostring?
                    result = token[JsonRpcContants.ResultPropertyName].ToString();
                }
                else if (this.jsonSerializerSettings == null)
                {
                    result = token[JsonRpcContants.ResultPropertyName].ToObject(resultType);
                }
                else
                {
                    //TODo cache serializer?
                    JsonSerializer serializer = JsonSerializer.Create(this.jsonSerializerSettings);
                    result = token[JsonRpcContants.ResultPropertyName].ToObject(resultType, serializer);
                }
                return(new RpcResponse(id, result, resultType));
            }
        }