Расширение веб-браузера Firefox: webRequest.OnBeforeRequest случайным образом игнорирует ProxyInfo - PullRequest
0 голосов
/ 04 декабря 2018

Мы тестируем веб-расширение Firefox, которое выборочно перенаправляет запросы разным прослушивателям прокси на основе различных критериевЭто достигается сначала обработкой события proxy.onRequest и возвратом Promise proxyinfo.Упрощенный код:

browser.proxy.onRequest.addListener(
proxyURL,
{urls: ["*://*/*"]},
["requestHeaders"]);

async function proxyURL(requestDetails) {
    let hoststatus = await resolveHost(host);
    if (hoststatus.whitelisted) {
        return [{type: "http", host: "localhost", port: "9999", failoverTimeout: 5}];
    }

    // Code to fetch the parent host...

    let parenthoststatus = await resolveHost(parenthost);
    if (parenthoststatus != undefined && parenthoststatus.whitelisted) {
        return [{type: "http", host: "localhost", port: "9999", failoverTimeout: 5}];
    }

    console.log("This message never appears in the browser console.");
    return {type: "direct"};
}

При проверке этого первые несколько запросов к определенному URL-адресу корректно заносятся в белый список и направляются через прокси-сервер localhost: 9999.Однако примерно через десять секунд эти запросы прекращают маршрутизацию через этот прокси.

Используя инструмент трассировки сети, я подтвердил, что последующие запросы обрабатываются напрямую.Затем я перехватил событие webRequest.onBeforeRequest и обнаружил, что когда запросы успешно выполняются, объект proxyInfo там устанавливается правильно.Когда запросы не выполняются, объект proxyInfo имеет значение null.

Неудачный запрос:

CheckURL() output: {"requestId":"27888","url":"https://example.com/global.min.css","originUrl":"https://www.anotherdomain.com/","documentUrl":"https://www.anotherdomain.com/","method":"GET","type":"other","timeStamp":1543955038129,"frameId":0,"parentFrameId":-1,**"proxyInfo":null**,"ip":null,"frameAncestors":[],"tabId":49}

Успешный запрос:

CheckURL() output: {"requestId":"27888","url":"https://example.com/global.min.css","originUrl":"https://www.anotherdomain.com/","documentUrl":"https://www.anotherdomain.com/","method":"GET","type":"other","timeStamp":1543955038129,"frameId":0,"parentFrameId":-1,"proxyInfo": {"failoverTimeout":50,"host":"localhost","port":9999,"proxyDNS":false,"type":"http","username":""},"ip":null,"frameAncestors":[],"tabId":49}

Редактировать: Похоже, что если второе обещание(ожидание resolHost) закомментировано, запросы всегда работают.Может ли происходить какое-то скрытое состояние гонки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...