Chrome 扩展:后台脚本捕获网络和 HTTP 错误

Chrome Extensions: Background Script Catch Network and HTTP Errors

我正在开发一个小型 Chrome 扩展供个人使用,用于非常具体的案例(网站自动化),但我遇到了问题。如何在后台脚本上捕获网络错误并调用某个函数。

我已经实现了这个方法:

chrome.webRequest.onErrorOccurred.addListener(
  handleNetworkError,
  {urls: ["http://*/*", "https://*/*"]
});

它捕获了一些网络错误,据我所见 ::net 错误、DNS 失败、网络更改等

但是今天我注意到 HTTP 错误如下:

GET https://example.com 522 (Origin Connection Time-out)

没有触发侦听器,我怎样才能让它在那些上也起作用?

我假设从webRequest/Chrome的网络栈来看,这个请求确实完成了。所以你需要挂钩到其他一些事件,例如

function extractStatus(line) {
  var match = line.match(/[^ ]* (\d{3}) (.*)/);
  if(match) {
    return {code: match[1], message: match[2]};
  } else {
    return undefined;
  }
}

chrome.webRequest.onHeadersReceived.addListener(
  function(details) {
    var status = extractStatus(details.statusLine);
    if(status) {
      // Do something based on status.code
    }
  },
  {urls: ["<all_urls>"]}
);

请注意,此事件可选择阻止:如果需要,您可以重定向请求。

显然,这会给您的扩展带来很多工作;在上面的代码片段中,侦听器没有阻塞,但如果你让它阻塞,它会大大降低你的 Chrome 速度——只在绝对必要时使用它,并在适当的时候按 URL 过滤。

在用户@Xan 的帮助下,我设法想出了这个:

function extractStatus(line) {
    var match = line.match(/[^ ]* (\d{3}) (.*)/);
    if (match)
        return {code: match[1], message: match[2]};
    else
        return undefined;
}   

chrome.tabs.query({active: true, lastFocusedWindow: true }, function(tabsArray) {
    tab = tabsArray[0];
    scope = {urls: ["https://example.com/*"], tabId: tab.id};
    console.log("Listening for errors...");

    // ::net errors
    chrome.webRequest.onErrorOccurred.addListener(handleNetworkError, scope);

    // HTTP errors
    chrome.webRequest.onHeadersReceived.addListener(function(details) {

        var status = extractStatus(details.statusLine);
        if (!status)
            return;

        if (status.code.charAt(0) == '5' || status.code.charAt(0) == '4')
            handleNetworkError();           

    }, scope);
});