webRequest.onErrorOccurred侦听器中error属性的可能值是什么?

时间:2017-02-18 19:54:37

标签: javascript google-chrome-extension firefox-webextensions

我的兴趣是仅在重载时间内处理网站以使自动填充工作。例如,当销售打开并且网站蜂拥时,它有时会崩溃。我需要捕获网站错误,因此我可以从后台脚本重新加载页面。 如Chrome Extensions: Background Script Catch Network and HTTP Errors中所述,我们可以解决页面加载错误。

网页加载错误可能是由于网络问题,网站问题,DNS问题以及网站过载问题造成的。

我想要的只是重新加载网页,以防由于某些错误而未加载。

我为Chrome和Firefox收集了许多错误代码:

  • 净:: ERR_ABORTED
  • 净:: ERR_EMPTY_RESPONSE
  • 净:: ERR_CONNECTION_TIMED_OUT
  • 净:: ERR_CONNECTION_REFUSED
  • 净:: ERR_CONNECTION_RESET
  • NS_ERROR_NET_ON_CONNECTING_TO
  • NS_ERROR_NET_ON_WAITING_FOR
  • NS_ERROR_NET_ON_CONNECTING_TO

这不是完整列表。我已经看到了这些错误,所以我已经列出了它们。我想知道(HTML)页面无法加载时所有错误代码的列表,而不是使用反复试验找到它们。

以下是我想要使用的示例源代码:

chrome.webRequest.onErrorOccurred.addListener(function (details) 
{
    if ("type" in details && ['main_frame', 'sub_frame'].indexOf(details.type) == -1)
    {
        if (details.url.match(/.js$/))
        {
            console.log("Error in download of this file:", details.url);
        }
        return;
    }

    if (details.tabId == -1)
    {
        return;
    }

    var check_all_errors = function(err)
    {
        var all_errors = [
             "net::ERR_ABORTED",
             "net::ERR_EMPTY_RESPONSE",
             "net::ERR_CONNECTION_TIMED_OUT",
             "net::ERR_CONNECTION_REFUSED",
             "net::ERR_CONNECTION_RESET",
             "NS_ERROR_NET_ON_CONNECTING_TO",
             'NS_ERROR_NET_ON_WAITING_FOR',
             'NS_ERROR_NET_ON_CONNECTING_TO'
        ];

        for( var i=0;i<all_errors.length;++i)
        {
            if( all_errors[i] == err && !ff_validate_false())
            {                
                return true;
            }
        }

        console.log("786 returning false for err "+err);
        return false;
    }

    if (details.url == HOME_URL && check_all_errors(details.error)) //if any error encountered then go to home URL
    {
        setTimeout(function () {
            chrome.tabs.update(details.tabId, {url: HOME_URL});
        }, 1000);
    }
    //FOLLOWING PART IS NOW SHOWN HERE

1 个答案:

答案 0 :(得分:3)

强烈建议您不要这样做

对于error property 中提供的MDN details object ({{3} }) 传递给MDN webRequest.onErrorOccurred 听众,强烈建议您测试该属性的实际文本内容。

MDN说:

  

您不得根据其内容进行解析和行动。

Chrome source code中:

"error": {"type": "string", "description": "The error description. This string is <em>not</em> guaranteed to remain backwards compatible between releases. You must not parse and act based upon its content."}

this line of code

  

错误说明。不保证此字符串在版本之间保持向后兼容。 您不得根据其内容进行解析和行动。

火狐

documentation says州:

  

您不得根据其内容进行解析和行动。

Firefox source code中:

"error": {"type": "string", "description": "The error description. This string is <em>not</em> guaranteed to remain backwards compatible between releases. You must not parse and act based upon its content."}

this line of code

  

错误说明。此字符串是内部错误字符串,可能因浏览器而异,并且不保证在不同版本之间保持相同

当前可能的error

Chrome在documentation saysthis file)中列出了可能的错误值。该代码是:

{ net::ERR_ABORTED, "aborted" },
{ net::ERR_TIMED_OUT, "tcp.connection.timed_out" },
{ net::ERR_CONNECTION_CLOSED, "tcp.connection.closed" },
{ net::ERR_CONNECTION_RESET, "tcp.connection.reset" },
{ net::ERR_CONNECTION_REFUSED, "tcp.connection.refused" },
{ net::ERR_CONNECTION_ABORTED, "tcp.connection.aborted" },
{ net::ERR_CONNECTION_FAILED, "tcp.connection.failed" },
{ net::ERR_NAME_NOT_RESOLVED, "dns" },
{ net::ERR_SSL_PROTOCOL_ERROR, "ssl.protocol.error" },
{ net::ERR_ADDRESS_INVALID, "tcp.connection.address_invalid" },
{ net::ERR_ADDRESS_UNREACHABLE, "tcp.connection.address_unreachable" },
{ net::ERR_CONNECTION_TIMED_OUT, "tcp.connection.timed_out" },
{ net::ERR_NAME_RESOLUTION_FAILED, "dns" },
{ net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN,
    "ssl.cert.pinned_key_not_in_cert_chain" },
{ net::ERR_CERT_COMMON_NAME_INVALID, "ssl.cert.name_invalid" },
{ net::ERR_CERT_DATE_INVALID, "ssl.cert.date_invalid" },
{ net::ERR_CERT_AUTHORITY_INVALID, "ssl.cert.authority_invalid" },
{ net::ERR_CERT_REVOKED, "ssl.cert.revoked" },
{ net::ERR_CERT_INVALID, "ssl.cert.invalid" },
{ net::ERR_EMPTY_RESPONSE, "http.response.empty" },
{ net::ERR_SPDY_PING_FAILED, "spdy.ping_failed" },
{ net::ERR_SPDY_PROTOCOL_ERROR, "spdy.protocol" },
{ net::ERR_QUIC_PROTOCOL_ERROR, "quic.protocol" },
{ net::ERR_DNS_MALFORMED_RESPONSE, "dns.protocol" },
{ net::ERR_DNS_SERVER_FAILED, "dns.server" },
{ net::ERR_DNS_TIMED_OUT, "dns.timed_out" },
{ net::ERR_INSECURE_RESPONSE, "ssl" },
{ net::ERR_CONTENT_LENGTH_MISMATCH, "http.response.content_length_mismatch" },
{ net::ERR_INCOMPLETE_CHUNKED_ENCODING,
    "http.response.incomplete_chunked_encoding" },
{ net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH,
    "ssl.version_or_cipher_mismatch" },
{ net::ERR_BAD_SSL_CLIENT_AUTH_CERT, "ssl.bad_client_auth_cert" },
{ net::ERR_INVALID_CHUNKED_ENCODING,
    "http.response.invalid_chunked_encoding" },
{ net::ERR_RESPONSE_HEADERS_TRUNCATED, "http.response.headers.truncated" },
{ net::ERR_REQUEST_RANGE_NOT_SATISFIABLE,
    "http.request.range_not_satisfiable" },
{ net::ERR_INVALID_RESPONSE, "http.response.invalid" },
{ net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION,
    "http.response.headers.multiple_content_disposition" },
{ net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH,
    "http.response.headers.multiple_content_length" },
{ net::ERR_SSL_UNRECOGNIZED_NAME_ALERT, "ssl.unrecognized_name_alert" }

这意味着Chrome的可能值为:

net::ERR_ABORTED
net::ERR_TIMED_OUT
net::ERR_CONNECTION_CLOSED
net::ERR_CONNECTION_RESET
net::ERR_CONNECTION_REFUSED
net::ERR_CONNECTION_ABORTED
net::ERR_CONNECTION_FAILED
net::ERR_NAME_NOT_RESOLVED
net::ERR_SSL_PROTOCOL_ERROR
net::ERR_ADDRESS_INVALID
net::ERR_ADDRESS_UNREACHABLE
net::ERR_CONNECTION_TIMED_OUT
net::ERR_NAME_RESOLUTION_FAILED
net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN
net::ERR_CERT_COMMON_NAME_INVALID
net::ERR_CERT_DATE_INVALID
net::ERR_CERT_AUTHORITY_INVALID
net::ERR_CERT_REVOKED
net::ERR_CERT_INVALID
net::ERR_EMPTY_RESPONSE
net::ERR_SPDY_PING_FAILED
net::ERR_SPDY_PROTOCOL_ERROR
net::ERR_QUIC_PROTOCOL_ERROR
net::ERR_DNS_MALFORMED_RESPONSE
net::ERR_DNS_SERVER_FAILED
net::ERR_DNS_TIMED_OUT
net::ERR_INSECURE_RESPONSE
net::ERR_CONTENT_LENGTH_MISMATCH
net::ERR_INCOMPLETE_CHUNKED_ENCODING
net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH
net::ERR_BAD_SSL_CLIENT_AUTH_CERT
net::ERR_INVALID_CHUNKED_ENCODING
net::ERR_RESPONSE_HEADERS_TRUNCATED
net::ERR_REQUEST_RANGE_NOT_SATISFIABLE
net::ERR_INVALID_RESPONSE
net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION
net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH
net::ERR_SSL_UNRECOGNIZED_NAME_ALERT

火狐

Firefox有点复杂。 WebExtensions是一种在Firefox使用的API之上分层的API(并公开给其他类型的附加组件)。 Firefox代码通过以下方式更改从底层API获取的错误文本响应:

let prefix = /^(?:ACTIVITY_SUBTYPE_|STATUS_)/;
let map = new Map();
for (let iface of [nsIHttpActivityObserver, nsISocketTransport]) {
  for (let c of Object.keys(iface).filter(name => prefix.test(name))) {
    map.set(iface[c], c.replace(prefix, "NS_ERROR_NET_ON_"));
  }
}

可能的ACTIVITY_SUBTYPE_属性的代码位于文件some associated code中,可能的STATUS_属性的定义位于nsIHttpActivityObserver.idl。执行适当的RegEx替换会产生以下可能的值:

NS_ERROR_NET_ON_RESOLVING
NS_ERROR_NET_ON_RESOLVED
NS_ERROR_NET_ON_CONNECTING_TO
NS_ERROR_NET_ON_CONNECTED_TO
NS_ERROR_NET_ON_SENDING_TO
NS_ERROR_NET_ON_WAITING_FOR
NS_ERROR_NET_ON_RECEIVING_FROM
NS_ERROR_NET_ON_REQUEST_HEADER
NS_ERROR_NET_ON_REQUEST_BODY_SENT
NS_ERROR_NET_ON_RESPONSE_START
NS_ERROR_NET_ON_RESPONSE_HEADER
NS_ERROR_NET_ON_RESPONSE_COMPLETE
NS_ERROR_NET_ON_TRANSACTION_CLOSE