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