using CefSharp; using TweetDuck.Browser.Handling.Filters; using TweetDuck.Utils; using TweetLib.Core.Features.Twitter; namespace TweetDuck.Browser.Handling { class ResourceRequestHandlerBrowser : ResourceRequestHandlerBase { private const string UrlVendorResource = "/dist/vendor"; private const string UrlLoadingSpinner = "/backgrounds/spinner_blue"; private const string UrlVersionCheck = "/web/dist/version.json"; protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) { if (request.ResourceType == ResourceType.MainFrame) { if (request.Url.EndsWith("//twitter.com/")) { request.Url = TwitterUrls.TweetDeck; // redirect plain twitter.com requests, fixes bugs with login 2FA } } else if (request.ResourceType == ResourceType.Image) { if (request.Url.Contains(UrlLoadingSpinner)) { request.Url = TwitterUtils.LoadingSpinner.Url; } } else if (request.ResourceType == ResourceType.Script) { string url = request.Url; if (url.Contains("analytics.")) { callback.Dispose(); return CefReturnValue.Cancel; } else if (url.Contains(UrlVendorResource)) { request.SetHeaderByName("Accept-Encoding", "identity", overwrite: true); } } else if (request.ResourceType == ResourceType.Xhr) { if (request.Url.Contains(UrlVersionCheck)) { callback.Dispose(); return CefReturnValue.Cancel; } } return base.OnBeforeResourceLoad(browserControl, browser, frame, request, callback); } protected override IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) { if (request.ResourceType == ResourceType.Script && request.Url.Contains(UrlVendorResource) && int.TryParse(response.Headers["Content-Length"], out int totalBytes)) { return new ResponseFilterVendor(totalBytes); } return base.GetResourceResponseFilter(browserControl, browser, frame, request, response); } } }