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