Default Rpc parser that uses Newtonsoft.Json
Inheritance: IRpcParser
Exemplo n.º 1
0
 public void MatchesRpcRoute_DifferentRoutes_Valid(string requestUrl, string availableRouteName, bool shouldMatch)
 {
     IRpcRouteProvider routeProvider = new FakeRouteProvider();
     RouteCriteria routeCriteria = new RouteCriteria(typeof(ParserTests));
     routeProvider.RegisterRoute(routeCriteria, availableRouteName);
     DefaultRpcParser parser = new DefaultRpcParser(null);
     RpcRoute matchedRoute;
     bool isMatch = parser.MatchesRpcRoute(routeProvider, requestUrl, out matchedRoute);
     Assert.Equal(isMatch, shouldMatch);
     Assert.Equal(matchedRoute != null, shouldMatch);
 }
Exemplo n.º 2
0
        /// <summary>
        /// Parses all the requests from the json in the request
        /// </summary>
        /// <param name="jsonString">Json from the http request</param>
        /// <param name="jsonSerializerSettings">Json serialization settings that will be used in serialization and deserialization for rpc requests</param>
        /// <returns>List of Rpc requests that were parsed from the json</returns>
        public List <RpcRequest> ParseRequests(string jsonString, JsonSerializerSettings jsonSerializerSettings = null)
        {
            this.Logger?.LogDebug($"Attempting to parse Rpc request from the json string '{jsonString}'");
            List <RpcRequest> rpcRequests;

            if (string.IsNullOrWhiteSpace(jsonString))
            {
                throw new RpcInvalidRequestException("Json request was empty");
            }
            try
            {
                if (!DefaultRpcParser.IsSingleRequest(jsonString))
                {
                    rpcRequests = JsonConvert.DeserializeObject <List <RpcRequest> >(jsonString, jsonSerializerSettings);
                }
                else
                {
                    rpcRequests = new List <RpcRequest>();
                    RpcRequest rpcRequest = JsonConvert.DeserializeObject <RpcRequest>(jsonString, jsonSerializerSettings);
                    if (rpcRequest != null)
                    {
                        rpcRequests.Add(rpcRequest);
                    }
                }
            }
            catch (Exception ex) when(!(ex is RpcException))
            {
                string errorMessage = "Unable to parse json request into an rpc format.";

                this.Logger?.LogException(ex, errorMessage);
                throw new RpcInvalidRequestException(errorMessage);
            }

            if (rpcRequests == null || !rpcRequests.Any())
            {
                throw new RpcInvalidRequestException("No rpc json requests found");
            }
            this.Logger?.LogDebug($"Successfully parsed {rpcRequests.Count} Rpc request(s)");
            HashSet <object> uniqueIds = new HashSet <object>();

            foreach (RpcRequest rpcRequest in rpcRequests)
            {
                bool unique = uniqueIds.Add(rpcRequest.Id);
                if (!unique && rpcRequest.Id != null)
                {
                    throw new RpcInvalidRequestException("Duplicate ids in batch requests are not allowed");
                }
            }
            return(rpcRequests);
        }
Exemplo n.º 3
0
        public void ParseRequests_BatchRequest_Valid()
        {
            const string json = "[{\"jsonrpc\": \"2.0\", \"method\": \"one\", \"params\": [\"1\"], \"id\": \"1\"}, {\"jsonrpc\": \"2.0\", \"method\": \"two\", \"params\": [\"2\"], \"id\": \"2\"}]";

            DefaultRpcParser parser = new DefaultRpcParser(null);

            bool isBulkRequest;
            List<RpcRequest> rpcRequests = parser.ParseRequests(json, out isBulkRequest);

            Assert.NotNull(rpcRequests);
            Assert.Equal(rpcRequests.Count, 2);
            Assert.Equal(rpcRequests[0].Id, "1");
            Assert.Equal(rpcRequests[0].Method, "one");
            Assert.Equal(rpcRequests[0].JsonRpcVersion, JsonRpcContants.JsonRpcVersion);
            Assert.Equal(rpcRequests[0].ParameterList, new object[] { "1" });

            Assert.Equal(rpcRequests[1].Id, "2");
            Assert.Equal(rpcRequests[1].Method, "two");
            Assert.Equal(rpcRequests[1].JsonRpcVersion, JsonRpcContants.JsonRpcVersion);
            Assert.Equal(rpcRequests[1].ParameterList, new object[] { "2" });
            Assert.True(isBulkRequest);
        }
Exemplo n.º 4
0
        public void ParseRequests_Valid(string json, object id, string method, object[] parameters)
        {
            DefaultRpcParser parser = new DefaultRpcParser(null);

            bool isBulkRequest;
            RpcRequest rpcRequest = parser.ParseRequests(json, out isBulkRequest).FirstOrDefault();

            Assert.NotNull(rpcRequest);
            Assert.Equal(rpcRequest.Id, id);
            Assert.Equal(rpcRequest.Method, method);
            Assert.Equal(rpcRequest.JsonRpcVersion, JsonRpcContants.JsonRpcVersion);
            Assert.Equal(rpcRequest.ParameterList, parameters);
            Assert.Equal(false, isBulkRequest);
        }
Exemplo n.º 5
0
        public void ParseRequests_NullRequest_InvalidRequestException()
        {
            const string json = null;
            DefaultRpcParser parser = new DefaultRpcParser(null);

            bool isBulkRequest;
            Assert.Throws<RpcInvalidRequestException>(() => parser.ParseRequests(json, out isBulkRequest));
        }
Exemplo n.º 6
0
        public void ParseRequests_MissingVersion_InvalidRequestException()
        {
            const string json = "{\"method\": \"datetime\", \"params\": [\"2000-12-15T22:11:03\"], \"id\": \"1\"}";
            DefaultRpcParser parser = new DefaultRpcParser(null);

            bool isBulkRequest;
            Assert.Throws<RpcInvalidRequestException>(() => parser.ParseRequests(json, out isBulkRequest));
        }
Exemplo n.º 7
0
        public void ParseRequests_MissingParams_NoException()
        {
            const string json = "{\"method\": \"datetime\",\"jsonrpc\": \"2.0\", \"id\": \"1\"}";
            DefaultRpcParser parser = new DefaultRpcParser(null);

            bool isBulkRequest;
            parser.ParseRequests(json, out isBulkRequest);
            Assert.Equal(false, isBulkRequest);
        }
Exemplo n.º 8
0
        public void ParseRequests_MissingId_NoException()
        {
            const string json = "{\"method\": \"datetime\", \"jsonrpc\": \"2.0\", \"params\": [\"2000-12-15T22:11:03\"]}";
            DefaultRpcParser parser = new DefaultRpcParser(null);

            bool isBulkRequest;
            parser.ParseRequests(json, out isBulkRequest);
            Assert.Equal(false, isBulkRequest);
        }
Exemplo n.º 9
0
        public void ParseRequests_DateTime_Valid()
        {
            const string json = "{\"jsonrpc\": \"2.0\", \"method\": \"datetime\", \"params\": [\"2000-12-15T22:11:03\"], \"id\": 1}";
            DateTime dateTime = DateTime.Parse("2000-12-15T22:11:03");
            DefaultRpcParser parser = new DefaultRpcParser(null);

            bool isBulkRequest;
            RpcRequest rpcRequest = parser.ParseRequests(json, out isBulkRequest).FirstOrDefault();

            Assert.NotNull(rpcRequest);
            Assert.Equal(rpcRequest.Id, (long)1);
            Assert.Equal(rpcRequest.Method, "datetime");
            Assert.Equal(rpcRequest.JsonRpcVersion, JsonRpcContants.JsonRpcVersion);
            Assert.Equal(rpcRequest.ParameterList, new object[] { dateTime });
            Assert.False(isBulkRequest);
        }