Chromium - send information about custom headers on a C # page bootstrap

Or How to add a custom title to the original site request when updating an instance of ChromiumWebBrowser.

I am a noob with Chromium and really can help. I have a winforms application with a CEF window. K, no problem so far. What I need to do is call / load the source URL using a custom http header that contains authentication information. Is it possible?

Basically this is what works, and all parts work except a custom header (Doh!)

Winform (CEF httpRequest (with a custom header)) [never passes this point] => C # MVC web app => Owin_Authentication_Pipeline segment => MVC Response with populated view Razor => Displays Winform Chromium in the application.

Perhaps this will also help:

using CefSharp; using CefSharp.WinForms; ... private void Form1_Load(object sender, EventArgs e) { Cef.Initialize(); ChromiumWebBrowser myBrowser = new ChromiumWebBrowser("whatever.com"); // ??How do i get a custom header be sent with the above line?? myBrowser.Dock = DockStyle.Fill; //myBrowser.ShowDevTools(); //myBrowser.RequestHandler = new DSRequestHander(); //myBrowser.FrameLoadStart += myBrowser_FrameLoadStart; this.Controls.Add(myBrowser); } 

I swallowed it to death, looked, tried all the tricks in my toolbar, and then some.

Any ideas, hints or hints about how I could solve or get around this boggler are greatly appreciated. Thanks in advance.

+6
source share
3 answers

Updated to reflect major chromium changes

Updated to reflect changes made in version 75 (should work in 75 and newer)

Your method should be OnBeforeResourceLoad , a basic example should look like this.

 public class CustomResourceRequestHandler : ResourceRequestHandler { protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) { var headers = request.Headers; headers["User-Agent"] = "My User Agent"; request.Headers = headers; return CefReturnValue.Continue; } } public class CustomRequestHandler : RequestHandler { protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling) { return new CustomResourceRequestHandler(); } } browser.RequestHandler = new CustomRequestHandler(); 

In the existing state, you must read the headers property, make changes, and then reassign it.

+7
source

You should create a class that implements IRequestHandler , and then install an instance of this class as RequestHandler in your browser object.

With version 53, this class should look like this:

 class ChromeBrowserRequestHandler: IRequestHandler { public bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback) { return false; } public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect) { return false; } public bool OnBeforePluginLoad(IWebBrowser browser, string url, string policyUrl, WebPluginInfo info) { return false; } public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) { var headers = request.Headers; headers["Custom-Header"] = "My Custom Header"; request.Headers = headers; return CefReturnValue.Continue; } public bool OnCertificateError(IWebBrowser browser, CefErrorCode errorCode, string requestUrl) { return false; } public void OnPluginCrashed(IWebBrowser browser, string pluginPath) { } public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status) { } public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) { return null; } public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback) { return false; } public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture) { return false; } public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath) { } public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url) { return false; } public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback) { return false; } public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser) { } public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength) { } public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, ref string newUrl) { } public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) { return false; } } 

Then, when creating your browser object:

 ChromiumWebBrowser myBrowser = new ChromiumWebBrowser("whatever.com") { RequestHandler = new ChromeBrowserRequestHandler() }; 

Please note that the request handler must be installed before the page loads. If you cannot install the request handler during instanctiaction, you can still install it later, reload the page using myBrowser.Load("whatever.com") .

+6
source

In a recent version, some callbacks have been moved from the IRequestHandler interface to IResourceRequestHandler . The easiest way is to override the default implementations of RequestHandler & ResourceRequestHandler , for example:

 class BearerAuthResourceRequestHandler : ResourceRequestHandler { public BearerAuthResourceRequestHandler(string token) { _token = token; } private string _token; protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback) { if (!string.IsNullOrEmpty(_token)) { var headers = request.Headers; headers["Authorization"] = $"Bearer {_token}"; request.Headers = headers; return CefReturnValue.Continue; } else return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback); } } class BearerAuthRequestHandler : RequestHandler { public BearerAuthRequestHandler(string token) { _token = token; } private string _token; protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling) { if (!string.IsNullOrEmpty(_token)) return new BearerAuthResourceRequestHandler(_token); else return base.GetResourceRequestHandler(chromiumWebBrowser, browser, frame, request, isNavigation, isDownload, requestInitiator, ref disableDefaultHandling); } } 

Then assign it to the RequestHandler browser:

 Browser.RequestHandler = new BearerAuthRequestHandler(token); 
+1
source

All Articles