Мы можем сделать это, переопределив nsiHttpChannel
новым, сделать это немного сложно, но, к счастью, дополнение https-everywhere
реализует это, чтобы установить соединение https.
Исходный код
https-everywhere
доступен здесь
Большая часть кода, необходимого для этого, находится в файлах
[IO Util.js
]
[ChannelReplacement.js
]
Мы можем работать только с вышеуказанными файлами при условии, что у нас есть базовые переменные, такие как Cc, Ci, настроенная и определенная функция xpcom_generateQI
.
var httpRequestObserver =
{
observe: function(subject, topic, data) {
if (topic == "http-on-modify-request") {
var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
var requestURL = subject.URI.spec;
if(isToBeReplaced(requestURL)) {
var newURL = getURL(requestURL);
ChannelReplacement.runWhenPending(subject, function() {
var cr = new ChannelReplacement(subject, ch);
cr.replace(true,null);
cr.open();
});
}
}
},
get observerService() {
return Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
},
register: function() {
this.observerService.addObserver(this, "http-on-modify-request", false);
},
unregister: function() {
this.observerService.removeObserver(this, "http-on-modify-request");
}
};
httpRequestObserver.register();
Код заменит запрос не перенаправляется.
Хотя я достаточно хорошо протестировал приведенный выше код, я не уверен в его реализации. Насколько я могу разобрать, он копирует все атрибуты запрошенного канала и устанавливает их для канала, который будет переопределен. После чего каким-либо образом вывод, запрошенный исходным запросом, подается с использованием нового канала.
P.S. Я видел SO сообщение, в котором этот подход был предложен.