Выполнение синхронного XHR-запроса с помощью chrome.webRequest.onBeforeRequest - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу создать расширение для Chrome, которое подключается к chrome.webRequest.onBeforeRequest, чтобы определить, стоит ли блокировать запрос текущей страницы.В результате мне нужно сделать запрос к API, чтобы определить его.

Есть ли хороший способ сделать запрос checkUrl синхронным, чтобы удовлетворить требования chrome.webRequest.onBeforeRequest?

function checkUrl(url, callback) {
  let api    = 'http://localhost:9000/filter';
  let data   = {
    url: url,
  };

  let json = JSON.stringify(data);

  let xhr = new XMLHttpRequest();
  xhr.open('POST', api, true);
  xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
  xhr.setRequestHeader('X-Bark-Email', email);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
      callback(xhr.response);
    }
  }
  xhr.send(json);
}

function onBeforeRequestHandler(details) {
  let url = new URL(details.url);

  console.log(details.type, ": ", url.host)

  checkUrl(url, function(resp) {
    let status      = resp.status;
    let redirectUrl = resp.redirect_url;

    if (status == "allowed") {
      return { cancel: false }; // <<<<<  This doesn't work b/c of the callback
    } else {
      return { redirectUrl: redirectUrl };
    }
  });
}

chrome.webRequest.onBeforeRequest.addListener(onBeforeRequestHandler,
  {
    urls: ["<all_urls>"],
    types: ["sub_frame", "main_frame", "xmlhttprequest"]
  },
  ["blocking"]
);

1 Ответ

0 голосов
/ 16 апреля 2019

Я поменялся местами:

  xhr.open('POST', api, true);

для

  xhr.open('POST', api, false);

, и это делает запрос синхронным.Затем вернул результат из запроса xhr и использовал это встроенное значение:

  return JSON.parse(xhr.response);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...