webRequest.onHeadersReceived

Wird ausgelöst, wenn die HTTP-Antwortheader für eine Anfrage empfangen werden. Verwenden Sie dieses Ereignis, um HTTP-Antwortheader zu ändern.

Um die Antwortheader zusammen mit den anderen Anfragedaten an den Listener zu übergeben, fügen Sie "responseHeaders" in das extraInfoSpec-Array ein.

Wenn Sie "blocking" verwenden, müssen Sie die "webRequestBlocking"-API-Berechtigung in Ihrer manifest.json haben.

Es ist möglich, dass Erweiterungen widersprüchliche Anfragen stellen. Wenn zwei Erweiterungen onHeadersReceived für die gleiche Anfrage abhören und responseHeaders zurückgeben, um denselben Header zu setzen (z.B. Set-Cookie), der in der ursprünglichen Antwort nicht vorhanden ist, wird nur eine der Änderungen erfolgreich sein.

Allerdings wird der Content-Security-Policy-Header anders behandelt; seine Werte werden kombiniert, um alle angegebenen Richtlinien anzuwenden. Aber wenn zwei Erweiterungen einen CSP-Wert setzen, der in Konflikt steht, macht der CSP-Dienst die Einschränkungen strenger, um den Konflikt zu lösen. Beispielsweise, wenn eine Erweiterung img-src: example.com und eine andere Erweiterung img-src: example.org setzt, ist das Ergebnis img-src: 'none'. Zusammengeführte Änderungen tendieren immer dazu, restriktiver zu sein, obwohl eine Erweiterung den ursprünglichen CSP-Header entfernen kann.

Wenn Sie die Header sehen möchten, die vom System verarbeitet werden, ohne das Risiko, dass eine andere Erweiterung sie verändert, verwenden Sie webRequest.onResponseStarted, obwohl Sie die Header bei diesem Ereignis nicht ändern können.

Syntax

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

Ereignisse haben drei Funktionen:

addListener(listener, filter, extraInfoSpec)

Fügt diesem Ereignis einen Listener hinzu.

removeListener(listener)

Stoppt das Abhören dieses Ereignisses. Das listener-Argument ist der zu entfernende Listener.

hasListener(listener)

Überprüft, ob listener für dieses Ereignis registriert ist. Gibt true zurück, wenn der Listener aktiv ist, andernfalls false.

addListener Syntax

Parameter

listener

Die Funktion, die aufgerufen wird, wenn dieses Ereignis eintritt. Diese Funktion erhält folgendes Argument:

details

object. Informationen zur Anfrage. Dies enthält Antwortheader, wenn "responseHeaders" in extraInfoSpec enthalten ist.

Gibt zurück: webRequest.BlockingResponse. Wenn "blocking" im extraInfoSpec-Parameter angegeben ist, gibt der Ereignis-Listener ein BlockingResponse-Objekt zurück und kann dessen responseHeaders-Eigenschaft festlegen. In Firefox kann der Rückgabewert ein Promise sein, der in ein BlockingResponse aufgelöst wird.

filter

webRequest.RequestFilter. Eine Reihe von Filtern, die die gesendeten Ereignisse an diesen Listener einschränkt.

extraInfoSpec Optional

array von string. Zusätzliche Optionen für das Ereignis. Sie können einen der folgenden Werte übergeben:

  • "blocking", um die Anfrage synchron zu machen, damit Sie Anfrage- und Antwortheader ändern können
  • "responseHeaders", um die Antwortheader im details-Objekt einzuschließen, das an den Listener übergeben wird

Zusätzliche Objekte

details

cookieStoreId

string. Wenn die Anfrage von einem in einer kontextuellen Identität geöffneten Tab stammt, die Cookie-Store-ID der kontextuellen Identität. Siehe Arbeiten mit kontextuellen Identitäten für weitere Informationen.

documentUrl

string. URL des Dokuments, in dem die Ressource geladen wird. Wenn beispielsweise die Webseite unter "https://example.com" ein Bild oder ein iframe enthält, ist die documentUrl für das Bild oder das iframe "https://example.com". Für ein Top-Level-Dokument ist documentUrl undefiniert.

frameAncestors

array. Informationen zu jedem Dokument in der Frame-Hierarchie bis hin zum obersten Dokument. Das erste Element im Array enthält Informationen über das unmittelbar übergeordnete Dokument des angeforderten Dokuments, und das letzte Element Informationen über das oberste Dokument. Wenn der Ladevorgang für das oberste Dokument ist, ist dieses Array leer.

url

string. Die URL, von der das Dokument geladen wurde.

frameId

integer. Die frameId des Dokuments. details.frameAncestors[0].frameId ist gleich details.parentFrameId.

frameId

integer. Null, wenn die Anfrage im Hauptframe erfolgt; ein positiver Wert ist die ID eines Unterframes, in dem die Anfrage erfolgt. Wenn das Dokument eines (Unter-)Frames geladen wird (type ist main_frame oder sub_frame), gibt frameId die ID dieses Frames an, nicht die ID des äußeren Frames. Frame-IDs sind eindeutig innerhalb eines Tabs.

fromCache

boolean. Ob die Antwort aus dem Festplattencache abgerufen wurde.

incognito

boolean. Ob die Anfrage aus einem privaten Browsing-Fenster stammt.

ip

string. Die IP-Adresse des Servers, zu dem die Anfrage gesendet wurde. Es kann eine wörtliche IPv6-Adresse sein.

method

string. Standard HTTP-Methode: beispielsweise "GET" oder "POST".

originUrl

string. URL der Ressource, die die Anfrage ausgelöst hat. Beispielsweise, wenn "https://example.com" einen Link enthält und der Benutzer auf diesen Link klickt, dann ist die originUrl für die resultierende Anfrage "https://example.com".

Die originUrl ist oft, aber nicht immer, dieselbe wie die documentUrl. Beispielsweise, wenn eine Seite ein iframe enthält und das iframe einen Link enthält, der ein neues Dokument in das iframe lädt, dann ist die documentUrl für die resultierende Anfrage das Parent-Dokument des iframes, aber die originUrl ist die URL des Dokuments im iframe, das den Link enthielt.

parentFrameId

integer. ID des Frames, der den Frame enthält, der die Anfrage gesendet hat. Auf -1 gesetzt, wenn kein übergeordneter Frame existiert.

proxyInfo

object. Diese Eigenschaft ist nur vorhanden, wenn die Anfrage über einen Proxy erfolgt. Sie enthält die folgenden Eigenschaften:

host

string. Der Hostname des Proxy-Servers.

port

integer. Die Portnummer des Proxy-Servers.

type

string. Der Typ des Proxy-Servers. Einer von:

  • "http": HTTP-Proxy (oder SSL CONNECT für HTTPS)
  • "https": HTTP-Proxydurchleitung über TLS-Verbindung zum Proxy
  • "socks": SOCKS v5 Proxy
  • "socks4": SOCKS v4 Proxy
  • "direct": Kein Proxy
  • "unknown": Unbekannter Proxy
username

string. Benutzername für den Proxy-Dienst.

proxyDNS

boolean. True, wenn der Proxy die Domainnamenauflösung basierend auf dem angegebenen Hostnamen durchführt, was bedeutet, dass der Client keine eigene DNS-Abfrage durchführen sollte.

failoverTimeout

integer. Ausweich-Timeout in Sekunden. Wenn die Proxy-Verbindung fehlschlägt, wird der Proxy für diesen Zeitraum nicht erneut verwendet.

requestId

string. Die ID der Anfrage. Anfrage-IDs sind innerhalb einer Browsersitzung eindeutig, sodass Sie sie verwenden können, um verschiedene Ereignisse mit derselben Anfrage in Verbindung zu bringen.

responseHeaders Optional

webRequest.HttpHeaders. Die HTTP-Antwortheader, die für diese Anfrage empfangen wurden.

statusCode

integer. Standard HTTP-Statuscode, der vom Server zurückgegeben wurde.

statusLine

string. HTTP-Statuszeile der Antwort oder die Zeichenkette 'HTTP/0.9 200 OK' für HTTP/0.9-Antworten (d.h. Antworten ohne Statuszeile).

tabId

integer. ID des Tabs, in dem die Anfrage erfolgt. Auf -1 gesetzt, wenn die Anfrage nicht mit einem Tab in Zusammenhang steht.

thirdParty

boolean. Gibt an, ob die Anfrage und ihre Inhaltsfensterhierarchie von Drittanbietern stammen.

timeStamp

number. Der Zeitpunkt, zu dem dieses Ereignis ausgelöst wurde, in Millisekunden seit der Epoche.

type

webRequest.ResourceType. Der Typ der angeforderten Ressource: zum Beispiel "image", "script", "stylesheet".

url

string. Ziel der Anfrage.

urlClassification

object. Die Art der Verfolgung, die mit der Anfrage verbunden ist, wenn die Anfrage von Firefox Tracking Protection klassifiziert wird. Dies ist ein Objekt mit den folgenden Eigenschaften:

firstParty

array von string. Klassifizierungsflags für die Erstanbieter der Anfrage.

thirdParty

array von string. Klassifizierungsflags für die Anfrage oder die Drittanbieter der Fensterhierarchie.

Die Klassifizierungsflags umfassen:

  • fingerprinting und fingerprinting_content: zeigt an, dass die Anfrage an Fingerprinting beteiligt ist ("eine Herkunft, die gefunden wurde, um Fingerprinting durchzuführen").
    • fingerprinting zeigt an, dass die Domain in der Kategorie Fingerprinting und Verfolgung ist. Beispiele für diese Art von Domain sind Werbetreibende, die ein Profil mit dem besuchenden Benutzer verknüpfen möchten.
    • fingerprinting_content zeigt an, dass die Domain in der Kategorie Fingerprinting, aber nicht in der Kategorie Verfolgung ist. Beispiele für diese Art von Domain sind Zahlungsanbieter, die Fingerprinting-Techniken verwenden, um den besuchenden Benutzer zur Betrugsvermeidung zu identifizieren.
  • cryptomining und cryptomining_content: ähnlich wie die Fingerprinting-Kategorie, aber für Cryptomining-Ressourcen.
  • tracking, tracking_ad, tracking_analytics, tracking_social, und tracking_content: zeigt an, dass die Anfrage an Verfolgung beteiligt ist. tracking ist jede generische Verfolgungsanfrage, die Anhänge ad, analytics, social und content identifizieren die Art des Trackers.
  • emailtracking und emailtracking_content: zeigt an, dass die Anfrage an der Verfolgung von E-Mails beteiligt ist.
  • any_basic_tracking: ein Meta-Flag, das Verfolgungs- und Fingerprinting-Flags kombiniert, außer tracking_content und fingerprinting_content.
  • any_strict_tracking: ein Meta-Flag, das alle Verfolgungs- und Fingerprinting-Flags kombiniert.
  • any_social_tracking: ein Meta-Flag, das alle sozialen Verfolgungs-Flags kombiniert.

Sie können weitere Informationen zu Trackertypen auf der disconnect.me Website finden. Der content-Anhang zeigt Tracker an, die Inhalte verfolgen und bereitstellen. Das Blockieren schützt Benutzer, kann jedoch dazu führen, dass Websites fehlerhaft angezeigt werden oder Elemente nicht angezeigt werden.

Browser-Kompatibilität

Beispiele

Dieser Code setzt ein zusätzliches Cookie, wenn eine Ressource von der Ziel-URL angefordert wird:

js
let targetPage =
  "https://developer.mozilla.org/en-US/Firefox/Developer_Edition";

// Add the new header to the original array,
// and return it.
function setCookie(e) {
  const setMyCookie = {
    name: "Set-Cookie",
    value: "my-cookie1=my-cookie-value1",
  };
  e.responseHeaders.push(setMyCookie);
  return { responseHeaders: e.responseHeaders };
}

// Listen for onHeaderReceived for the target page.
// Set "blocking" and "responseHeaders".
browser.webRequest.onHeadersReceived.addListener(
  setCookie,
  { urls: [targetPage] },
  ["blocking", "responseHeaders"],
);

Dieser Code macht dasselbe wie das vorherige Beispiel, außer dass der Listener asynchron ist, ein Promise zurückgibt, das mit den neuen Headern aufgelöst wird:

js
const targetPage =
  "https://developer.mozilla.org/en-US/Firefox/Developer_Edition";

// Return a Promise that sets a timer.
// When the timer fires, resolve the promise with
// modified set of response headers.
function setCookieAsync(e) {
  const asyncSetCookie = new Promise((resolve, reject) => {
    setTimeout(() => {
      const setMyCookie = {
        name: "Set-Cookie",
        value: "my-cookie1=my-cookie-value1",
      };
      e.responseHeaders.push(setMyCookie);
      resolve({ responseHeaders: e.responseHeaders });
    }, 2000);
  });

  return asyncSetCookie;
}

// Listen for onHeaderReceived for the target page.
// Set "blocking" and "responseHeaders".
browser.webRequest.onHeadersReceived.addListener(
  setCookieAsync,
  { urls: [targetPage] },
  ["blocking", "responseHeaders"],
);

Hinweis: Diese API basiert auf der chrome.webRequest API von Chromium. Diese Dokumentation leitet sich von web_request.json im Chromium-Code ab.