Получить адрес перенаправления (URL) от 3xx: HTTP-ответ перенаправления с расширением Web - PullRequest
1 голос
/ 27 сентября 2019

Невозможно сделать в обычном веб-JS.Например, следующий код не работает должным образом:

fetch("https://crbug.com", { redirect: "manual" })

Хорошо.Но возможно ли это сделать в веб-расширении?

Мне нужно получить местоположение перенаправления для URL.fetch позволяет вам видеть только то, было ли перенаправление, и конечное местоположение (не промежуточное, когда число перенаправлений больше 1) и только после успешной загрузки страницы (я не хочу загружатьСтраница вообще (даже только заголовки HTTP) - не выполнять никакого соединения со страницей из Location заголовка ответа HTTP).


Например:

для https://bit_ly/2ng6XCg* Я должен получить "http://crbug.com"

для" http://crbug.com" Я должен получить "https://crbug.com"

для" https://crbug.com" Я должен получить "https://bugs.chromium.org/p/chromium/issues/list".


* заменить _ на .

1 Ответ

0 голосов
/ 27 сентября 2019

Спасибо wOxxOm, я написал, что хотел:

function getRedirect(url) {
    return new Promise((resolve) => {

        let blockedURL;

        function onRequest(details) {
            //console.log("onBeforeRequest ", details);

            if (details.url === blockedURL) {
                setTimeout(() => {
                    chrome.webRequest.onBeforeRequest.removeListener(onRequest);
                    resolve(blockedURL);
                });
                return { cancel: true }; 
            }
        }
        chrome.webRequest.onBeforeRequest.addListener(onRequest, { urls: ["<all_urls>"] }, ["blocking"]);

        function onRedirect(details) {
            //console.log("onBeforeRedirect", details);         
            blockedURL = details.redirectUrl;

            chrome.webRequest.onBeforeRedirect.removeListener(onRedirect);
        }
        chrome.webRequest.onBeforeRedirect.addListener(onRedirect, { urls: ["<all_urls>"] });

        fetch(url, { redirect: "follow" }).catch(console.warn);             
    }); 
}

Давайте проверим код:

(async () => {
    console.log("URL Redirects to ", await getRedirect("http://crbug.com"));                    
    // "URL Redirects to https://crbug.com" 

    console.log("URL Redirects to ", await getRedirect(await getRedirect("http://crbug.com"))); 
    // "URL Redirects to https://bugs.chromium.org/p/chromium/issues/list"

    await fetch("http://crbug.com"); 
    // It works in common way (Fetch finished loading: GET "https://bugs.chromium.org/p/chromium/issues/list")  
})();

В manifest.json: "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]

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