Пример #1
0
 public void Handle(HttpRequest req, HttpResponse resp, JsonRpcHandler jsonRpcHandler)
 {
     if(req.HttpMethod != "POST")
     {
         resp.Status = "405 Method Not Allowed";
         return;
     }
     if(!req.ContentType.StartsWith("application/json"))
     {
         resp.Status = "415 Unsupported Media Type";
         return;
     }
     JToken json;
     try
     {
         json = JToken.ReadFrom(new JsonTextReader(req.Content));
     }
     catch(Exception e)
     {
         resp.Status = "400 Bad Request";
         resp.ContentType = "text/plain";
         resp.Content.WriteLine(e);
         return;
     }
     resp.Status = "200 OK";
     resp.ContentType = "application/json";
     using(var jsonWriter = new JsonTextWriter(resp.Content))
     {
         new JsonSerializer().Serialize(jsonWriter, jsonRpcHandler.Handle(json));
     }
 }
Пример #2
0
 private JsonRpcHandler WrapWithExceptionHandling(JsonRpcHandler handler)
 {
     return((JsonRequest req) =>
     {
         try
         {
             return handler(req);
         }
         catch (JsonRpcException ex)
         {
             return new JsonResponse
             {
                 Id = req.Id,
                 Error = ex
             };
         }
         catch (Exception ex)
         {
             _log($"Error from request {JsonConvert.SerializeObject(req)}: {ex}");
             return new JsonResponse
             {
                 Id = req.Id,
                 Error = new JsonRpcException(-1, ex.Message, null)
             };
         }
     });
 }
Пример #3
0
 public void SetUp()
 {
     _rpcConfiguration = MockRepository.GenerateStub<IRpcConfiguration>();
     _parametersParser = MockRepository.GenerateStub<ParametersParser>();
     _methodInvoker = MockRepository.GenerateStub<MethodInvoker>();
     _rpcHandlerInterceptor = MockRepository.GenerateStub<RpcHandlerInterceptor>();
     _target = new JsonRpcHandler(_parametersParser, _rpcConfiguration, _methodInvoker, _rpcHandlerInterceptor);
 }
 public void SetUp()
 {
     _jsonRpcHandler = MockRepository.GenerateStub<JsonRpcHandler>(null, null, null, null);
     _target = new JsonRpcHttpHandler();
     _responseContent = new StringBuilder();
     _httpResponse = new HttpResponse {
         Content = new StringWriter(_responseContent)
     };
 }
Пример #5
0
        /// <summary>
        /// Register all methods on <paramref name="serviceInstance"/> which match
        /// our JSON-RPC method convention (one parameter and one return value).
        /// The methods will be namespaced using <paramref name="serviceName"/>,
        /// so incoming requests should have method="serviceName.MethodName".
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="serviceInstance"></param>
        public void Register(string serviceName, object serviceInstance)
        {
            var serviceType = serviceInstance.GetType();
            var methods     = serviceType.GetMethods(BindingFlags.Instance | BindingFlags.Public)
                              .Where(m => m.GetParameters().Count() == 1 &&
                                     m.ReturnType != null);

            foreach (var method in methods)
            {
                var parameterType = method.GetParameters().First().ParameterType;

                JsonRpcHandler handler = (JsonRequest req) =>
                {
                    _log("Got request: " + JsonConvert.SerializeObject(req));


                    JToken jParameter = (req.Params as JArray)?.First;
                    if (jParameter == null)
                    {
                        return(ErrorResponse(req.Id, -32602, "params must be an array with a single item or an object"));
                    }

                    var param = jParameter.ToObject(parameterType);

                    var result = method.Invoke(serviceInstance, new[] { param });

                    var response = new JsonResponse
                    {
                        Id     = req.Id,
                        Result = result
                    };

                    return(response);
                };

                var methodName = serviceName + "." + method.Name;

                Register(methodName, handler);
            }
        }
Пример #6
0
 /// <summary>
 /// Register a handler to be executed whenever we get a request for a method name.
 /// </summary>
 /// <param name="fullyQualifiedMethodName"></param>
 /// <param name="handler"></param>
 public void Register(string fullyQualifiedMethodName, JsonRpcHandler handler)
 {
     _handlers[fullyQualifiedMethodName] = WrapWithExceptionHandling(handler);
 }