using AngleSharp.Html.Dom; using AngleSharp.Html.Parser; using Rac.Tools; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Mime; using System.Text; namespace Rac.Models { internal class Response { public HttpStatusCode StatusCode { get; set; } public string StatusDescription { get; set; } public WebHeaderCollection Headers { get; set; } public byte[] Body { get; set; } public string ContentType => Headers?["content-type"]; public bool GetHtmlDocument(out IHtmlDocument html) { var contentType = ContentType; if (null == contentType) { html = null; return false; } var ct = new ContentType(contentType); if (ct.MediaType != "text/html") { html = null; return false; } using var stream = new MemoryStream(Body); var doc = new HtmlParser().ParseDocument(stream); html = doc; return true; } public HttpHeader[] GetServerTimeHeaders() { var lst = new List(2); var last = Headers?["last-modified"]; var date = Headers?["date"]; if (false == string.IsNullOrEmpty(last)) lst.Add(new HttpHeader("last-modified", last)); if (false == string.IsNullOrEmpty(date)) lst.Add(new HttpHeader("date", date)); return lst.ToArray(); } public bool GetCss(out string css) { var contentType = ContentType; if (null == contentType) { css = null; return false; } var ct = new ContentType(contentType); if (ct.MediaType != "text/css") { css = null; return false; } var enc = Encoding.GetEncoding(ct.CharSet ?? "utf-8"); css = enc.GetString(Body); return true; } public bool GetRedirect(out string redirectUrl) { if (false == StatusCode.In(HttpStatusCode.TemporaryRedirect, HttpStatusCode.Redirect, HttpStatusCode.Moved)) { redirectUrl = null; return false; } redirectUrl = Headers["location"]; return true; } } }