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);
});
我正在开发一个小型 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);
});