webRequest.onBeforeSendHeaders
Dieses Ereignis wird ausgelöst, bevor HTTP-Daten gesendet werden, aber nachdem alle HTTP-Header verfügbar sind. Dies ist ein guter Zeitpunkt, um zuzuhören, wenn Sie die HTTP-Anforderungsheader ändern möchten.
Um die Anforderungsheader zusammen mit den restlichen Anforderungsdaten an den Listener zu übergeben, geben Sie "requestHeaders" im extraInfoSpec-Array an.
Um die Header synchron zu ändern: Übergeben Sie "blocking" in extraInfoSpec, und geben Sie in Ihrem Ereignislistener eine BlockingResponse mit einer Eigenschaft namens requestHeaders zurück, deren Wert die zu sendenden Anforderungsheader sind.
Um die Header asynchron zu ändern: Übergeben Sie "blocking" in extraInfoSpec, und geben Sie in Ihrem Ereignislistener ein Promise zurück, das mit einer BlockingResponse aufgelöst wird.
Wenn Sie "blocking" verwenden, müssen Sie die API-Berechtigung "webRequestBlocking" in Ihrer manifest.json haben.
Es ist möglich, dass Erweiterungen hier in Konflikt geraten. Wenn zwei Erweiterungen onBeforeSendHeaders für dieselbe Anfrage abhören, sieht der zweite Listener die vom ersten Listener vorgenommenen Änderungen und kann alle Änderungen des ersten Listeners rückgängig machen. Wenn der erste Listener beispielsweise einen Cookie-Header hinzufügt und der zweite Listener alle Cookie-Header entfernt, gehen die Änderungen des ersten Listeners verloren. Wenn Sie die tatsächlich gesendeten Header sehen möchten, ohne dass eine andere Erweiterung sie anschließend ändert, verwenden Sie onSendHeaders, obwohl Sie bei diesem Ereignis keine Header ändern können.
Nicht alle tatsächlich gesendeten Header sind immer in requestHeaders enthalten. Insbesondere Header im Zusammenhang mit dem Caching (z. B. Cache-Control, If-Modified-Since, If-None-Match) werden nie gesendet. Auch hier kann das Verhalten zwischen den Browsern unterschiedlich sein.
Laut Spezifikation sind Header-Namen nicht case-sensitiv. Das bedeutet, dass der Listener, um einen bestimmten Header abzugleichen, den Namen in Kleinbuchstaben umwandeln sollte, bevor er ihn vergleicht:
for (const header of e.requestHeaders) {
if (header.name.toLowerCase() === desiredHeader) {
// process header
}
}
Der Browser bewahrt die ursprüngliche Groß-/Kleinschreibung des von ihm generierten Header-Namens. Wenn der Listener der Erweiterung die Groß-/Kleinschreibung ändert, wird diese Änderung nicht beibehalten.
Syntax
browser.webRequest.onBeforeSendHeaders.addListener(
listener, // function
filter, // object
extraInfoSpec // optional array of strings
)
browser.webRequest.onBeforeSendHeaders.removeListener(listener)
browser.webRequest.onBeforeSendHeaders.hasListener(listener)
Ereignisse haben drei Funktionen:
addListener(listener, filter, extraInfoSpec)-
Fügt einen Listener zu diesem Ereignis hinzu.
removeListener(listener)-
Beendet das Lauschen auf dieses Ereignis. Das
listener-Argument ist der zu entfernende Listener. hasListener(listener)-
Überprüft, ob
listenerfür dieses Ereignis registriert ist. Gibttruezurück, wenn er zuhört, andernfallsfalse.
addListener-Syntax
>Parameter
listener-
Die Funktion, die aufgerufen wird, wenn dieses Ereignis eintritt. Der Funktion wird folgendes Argument übergeben:
details-
object. Details der Anfrage. Dies umfasst Anforderungsheader, wenn Sie"requestHeaders"inextraInfoSpecangegeben haben. Weitere Informationen finden Sie im Abschnitt details.
Rückgabe:
webRequest.BlockingResponse. Wenn"blocking"im ParameterextraInfoSpecangegeben ist, sollte der Ereignislistener einBlockingResponse-Objekt zurückgeben und kann dessenrequestHeaders-Eigenschaft festlegen. filter-
webRequest.RequestFilter. Eine Menge von Filtern, die die Ereignisse einschränken, die an diesen Listener gesendet werden. extraInfoSpecOptional-
arrayvonstring. Zusätzliche Optionen für das Ereignis. Sie können einen der folgenden Werte übergeben:"blocking": macht die Anfrage synchron, sodass Sie die Anforderungsheader ändern können"requestHeaders": schließt die Anforderungsheader in das an den Listener übergebenedetails-Objekt ein
Zusätzliche Objekte
>details
documentIdOptional-
string. Die UUID des Dokuments, das die Anfrage stellt. Weitere Informationen finden Sie im Artikel Arbeiten mit documentId. documentLifecycle-
string. Der Lebenszyklus, in dem sich das Dokument befindet. Gibt die Werte"prerender","active","cached"oder"pending_deletion"zurück. -
string. Wenn die Anfrage von einem Tab in einer kontextuellen Identität stammt, die Cookie-Store-ID der kontextuellen Identität. Weitere Informationen finden Sie unter Arbeiten mit kontextuellen Identitäten. 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 diedocumentUrlfür das Bild oder das iframe "https://example.com". Bei einem Dokument auf oberster Ebene istdocumentUrlundefiniert. frameAncestors-
array. Enthält Informationen für jedes Dokument in der Rahmenhierarchie bis zum Dokument auf oberster Ebene. Das erste Element im Array enthält Informationen über den unmittelbaren Elternteil des angeforderten Dokuments, und das letzte Element enthält Informationen über das Dokument auf oberster Ebene. Wenn das Laden tatsächlich für das Dokument auf oberster Ebene erfolgt, ist dieses Array leer. frameId-
integer. Null, wenn die Anfrage im Hauptfenster stattfindet; ein positiver Wert ist die ID eines Unterrahmens, in dem die Anfrage stattfindet. Wenn das Dokument eines (Unter-)Rahmens geladen wird (typeistmain_frameodersub_frame), gibtframeIddie ID dieses Rahmens an, nicht die ID des äußeren Rahmens. Rahmen-IDs sind innerhalb eines Tabs eindeutig. frameType-
string. Der Typ des Rahmens, in dem die Anfrage erfolgte. Gibt die Werte"outermost_frame","fenced_frame"oder"sub_frame"zurück. incognito-
boolean. Gibt an, ob die Anfrage aus einem Fenster im privaten Modus erfolgt. method-
string. Standard-HTTP-Methode, zum Beispiel "GET" oder "POST". originUrl-
string. URL der Ressource, die die Anfrage ausgelöst hat. Wenn "https://example.com" beispielsweise einen Link enthält und der Benutzer auf den Link klickt, ist dieoriginUrlfür die resultierende Anfrage "https://example.com".Die
originUrlist häufig, aber nicht immer, dieselbe wie diedocumentUrl. Wenn eine Seite beispielsweise ein iframe enthält und das iframe einen Link enthält, der ein neues Dokument in das iframe lädt, ist diedocumentUrlfür die resultierende Anfrage das Elterndokument des iframes, aber dieoriginUrlist die URL des Dokuments im iframe, das den Link enthielt. parentDocumentIdOptional-
string. Eine UUID des Elterndokuments, dem das Rahmen gehört. Nicht gesetzt, wenn kein Elternteil vorhanden ist. Weitere Informationen finden Sie im Artikel Arbeiten mit documentId. parentFrameId-
integer. ID des Rahmens, der den Rahmen enthält, der die Anfrage gesendet hat. Wird auf -1 gesetzt, wenn kein Elternrahmen vorhanden ist. 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-Proxy ü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. Wahr, wenn der Proxy die DNS-Auflösung basierend auf dem angegebenen Hostnamen durchführt, was bedeutet, dass der Client keine eigene DNS-Abfrage durchführen sollte. failoverTimeout-
integer. Failover-Timeout in Sekunden. Wenn die Proxy-Verbindung fehlschlägt, wird der Proxy für diesen Zeitraum nicht erneut verwendet.
requestHeadersOptional-
webRequest.HttpHeaders. Die HTTP-Anforderungsheader, die mit dieser Anfrage gesendet werden. requestId-
string. Die ID der Anfrage. Anforderungs-IDs sind innerhalb einer Browsersitzung eindeutig, sodass Sie sie verwenden können, um verschiedene Ereignisse derselben Anfrage zuzuordnen. tabId-
integer. ID des Tabs, in dem die Anfrage stattfindet. Wird auf -1 gesetzt, wenn die Anfrage nicht mit einem Tab verknüpft ist. thirdParty-
boolean. Gibt an, ob die Anfrage und ihre Inhalt-Fenster-Hierarchie Drittanbieter sind. 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 diesen Eigenschaften:firstParty-
arrayvonstring. Klassifizierungsflaggots für den First-Party der Anfrage. thirdParty-
arrayvonstring. Klassifizierungsflaggots für die Anfrage oder die Drittanbieter ihrer Fensterhierarchie.
Die Klassifizierungsflaggen umfassen:
fingerprintingundfingerprinting_content: zeigt an, dass die Anfrage am Fingerprinting beteiligt ist ("ein Ursprung, der zum Fingerprinting gefunden wurde").fingerprintingzeigt an, dass die Domain in der Kategorie Fingerprinting und Tracking ist. Beispiele für diese Art von Domain sind Werbeunternehmen, die ein Profil mit dem besuchenden Benutzer verknüpfen möchten.fingerprinting_contentzeigt an, dass die Domain in der Kategorie Fingerprinting, aber nicht in der Tracking-Kategorie ist. Beispiele für diese Art von Domain sind Zahlungsanbieter, die Fingerprinting-Techniken verwenden, um den besuchenden Benutzer zur Betrugsprävention zu identifizieren.
cryptominingundcryptomining_content: ähnlich zur Fingerprinting-Kategorie, aber für Kryptomining-Ressourcen.tracking,tracking_ad,tracking_analytics,tracking_socialundtracking_content: zeigt an, dass die Anfrage am Tracking beteiligt ist.trackingist jede allgemeine Tracking-Anfrage, diead,analytics,socialundcontent-Suffixe identifizieren die Art des Trackers.emailtrackingundemailtracking_content: zeigt an, dass die Anfrage am Email-Tracking beteiligt ist.any_basic_tracking: ein Meta-Flag, das Tracking- und Fingerprinting-Flaggen kombiniert, mit Ausnahme vontracking_contentundfingerprinting_content.any_strict_tracking: ein Meta-Flag, das alle Tracking- und Fingerprinting-Flaggen kombiniert.any_social_tracking: ein Meta-Flag, das alle sozialen Tracking-Flaggen kombiniert.
Weitere Informationen zu Tracker-Typen finden Sie auf der Website von disconnect.me. Das
content-Suffix zeigt Tracker an, die Inhalte verfolgen und bereitstellen. Das Blockieren dieser Tracker schützt die Benutzer, kann jedoch dazu führen, dass Websites nicht richtig funktionieren oder Elemente nicht angezeigt werden.
Beispiele
Dieser Code ändert den "User-Agent"-Header, sodass der Browser sich als Opera 12.16 identifiziert, jedoch nur bei Besuchen von Seiten unter https://httpbin.org/.
"use strict";
/*
This is the page for which we want to rewrite the User-Agent header.
*/
const targetPage = "https://httpbin.org/*";
/*
Set UA string to Opera 12
*/
const ua =
"Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16";
/*
Rewrite the User-Agent header to "ua".
*/
function rewriteUserAgentHeader(e) {
for (const header of e.requestHeaders) {
if (header.name.toLowerCase() === "user-agent") {
header.value = ua;
}
}
return { requestHeaders: e.requestHeaders };
}
/*
Add rewriteUserAgentHeader as a listener to onBeforeSendHeaders,
only for the target page.
Make it "blocking" so we can modify the headers.
*/
browser.webRequest.onBeforeSendHeaders.addListener(
rewriteUserAgentHeader,
{ urls: [targetPage] },
["blocking", "requestHeaders"],
);
Dieser Code ist genau wie das vorherige Beispiel, außer dass der Listener asynchron ist und ein Promise zurückgibt, das mit den neuen Headern aufgelöst wird:
"use strict";
/*
This is the page for which we want to rewrite the User-Agent header.
*/
const targetPage = "https://httpbin.org/*";
/*
Set UA string to Opera 12
*/
const ua =
"Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16";
/*
Rewrite the User-Agent header to "ua".
*/
function rewriteUserAgentHeaderAsync(e) {
const asyncRewrite = new Promise((resolve, reject) => {
setTimeout(() => {
for (const header of e.requestHeaders) {
if (header.name.toLowerCase() === "user-agent") {
header.value = ua;
}
}
resolve({ requestHeaders: e.requestHeaders });
}, 2000);
});
return asyncRewrite;
}
/*
Add rewriteUserAgentHeader as a listener to onBeforeSendHeaders,
only for the target page.
Make it "blocking" so we can modify the headers.
*/
browser.webRequest.onBeforeSendHeaders.addListener(
rewriteUserAgentHeaderAsync,
{ urls: [targetPage] },
["blocking", "requestHeaders"],
);
Beispielerweiterungen
Browser-Kompatibilität
Hinweis:
Diese API basiert auf Chromiums chrome.webRequest API. Diese Dokumentation basiert auf web_request.json im Chromium-Code.