/// <summary> /// Runs the RPC server, until it receives a call of the "quit" method. /// </summary> public void Run(ADOQueryExecutor executor) { var proxy = new JsonRpcProxy(executor); Config.SetPostProcessHandler((JsonRequest request, JsonResponse response, object context) => { if (response.Error != null) { var innerException = (response.Error.data as Exception); var errorData = new Dictionary <string, string>(); errorData["stacktrace"] = innerException.StackTrace; response.Error = new JsonRpcException(-32603, innerException.Message, errorData); } return(null); }); var listener = new HttpListener(); listener.Prefixes.Add(Endpoint); listener.Start(); try { executor.Open(); while (!proxy.Finished) { var context = listener.GetContext(); AddCORSHeaders(context); if (context.Request.HttpMethod == "OPTIONS") { context.Response.StatusCode = 200; context.Response.StatusDescription = "OK"; context.Response.ContentLength64 = 0; context.Response.OutputStream.Close(); Console.WriteLine("Processing CORS OPTIONS request"); continue; } if (context.Request.HttpMethod != "POST") { context.Response.StatusCode = 405; context.Response.StatusDescription = "Illegal Method"; context.Response.OutputStream.Close(); Console.WriteLine("Invalid request method: {}", context.Request.HttpMethod); continue; } if (context.Request.Url.PathAndQuery != "/") { context.Response.StatusCode = 404; context.Response.StatusDescription = "Not Found"; context.Response.OutputStream.Close(); Console.WriteLine("Invalid request path: {}", context.Request.Url.PathAndQuery); continue; } if (context.Request.ContentType != "application/json") { context.Response.StatusCode = 400; context.Response.StatusDescription = "Illegal Content Type"; context.Response.OutputStream.Close(); Console.WriteLine("Invalid request Content-Type: {}", context.Request.ContentType); continue; } context.Response.ContentType = "application/json"; var inputBuffer = new byte[context.Request.ContentLength64]; var offset = 0L; while (offset != context.Request.ContentLength64) { offset += context.Request.InputStream.Read(inputBuffer, (int)offset, (int)(context.Request.ContentLength64 - offset)); } var input = Encoding.UTF8.GetString(inputBuffer); JsonRpcProcessor .Process(input) .ContinueWith(result => { SetOutputContent(context.Response, result.Result); }) .Wait(); } } catch (Exception) { Console.WriteLine("Terminating web server"); listener.Stop(); executor.Close(); throw; } }
public JsonRpcProxy(ADOQueryExecutor executor) : base() { Finished = false; Executor = executor; }