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

时间:2015-01-23 08:50:25

标签: javascript google-chrome http google-chrome-extension error-handling

我正在开发一个小型Chrome扩展程序,供个人用于特定情况(网站自动化),但我遇到了问题。如何在后台脚本上捕获网络错误并调用某个函数。

我已实施此方法:

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

它捕获了一些网络错误,从我看到的男子气概::net错误,DNS失败,网络改变等。

但是今天我发现HTTP错误如:

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

没有触发听众,我怎么能让它也适用于那些?

2 个答案:

答案 0 :(得分:2)

我认为从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过滤。

答案 1 :(得分:2)

在用户@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);
});