using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Net.Http.Headers; namespace CSS_Solution.Request { internal class Login : IRequest { Action success; Action failed; string? getCode_url; string? login_url; string? code; string? JSESSIONID; Task task; List> respond_cookie = new List>(); readonly int id; public Request_Type request_type => Request_Type.login; public Login(int _id, Get_Index_Result last_result, Action _success, Action _failed) { id = _id; success = _success; failed = _failed; getCode_url = Initialize.configuration?.GetSection("getcode").Value; if (getCode_url == null || getCode_url.Length == 0) throw new ConfigurationErrorsException("Can't get getcode url from AppSettings.json"); login_url = Initialize.configuration?.GetSection("login_index").Value; if (login_url == null || login_url.Length == 0) throw new ConfigurationErrorsException("Can't get login_index url from AppSettings.json"); if (last_result.RND == null || last_result.JSESSIONID == null) throw new InvalidOperationException("Something wrong with Get_Index result"); JSESSIONID = last_result.JSESSIONID; task = new Task(async () => { try { { HttpClient client = Initialize.hc_pool.GetHttpClient(Request_Type.get_code); HttpRequestMessage code_request_Message = new HttpRequestMessage(HttpMethod.Post, getCode_url); code_request_Message.Headers.Add("Cookie", JSESSIONID); foreach (var (key, value) in Settings.getCode_Header.Get_Request_header()) code_request_Message.Headers.Add(key, value); code_request_Message.Content = new FormUrlEncodedContent([new KeyValuePair("webfinger", Settings.webfinger.Get_webfinger().Item2)]); code_request_Message.Content.Headers.ContentType = new MediaTypeHeaderValue(Settings.getCode_Header.Content_Type); code_request_Message.Content.Headers.ContentLength = int.Parse(Settings.getCode_Header.Content_Length); HttpResponseMessage code_message = await client.SendAsync(code_request_Message); code_message.EnsureSuccessStatusCode(); code = await code_message.Content.ReadAsStringAsync(); } { HttpClient client = Initialize.hc_pool.GetHttpClient(request_type); HttpRequestMessage login_request_Message = new HttpRequestMessage(HttpMethod.Post, login_url); login_request_Message.Headers.Add("Cookie", JSESSIONID); foreach (var (key, value) in Settings.login_Header.Get_Request_header()) login_request_Message.Headers.Add(key, value); List> request_body = Settings.login_Body.Get_Request_body(last_result.RND, code); login_request_Message.Content = new FormUrlEncodedContent(request_body); login_request_Message.Content.Headers.ContentType = new MediaTypeHeaderValue(Settings.login_Header.Content_Type); HttpResponseMessage message = await client.SendAsync(login_request_Message); message.EnsureSuccessStatusCode(); string ans = await message.Content.ReadAsStringAsync(); foreach (var header in message.Headers) { if (header.Key != "Set-Cookie") continue; foreach (var item in header.Value) foreach (var item1 in item.Split("; ")) { string[] Key_ValuePair = item1.Split('='); if (Key_ValuePair.Length != 2) continue; respond_cookie.Add(new KeyValuePair(Key_ValuePair[0], Key_ValuePair[1])); } } } } catch (Exception ex) { failed(id, ex, null); } success(id); }); } public List>? Get_cookie() => respond_cookie; public Task Run() { task.Start(); return task; } internal int Get_Id() => id; public string Get_JSESSIONID() => JSESSIONID ?? ""; } }