public void SetJsonImporter()
        {
            JsonRpcDispatcher dispatcher = new JsonRpcDispatcher(new TestService());
            JsonImportHandler importer   = new JsonImportHandler(new ImportContext().Import);

            dispatcher.JsonImporter = importer;
            Assert.AreSame(importer, dispatcher.JsonImporter);
        }
Beispiel #2
0
        private static object ReadParameters(Method method, JsonReader reader, JsonImportHandler importer)
        {
            Debug.Assert(method != null);
            Debug.Assert(reader != null);
            Debug.Assert(importer != null);

            reader.MoveToContent();

            Parameter[] parameters = method.GetParameters();

            if (reader.TokenClass == JsonTokenClass.Array)
            {
                reader.Read();
                ArrayList argList = new ArrayList(parameters.Length);

                for (int i = 0; i < parameters.Length && reader.TokenClass != JsonTokenClass.EndArray; i++)
                {
                    argList.Add(importer(parameters[i].ParameterType, reader));
                }

                reader.StepOut();
                return(argList.ToArray());
            }
            else if (reader.TokenClass == JsonTokenClass.Object)
            {
                reader.Read();
                JsonObject argByName = new JsonObject();

                while (reader.TokenClass != JsonTokenClass.EndObject)
                {
                    // TODO: Imporve this lookup.
                    // FIXME: Does not work when argument is positional.

                    Type   parameterType = AnyType.Value;
                    string name          = reader.ReadMember();

                    foreach (Parameter parameter in parameters)
                    {
                        if (CaselessString.Equals(parameter.Name, name))
                        {
                            parameterType = parameter.ParameterType;
                            break;
                        }
                    }

                    argByName.Put(name, importer(parameterType, reader));
                }

                reader.Read();
                return(argByName);
            }
            else
            {
                return(importer(AnyType.Value, reader));
            }
        }
Beispiel #3
0
        protected virtual IDictionary ParseRequest(JsonReader input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }

            JsonReader        reader   = input; // alias for clarity
            JsonImportHandler importer = JsonImporter;

            JsonObject request      = new JsonObject();
            Method     method       = null;
            JsonReader paramsReader = null;
            object     args         = null;

            try
            {
                reader.ReadToken(JsonTokenClass.Object);

                while (reader.TokenClass != JsonTokenClass.EndObject)
                {
                    string memberName = reader.ReadMember();

                    switch (memberName)
                    {
                    case "id":
                    {
                        request["id"] = importer(AnyType.Value, reader);
                        break;
                    }

                    case "method":
                    {
                        string methodName = reader.ReadString();
                        request["method"] = methodName;
                        method            = Service.GetClass().GetMethodByName(methodName);

                        if (paramsReader != null)
                        {
                            //
                            // If the parameters were already read in and
                            // buffer, then deserialize them now that we know
                            // the method we're dealing with.
                            //

                            args         = ReadParameters(method, paramsReader, importer);
                            paramsReader = null;
                        }

                        break;
                    }

                    case "params":
                    {
                        //
                        // Is the method already known? If so, then we can
                        // deserialize the parameters right away. Otherwise
                        // we record them until hopefully the method is
                        // encountered.
                        //

                        if (method != null)
                        {
                            args = ReadParameters(method, reader, importer);
                        }
                        else
                        {
                            JsonRecorder recorder = new JsonRecorder();
                            recorder.WriteFromReader(reader);
                            paramsReader = recorder.CreatePlayer();
                        }

                        break;
                    }

                    default:
                    {
                        reader.Skip();
                        break;
                    }
                    }
                }

                reader.Read();

                if (args != null)
                {
                    request["params"] = args;
                }

                return(request);
            }
            catch (JsonException e)
            {
                throw new BadRequestException(e.Message, e, request);
            }
            catch (MethodNotFoundException e)
            {
                throw new BadRequestException(e.Message, e, request);
            }
        }
        private static object ReadParameters(Method method, JsonReader reader, JsonImportHandler importer)
        {
            Debug.Assert(method != null);
            Debug.Assert(reader != null);
            Debug.Assert(importer != null);

            reader.MoveToContent();

            Parameter[] parameters = method.GetParameters();

            if (reader.TokenClass == JsonTokenClass.Array)
            {
                reader.Read();
                ArrayList argList = new ArrayList(parameters.Length);

                for (int i = 0; i < parameters.Length && reader.TokenClass != JsonTokenClass.EndArray; i++)
                    argList.Add(importer(parameters[i].ParameterType, reader));

                reader.StepOut();
                return argList.ToArray();
            }
            else if (reader.TokenClass == JsonTokenClass.Object)
            {
                reader.Read();
                JsonObject argByName = new JsonObject();

                while (reader.TokenClass != JsonTokenClass.EndObject)
                {
                    // TODO: Imporve this lookup.
                    // FIXME: Does not work when argument is positional.

                    Type parameterType = AnyType.Value;
                    string name = reader.ReadMember();

                    foreach (Parameter parameter in parameters)
                    {
                        if (CaselessString.Equals(parameter.Name, name))
                        {
                            parameterType = parameter.ParameterType;
                            break;
                        }
                    }

                    argByName.Put(name, importer(parameterType, reader));
                }

                reader.Read();
                return argByName;
            }
            else
            {
                return importer(AnyType.Value, reader);
            }
        }
Beispiel #5
0
 public void SetJsonImporter()
 {
     JsonRpcDispatcher dispatcher = new JsonRpcDispatcher(new TestService());
     JsonImportHandler importer = new JsonImportHandler(new ImportContext().Import);
     dispatcher.JsonImporter = importer;
     Assert.AreSame(importer, dispatcher.JsonImporter);
 }