proxy.onRequest

当 Web 请求即将发出时触发,使扩展有机会代理请求。

此事件紧密模仿了 webRequest API 中定义的事件。 与这些事件类似,其 addListener() 函数接受三个参数

  • 事件触发时调用的监听器。
  • 一个 RequestFilter 对象,控制哪些请求会导致事件触发。
  • 一个字符串数组,用于控制事件行为的其他方面。

事件在针对同一请求的任何 webRequest 事件之前触发。

当事件触发时,监听器将使用包含有关请求的信息的对象调用。 监听器返回一个 proxy.ProxyInfo 对象,表示要使用的代理(或 proxy.ProxyInfo 对象的数组,使浏览器能够在代理不可达时进行故障转移)。

要使用 proxy.onRequest,扩展必须具有“代理” API 权限 以及拦截的请求的 URL 的 主机权限,这意味着 filter 参数中的匹配模式必须是扩展主机权限的子集。

语法

js
browser.proxy.onRequest.addListener(
  listener,             //  function
  filter,               //  object
  extraInfoSpec         //  optional array of strings
)
browser.proxy.onRequest.removeListener(listener)
browser.proxy.onRequest.hasListener(listener)

事件有三个函数

addListener(listener, filter, extraInfoSpec)

向此事件添加监听器。

removeListener(listener)

停止监听此事件。 listener 参数是要移除的监听器。

hasListener(listener)

检查 listener 是否已注册到此事件。 如果正在监听,则返回 true,否则返回 false

addListener 语法

参数

监听器

当此事件发生时调用的函数。 该函数传递一个参数,该参数是一个 proxy.RequestDetails 对象,包含请求的详细信息。

监听器可以返回以下任何内容

  • 一个 proxy.ProxyInfo 对象。
  • 一个 proxy.ProxyInfo 对象的数组。
  • 解析为 ProxyInfo 对象的 Promise
  • 解析为 ProxyInfo 对象的数组的 Promise

如果监听器返回一个数组,或者解析为数组的 Promise,则第一个 ProxyInfo 对象之后的所有对象都代表故障转移:如果数组中位置 N 的代理在其 ProxyInfo.failoverTimeout 到期时无法访问,则浏览器将尝试位置 N+1 的代理。

如果在指定 proxy.ProxyInfo 对象时出现错误,则会调用 proxy.onError

过滤器

webRequest.RequestFilter。 一组过滤器,用于限制发送到监听器的事件。

extraInfoSpec 可选

stringarray。 事件的额外选项。 传递 "requestHeaders" 以在传递给监听器的 details 对象中包含请求头。

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

示例

此代码拦截对 <all_urls> 的请求,如果它们不是顶级框架,则代理它们。

js
function shouldProxyRequest(requestInfo) {
  return requestInfo.parentFrameId !== -1;
}

function handleProxyRequest(requestInfo) {
  if (shouldProxyRequest(requestInfo)) {
    console.log(`Proxying: ${requestInfo.url}`);
    return { type: "http", host: "127.0.0.1", port: 65535 };
  }
  return { type: "direct" };
}

browser.proxy.onRequest.addListener(handleProxyRequest, {
  urls: ["<all_urls>"],
});

示例扩展