Я работаю над расширением Firefox, которое изменяет указанный веб-сайт c с помощью API webRequest и filterResponseData. Все работает, как и ожидалось, пока веб-сайт не вернет редирект 302 для некоторых указанных c URL. Поскольку я не контролирую сервер, на котором находится веб-сайт, я установил локальный сервер, чтобы попытаться отладить проблему.
Упрощенная отладочная версия фонового сценария:
function listener(details){
console.log("listener (" + details.requestId + "): " + details.url + " :: " + details.type);
let filter = browser.webRequest.filterResponseData(details.requestId),
decoder = new TextDecoder("utf-8"),
encoder = new TextEncoder(),
data = [];
filter.onstart = event => {
console.log("onstart (" + details.requestId + "): " + details.url);
};
filter.onerror = event => {
console.log("onerror (" + details.requestId + "): " + details.url, filter.error)
};
filter.ondata = event => {
console.log("ondata (" + details.requestId + "): " + details.url);
data.push(event.data);
};
filter.onstop = async event => {
console.log("onstop (" + details.requestId + "): " + details.url);
let blob = new Blob(data, {type: "text/html"}),
buffer = await blob.arrayBuffer(),
str = decoder.decode(buffer).trim();
// do something with the response here
console.log("full response: " + str);
filter.write(encoder.encode(str));
filter.close();
};
}
let webRequestFilter = {urls: ["*://127.0.0.1/*"],
types: ["main_frame","sub_frame","xmlhttprequest"]};
browser.webRequest.onBeforeRequest.addListener(
listener,
webRequestFilter,
["blocking"]
);
browser.webRequest.onHeadersReceived.addListener(details => {
console.log("headers (" + details.requestId + "): " + details.url, details.statusCode, details.responseHeaders);
},
webRequestFilter,
["responseHeaders"]
);
Вкл. В конфигурацию сервера я добавил правило rewrite ^/302$ / redirect;
, и доступ к нему с выгруженным расширением правильно перенаправляет на URL root. Когда я загружаю расширение, я получаю 2 разных поведения в зависимости от того, как я пытаюсь получить доступ к URL.
Прямой доступ к URL
Доступ к URL напрямую из браузера (127.0.0.1/302 ), Я получаю на консоли следующее:
listener (22040): http://127.0.0.1/302 :: main_frame
headers (22040): http://127.0.0.1/302 :: 302 ...
listener (22040): http://127.0.0.1/ :: main_frame
onerror (22040): http://127.0.0.1/ :: Channel redirected
onerror (22040): http://127.0.0.1/302 :: Channel redirected
Браузер правильно перенаправляет на правильный URL-адрес, и отображается содержимое страницы. Но он выходит из onerror в обоих запросах с перенаправленным каналом, он никогда не запускает filter.onstop для запроса (и по-прежнему отображает страницу?)
Доступ к URL из AJAX call
Доступ к URL из AJAX звонка имеет совершенно противоположный результат. Сценарий $.ajax({url: "302"}).done(function(html){$("div").html(html);});
приводит к следующему журналу на консоли:
listener (22067): http://127.0.0.1/302 :: xmlhttprequest
headers (22067): http://127.0.0.1/302 :: 302 ...
listener (22067): http://127.0.0.1/ :: xmlhttprequest
headers (22067): http://127.0.0.1/ :: 200 ...
onerror (22067): http://127.0.0.1/302 :: Channel redirected
onstart (22067): http://127.0.0.1/
ondata (22067): http://127.0.0.1/
onstop (22067): http://127.0.0.1/
full response: <!DOCTYPE html><html><head><title>Welcome to nginx!</title>...
, поэтому в журнале все выглядит нормально (игнорируя тот факт, что ошибка 1-го запроса выполняется после того, как 2-й запрос был инициирован и заголовки получены с тем же идентификатором запроса), , но результат не отображается на странице (как это происходит, когда расширение не выгружено)
Удаление filterResponseData, все запросы работают как ожидается. Любые идеи о том, что вызывает проблему или как ее исправить?