302 перенаправляет на browser.webRequest с использованием filterResponseData - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над расширением 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, все запросы работают как ожидается. Любые идеи о том, что вызывает проблему или как ее исправить?

...