我正在开发一个小型Chrome扩展程序,供个人用于特定情况(网站自动化),但我遇到了问题。如何在后台脚本上捕获网络错误并调用某个函数。
我已实施此方法:
chrome.webRequest.onErrorOccurred.addListener(
handleNetworkError,
{urls: ["http://*/*", "https://*/*"]
});
它捕获了一些网络错误,从我看到的男子气概::net
错误,DNS失败,网络改变等。
但是今天我发现HTTP错误如:
GET https://example.com 522 (Origin Connection Time-out)
没有触发听众,我怎么能让它也适用于那些?
答案 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);
});