3

I am trying to figure out a way to add a custom http header to all requests made through geckoFX. I tried to add a header using

GeckoMIMEInputStream strea=new GeckoMIMEInputStream();
strea.AddHeader("head","val"); 
geckoWebBrowser1.Navigate("http://google.com",GeckoLoadFlags.None,"",null,strea);

I need a way to add a custom header, to absolutely ALL requests made when going to a webpage. Thank you

2 Answers2

1

You can implement your own observer (nsIObserver interface) to intercept the http-on-modify-request notification and there add headers.

class Observer: nsIObserver
{
    public void Observe(nsISupports aSubject, string aTopic, string aData)
    {
        var request = Xpcom.QueryInterface<nsIHTTPChannel>(aSubject);
        request.SetRequestHeader(name, value, merge);
    }
}

and register it

Xpcom.GetService<nsIObserverService>("@mozilla.org/observer-service;1").AddObserver(new Observer(), "http-on-modify-request", false);
vmas
  • 454
  • 3
  • 10
  • in `request.SetRequestHeader(name, value, merge);` how do you set the `name` and `value`? How to convert string to `Gecko.nsACStringBase` – FireFalcon May 25 '19 at 07:39
  • 1
    var name = new nsACString(name_string); – vmas May 26 '19 at 16:11
  • Also how do I get a certain header from requests? I tried `request.GetRequestHeader(name, strRef);`, but it throws an exception: `ClassFactory cannot supply requested class` – FireFalcon May 29 '19 at 12:37
1

You can use ObserveHttpModifyRequest event:

var browser = new GeckoWebBrowser();
browser.UseHttpActivityObserver = true;
browser.ObserveHttpModifyRequest += 
    (sender, e) => e.Channel.SetRequestHeader(name, value, merge: true);

For more information check nsIRequest and nsIHttpChannel pages on MDN.

Leonid Vasilev
  • 11,910
  • 4
  • 36
  • 50