Beispiel #1
0
        /// <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;
            }
        }
Beispiel #2
0
 public JsonRpcProxy(ADOQueryExecutor executor) : base()
 {
     Finished = false;
     Executor = executor;
 }