proxy.onRequest

当一个 Web 请求即将发起时触发,让扩展有机会代理该请求。

此事件在很大程度上参照了 webRequest API 中定义的事件。与那些事件一样,其 addListener() 函数接受三个参数:

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

该事件在处理相同请求的任何 webRequest 事件之前触发。

当事件触发时,侦听器会收到一个包含请求信息的对象。侦听器返回一个 proxy.ProxyInfo 对象,表示要使用的代理(或一个 proxy.ProxyInfo 对象数组,允许浏览器在代理无法访问时进行故障转移)。默认情况下,除非返回 null 对象或以 null 对象结尾的数组,否则请求将故障转移到任何浏览器定义的代理。

要使用 proxy.onRequest,扩展必须拥有 "proxy" 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 的代理。

默认情况下,除非返回 null 对象或以 null 对象结尾的数组([{ ... proxy info ...} , null]),否则请求将故障转移到任何浏览器定义的代理。

如果指定 proxy.ProxyInfo 对象时发生错误,则会调用 proxy.onError

filter

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

extraInfoSpec 可选

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

示例

此代码会拦截对 <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>"],
});

扩展程序示例

浏览器兼容性