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

擴充套件程式示例

瀏覽器相容性