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)); } }
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) }; } }); }
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) }; }
/// <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); } }
/// <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); }