最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

javascript - Chrome Extensions: Background Script Catch Network and HTTP Errors - Stack Overflow

matteradmin6PV0评论

I'm developing a small Chrome extension for personal use on a very specific case (website automation) but I've a problem. How can I catch a network error on a background script and call a certain function.

I've implemented this method:

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

It catches some network errors, from what I see manly ::net errors, DNS failing, networks changed etc.

However today I noticed that HTTP errors like:

GET  522 (Origin Connection Time-out)

didn't trigger the listener, how can I make it work on those too?

I'm developing a small Chrome extension for personal use on a very specific case (website automation) but I've a problem. How can I catch a network error on a background script and call a certain function.

I've implemented this method:

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

It catches some network errors, from what I see manly ::net errors, DNS failing, networks changed etc.

However today I noticed that HTTP errors like:

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

didn't trigger the listener, how can I make it work on those too?

Share Improve this question edited Jan 23, 2015 at 20:55 TCB13 asked Jan 23, 2015 at 8:50 TCB13TCB13 3,1553 gold badges46 silver badges71 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 4

With help of the the user @Xan, I managed to e up with this:

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./*"], 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);
});

I assume that from the perspective of webRequest / Chrome's network stack, this request actually pleted. So you need to hook to some other event, e.g.

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>"]}
);

Note that this event is optionally blocking: you can redirect the request if needed.

Obviously, this will create a lot of work for your extension; in the above snippet, the listener is not blocking, but if you do make it blocking it will slow down your Chrome considerably - only use it when absolutely necessary and filter by URL when appropriate.

Post a comment

comment list (0)

  1. No comments so far