webRequest.onBeforeSendHeaders
Dieses Ereignis wird ausgelöst, bevor HTTP-Daten gesendet werden, jedoch nachdem alle HTTP-Header verfügbar sind. Dies ist eine gute Stelle, um zuzuhören, wenn Sie HTTP-Anfrageheader ändern möchten.
Um die Anfrageheader zusammen mit den restlichen Anfragedaten an den Listener zu übergeben, fügen Sie "requestHeaders" in das extraInfoSpec Array ein.
Um die Header synchron zu ändern: Fügen Sie "blocking" in extraInfoSpec ein, dann geben Sie in Ihrem Ereignis-Listener eine BlockingResponse mit einer Eigenschaft namens requestHeaders zurück, deren Wert die zu sendenden Anfrageheader umfasst.
Um die Header asynchron zu ändern: Fügen Sie "blocking" in extraInfoSpec ein, dann geben Sie in Ihrem Ereignis-Listener ein Promise zurück, das mit einer BlockingResponse aufgelöst wird.
Wenn Sie "blocking" verwenden, müssen Sie die "webRequestBlocking" API-Erlaubnis in Ihrer manifest.json haben.
Es ist möglich, dass Erweiterungen hier in Konflikt geraten. Wenn zwei Erweiterungen auf onBeforeSendHeaders für dieselbe Anfrage hören, sieht der zweite Listener Änderungen, die der erste Listener vorgenommen hat, und kann Änderungen des ersten Listeners rückgängig machen. Wenn zum Beispiel der erste Listener einen Cookie-Header hinzufügt und der zweite Listener alle Cookie-Header entfernt, gehen die Änderungen des ersten Listeners verloren. Wenn Sie die Header sehen möchten, die tatsächlich gesendet werden, ohne das Risiko, dass eine andere Erweiterung sie später ä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, die mit Zwischenspeicherung zu tun haben (zum Beispiel Cache-Control, If-Modified-Since, If-None-Match), werden nie gesendet. Auch kann sich das Verhalten hier zwischen den Browsern unterscheiden.
Laut Spezifikation sind Header-Namen nicht groß-/kleinschreibungssensitiv. Das bedeutet, dass zum Abgleichen eines bestimmten Headers der Listener 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 Header-Namens, wie sie vom Browser generiert wurde. Wenn der Listener der Erweiterung die Groß-/Kleinschreibung ändert, bleibt diese Änderung nicht bestehen.
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 diesem Ereignis einen Listener hinzu.
removeListener(listener)-
Stoppt das Zuhören für dieses Ereignis. Das
listener-Argument ist der Listener, der entfernt werden soll. 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 Anfrageheader, wenn Sie"requestHeaders"inextraInfoSpeceingeschlossen haben. Siehe den Abschnitt details für weitere Informationen.
Rückgabe:
webRequest.BlockingResponse. Wenn"blocking"im ParameterextraInfoSpecangegeben ist, sollte der Ereignis-Listener einBlockingResponse-Objekt zurückgeben und kann dessenrequestHeaders-Eigenschaft festlegen. filter-
webRequest.RequestFilter. Eine Menge von Filtern, die die Ereignisseingrenzt, 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 Anfrageheader ändern können"requestHeaders": schließt die Anfrageheader imdetails-Objekt ein, das an den Listener übergeben wird
Zusätzliche Objekte
>details
documentIdOptional-
string. Die UUID des Dokuments, das die Anfrage stellt. 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 ausgeführt wird, der in einer kontextuellen Identität geöffnet ist, die Cookie-Speicher-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. Zum Beispiel, wenn die Webseite unter "https://example.com" ein Bild oder ein iframe enthält, dann wird diedocumentUrlfür das Bild oder das iframe "https://example.com" sein. Für ein Dokument auf oberster Ebene istdocumentUrlundefiniert. frameAncestors-
array. Beinhaltet Informationen zu jedem Dokument in der Rahmenhierarchie bis zum Dokument auf oberster Ebene. Das erste Element im Array beinhaltet Informationen über das unmittelbar übergeordnete Dokument des angeforderten Dokuments, und das letzte Element beinhaltet Informationen über das Dokument auf oberster Ebene. Wenn der Ladevorgang tatsächlich für das Dokument auf höchster Ebene ist, dann ist dieses Array leer. frameId-
integer. Null, wenn die Anfrage im Hauptframe ausgeführt wird; ein positiver Wert ist die ID eines Unterframes, in dem die Anfrage stattfindet. Wenn das Dokument eines (Unter-)Frames geladen wird (typeistmain_frameodersub_frame), zeigtframeIddie ID dieses Frames an, nicht die des äußeren Frames. Frame-IDs sind einzigartig innerhalb eines Tabs. frameType-
string. Der Typ des Rahmens, in dem die Anfrage stattgefunden hat. Gibt die Werte"outermost_frame","fenced_frame"oder"sub_frame"zurück. incognito-
boolean. Ob die Anfrage aus einem privaten Browserfenster stammt. method-
string. Standard HTTP-Methode: zum Beispiel "GET" oder "POST". originUrl-
string. URL der Ressource, die die Anfrage ausgelöst hat. Zum Beispiel, wenn "https://example.com" einen Link enthält und der Benutzer auf den Link klickt, dann ist dieoriginUrlder resultierenden Anfrage "https://example.com".Die
originUrlist oft, aber nicht immer, dieselbe wie diedocumentUrl. Zum Beispiel, wenn eine Seite ein iframe enthält und das iframe einen Link enthält, der ein neues Dokument in das iframe ladet, dann wird diedocumentUrlder resultierenden Anfrage das übergeordnete Dokument des iframes sein, aber dieoriginUrlwird die URL des Dokuments innerhalb des iframes sein, das den Link enthielt. parentDocumentIdOptional-
string. Ein UUID des übergeordneten Dokuments, dem der Rahmen gehört. Nicht gesetzt, wenn kein Elternteil vorhanden ist. parentFrameId-
integer. ID des Rahmens, der den Rahmen enthält, der die Anfrage gesendet hat. Auf -1 gesetzt, wenn kein übergeordneter Rahmen existiert. proxyInfo-
object. Diese Eigenschaft ist nur vorhanden, wenn die Anfrage über einen Proxy weitergeleitet wird. Es 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-Proxying ü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 Proxydienst. proxyDNS-
boolean. Wahr, wenn der Proxy die Auflösung von Domainnamen basierend auf dem angegebenen Hostnamen durchführt, sodass der Client nicht seine eigene DNS-Suche durchführen muss. 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-Anfrageheader, die mit dieser Anfrage gesendet werden. requestId-
string. Die ID der Anfrage. Anfrage-IDs sind einzigartig innerhalb einer Browsersitzung, sodass Sie sie verwenden können, um verschiedene Ereignisse zuzuordnen, die mit derselben Anfrage verbunden sind. tabId-
integer. ID des Tabs, in dem die Anfrage stattfindet. Auf -1 gesetzt, wenn die Anfrage nicht mit einem Tab zu tun hat. thirdParty-
boolean. Zeigt an, ob die Anfrage und ihre Inhaltsfenster-Hierarchie von Dritten stammen. timeStamp-
number. Die Zeit, zu der 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. Der mit der Anfrage verbundene Tracking-Typ, falls die Anfrage durch den Firefox-Tracking-Schutz klassifiziert wird. Dies ist ein Objekt mit diesen Eigenschaften:firstParty-
arrayvonstring. Klassifizierungsflags für die Erstanbieter der Anfrage. thirdParty-
arrayvonstring. Klassifizierungsflags für die Anfrage oder die Dritten in ihrer Fenster-Hierarchie.
Die Klassifizierungsflags umfassen:
fingerprintingundfingerprinting_content: zeigt an, dass die Anfrage am Fingerprinting beteiligt ist ("eine Herkunft gefunden, die zu Fingerprinting führt").fingerprintingzeigt an, dass die Domain zur Fingerprinting- und Tracking-Kategorie gehört. Beispiele für diese Art von Domain sind Werbetreibende, die ein Profil mit dem besuchenden Benutzer in Verbindung bringen möchten.fingerprinting_contentzeigt an, dass die Domain zur Fingerprinting-Kategorie, aber nicht zur Tracking-Kategorie gehört. Beispiele für diese Art von Domain sind Zahlungsanbieter, die Fingerprinting-Techniken verwenden, um den besuchenden Benutzer zu Identifikationszwecken bei der Betrugsbekämpfung zu erkennen.
cryptominingundcryptomining_content: ähnlich zur Fingerprinting-Kategorie, jedoch für Kryptomining-Ressourcen.tracking,tracking_ad,tracking_analytics,tracking_socialundtracking_content: zeigt an, dass die Anfrage für das Tracking verwendet wird.trackingist jede generische Tracking-Anfrage, dasad,analytics,socialundcontentSuffix identifiziert den Typ des Trackers.emailtrackingundemailtracking_content: zeigt an, dass die Anfrage zur Verfolgung von E-Mails verwendet wird.any_basic_tracking: ein Meta-Flag, das Tracking- und Fingerprinting-Flags kombiniert, jedochtracking_contentundfingerprinting_contentausschließt.any_strict_tracking: ein Meta-Flag, das alle Tracking- und Fingerprinting-Flags kombiniert.any_social_tracking: ein Meta-Flag, das alle sozialen Tracking-Flags kombiniert.
Weitere Informationen zu Träckertypen finden Sie auf der disconnect.me Website. Das
content-Suffix zeigt Tracker an, die Inhalte zuordnen und ausliefern. Die Blockierung dieser Elemente schützt die Nutzer, kann jedoch dazu führen, dass Websites nicht oder nicht vollständig angezeigt werden.
Beispiele
Dieser Code ändert den "User-Agent"-Header, sodass sich der Browser als Opera 12.16 identifiziert, jedoch nur beim Besuch 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, mit dem Unterschied, 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 der chrome.webRequest API von Chromium. Diese Dokumentation stammt aus web_request.json im Chromium-Code.