using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using AngleSharp; using AngleSharp.Dom; using System.Net.Http; using System.Net.Http.Headers; using AngleSharp.Html; namespace Ksp.WebServer.Controllers { [ApiController] [Route("grafik")] public class GrafikPageController : ControllerBase { private readonly ILogger logger; private readonly IWebHostEnvironment env; public GrafikPageController( ILogger logger, IWebHostEnvironment env) { this.env = env; this.logger = logger; } async Task FetchBlankPage() { var c = new HttpClient(); var rq = new HttpRequestMessage(HttpMethod.Get, "https://ksp-test.ks.matfyz.cz/blank"); rq.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html")); rq.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xhtml+xml")); rq.Headers.Authorization = new AuthenticationHeaderValue("Basic", "SECRET"); if (HttpContext.Request.Headers.TryGetValue("Cookie", out var x)) rq.Headers.Add("Cookie", x.AsEnumerable()); var rs = await c.SendAsync(rq); return await rs.Content.ReadAsStringAsync(); } [HttpGet] public async Task Get() { var grafikPage = await System.IO.File.ReadAllTextAsync(Path.Combine(env.ContentRootPath, "../../frontend/public/grafik.html")); var p = new AngleSharp.Html.Parser.HtmlParser(); var grafik = p.ParseDocument(grafikPage); var kspTemplate = p.ParseDocument(await FetchBlankPage()); var innerBody = grafik.Body; innerBody.Replace(kspTemplate.Body); var page = grafik.Body.QuerySelector("#page"); page.Replace(innerBody.ChildNodes.ToArray()); foreach(var headElement in kspTemplate.Head.QuerySelectorAll("link, script")) { headElement.RemoveFromParent(); grafik.Head.AppendChild(headElement); } var outputHtml = new StringWriter(); grafik.ToHtml(outputHtml, new PrettyMarkupFormatter() { Indentation = "\t", NewLine = "\n" }); return this.Content(outputHtml.ToString(), "text/html"); } } }