// Uncomment to force TweetDeck to load a predefined version of the vendor/bundle scripts and stylesheets // #define FREEZE_TWEETDECK_RESOURCES using System.Collections.Specialized; using CefSharp; using CefSharp.Handler; using TweetDuck.Core.Handling.General; using TweetDuck.Core.Utils; #if FREEZE_TWEETDECK_RESOURCES using System.Collections.Generic; using System.Diagnostics; using System.Text.RegularExpressions; #endif namespace TweetDuck.Core.Handling{ class RequestHandlerBase : DefaultRequestHandler{ private readonly bool autoReload; public RequestHandlerBase(bool autoReload){ this.autoReload = autoReload; } public override bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture){ return LifeSpanHandler.HandleLinkClick(browserControl, targetDisposition, targetUrl); } public override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){ if (BrowserUtils.HasDevTools){ NameValueCollection headers = request.Headers; headers.Remove("x-devtools-emulate-network-conditions-client-id"); request.Headers = headers; } return base.OnBeforeResourceLoad(browserControl, browser, frame, request, callback); } public override void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status){ if (autoReload){ browser.Reload(); } } #if FREEZE_TWEETDECK_RESOURCES private static readonly Regex TweetDeckResourceUrl = new Regex(@"/dist/(.*?)\.(.*?)\.(css|js)$", RegexOptions.Compiled); private static readonly SortedList<string, string> TweetDeckHashes = new SortedList<string, string>(2){ { "vendor.js", "d897f6b9ed" }, { "bundle.js", "851d3877b9" }, { "vendor.css", "ce7cdd10b6" }, { "bundle.css", "c339f07047" } }; public override bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response){ if (request.ResourceType == ResourceType.Script || request.ResourceType == ResourceType.Stylesheet){ string url = request.Url; Match match = TweetDeckResourceUrl.Match(url); if (match.Success && TweetDeckHashes.TryGetValue($"{match.Groups[1]}.{match.Groups[3]}", out string hash)){ if (match.Groups[2].Value == hash){ Debug.WriteLine($"Accepting {url}"); } else{ Debug.WriteLine($"Rewriting {url} hash to {hash}"); request.Url = TweetDeckResourceUrl.Replace(url, $"/dist/$1.{hash}.$3"); return true; } } } return base.OnResourceResponse(browserControl, browser, frame, request, response); } #endif } }