예제 #1
0
        private static void ExecuteCommand(HttpMessageData data, Command command)
        {
            command.Execute(data);

            if (!data.CompletionSource.Task.Wait(TimeSpan.FromSeconds(30)))
            {
                throw new CoflnetException("timeout", "could not generate a response, please report this and try again");
            }
        }
예제 #2
0
        private async Task HandleCommand(RequestContext context)
        {
            HttpMessageData data = new HttpMessageData(context);
            try
            {
                /*var conId = req.Headers["ConId"];
                if (conId == null || conId.Length < 32)
                    throw new CoflnetException("invalid_conid", "The 'ConId' Header has to be at least 32 characters long and generated randomly");
                conId = conId.Truncate(32);
                data.SetUserId = id =>
                {
                    this.ConnectionToUserId.TryAdd(conId, id);
                };

                if (ConnectionToUserId.TryGetValue(conId, out int userId))
                    data.UserId = userId;

                if (data.Type == "test")
                {
                    Console.WriteLine(req.RemoteEndPoint.Address.ToString());
                    foreach (var item in req.Headers.AllKeys)
                    {
                        Console.WriteLine($"{item.ToString()}: {req.Headers[item]}");
                    }
                    return;
                } */

                if ((await CacheService.Instance.TryFromCacheAsync(data)).HasFlag(CacheStatus.VALID))
                    return;

                /*  var ip = req.Headers["Cf-Connecting-Ip"];
                  if(ip == null)
                      ip = req.Headers["X-Real-Ip"];
                  if(ip == null)
                      ip = req.RemoteEndPoint.Address.ToString();
                  Console.WriteLine($"rc {data.Type} {data.Data.Truncate(20)}");
                  await Limiter.WaitUntilAllowed(ip); */
                Console.Write($"r {data.Type} {data.Data.Truncate(15)} ");
                //ExecuteCommandWithCache
                if (SkyblockBackEnd.Commands.TryGetValue(data.Type, out Command command))
                {
                    try
                    {
                        ExecuteCommand(data, command);
                        return;
                    }
                    catch (CoflnetException ex)
                    {
                        context.SetStatusCode(400);
                        await context.WriteAsync(JsonConvert.SerializeObject(new { ex.Slug, ex.Message }));
                    }
                    catch (Exception e)
                    {
                        if (e.InnerException is CoflnetException ex)
                        {
                            context.SetStatusCode(400);
                            await context.WriteAsync(JsonConvert.SerializeObject(new { ex.Slug, ex.Message }));

                        }
                        else
                        {
                            Console.WriteLine("holly shit");
                            data.CompletionSource.TrySetException(e);
                            dev.Logger.Instance.Error(e);
                            throw e;
                        }
                    }
                }
                else
                    throw new CoflnetException("unkown_command", "Command not known, check the docs");
            }
            catch (CoflnetException ex)
            {
                context.SetStatusCode(400);
                await context.WriteAsync(JsonConvert.SerializeObject(new { ex.Slug, ex.Message }));
            }
            catch (Exception ex)
            {
                context.SetStatusCode(500);
                await data.SendBack(new MessageData("error", JsonConvert.SerializeObject(new { Slug = "error", Message = "An unexpected internal error occured, make sure the format of Data is correct" })));
                TrackingService.Instance.CommandError(data.Type);
                dev.Logger.Instance.Error($"Fatal error on Command {JsonConvert.SerializeObject(data)} {ex.Message} {ex.StackTrace}\n {ex.InnerException?.Message} {ex.InnerException?.StackTrace}");
            }
        }