private static async Task MainAsync(VirtualJudgeMetadata metadata, VirtualJudgeAccount account) { var token = await GetOnlineJudgeLoginToken(account); await GetCredantial(token); var csrf = await GetCsrfToken(metadata.ProblemId); var statusId = await SendToJudge(metadata, csrf); if (statusId.Item1 == -1) { WriteResultFile(new VirtualJudgeResult { Hint = statusId.Item2, Result = "CompileError" }); } else { var result = await PollResult(statusId.Item1); WriteResultFile(result); } }
private static async Task <(int, string)> SendToJudge(VirtualJudgeMetadata metadata, string csrf) { var problemPageUri = ProblemEndpoint.Replace("{PROBLEMID}", metadata.ProblemId); var content = new FormUrlEncodedContent(new Dictionary <string, string> { { "id", metadata.ProblemId }, { "code", metadata.Code }, { "format", ParseLanguage(metadata.Language) }, { "csrfmiddlewaretoken", csrf } }); var req = new HttpRequestMessage(HttpMethod.Post, JudgeEndpoint) { Content = content, }; // the following headers are just for redundant in case of future changes // it's not necessary, for now req.Headers.TryAddWithoutValidation("Referer", BaseUrl + problemPageUri + "/"); req.Headers.TryAddWithoutValidation("X-Requested-With", "XMLHttpRequest"); req.Headers.TryAddWithoutValidation("Host", "codevs.cn"); req.Headers.TryAddWithoutValidation("Origin", BaseUrl); send: try { using (var response = await _client.SendAsync(req)) { var text = await response.Content.ReadAsStringAsync(); var json = JsonConvert.DeserializeObject <dynamic>(text); if (json.success == false) { return(-1, json.message); } else { return(json.id, null); } } } catch (Exception ex) { await Task.Delay(1000); goto send; } }