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
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. Gibttrue
zurück, wenn der Listener aktiv ist, andernfallsfalse
.
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"
inextraInfoSpec
enthalten ist.
Gibt zurück:
webRequest.BlockingResponse
. Wenn"blocking"
imextraInfoSpec
-Parameter angegeben ist, gibt der Ereignis-Listener einBlockingResponse
-Objekt zurück und kann dessenresponseHeaders
-Eigenschaft festlegen. In Firefox kann der Rückgabewert einPromise
sein, der in einBlockingResponse
aufgelöst wird. filter
-
webRequest.RequestFilter
. Eine Reihe von Filtern, die die gesendeten Ereignisse an diesen Listener einschränkt. extraInfoSpec
Optional-
array
vonstring
. 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 imdetails
-Objekt einzuschließen, das an den Listener übergeben wird
Zusätzliche Objekte
details
-
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 diedocumentUrl
für das Bild oder das iframe "https://example.com". Für ein Top-Level-Dokument istdocumentUrl
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. 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
istmain_frame
odersub_frame
), gibtframeId
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 dieoriginUrl
für die resultierende Anfrage "https://example.com".Die
originUrl
ist oft, aber nicht immer, dieselbe wie diedocumentUrl
. 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 diedocumentUrl
für die resultierende Anfrage das Parent-Dokument des iframes, aber dieoriginUrl
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
vonstring
. Klassifizierungsflags für die Erstanbieter der Anfrage. thirdParty
-
array
vonstring
. Klassifizierungsflags für die Anfrage oder die Drittanbieter der Fensterhierarchie.
Die Klassifizierungsflags umfassen:
fingerprinting
undfingerprinting_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
undcryptomining_content
: ähnlich wie die Fingerprinting-Kategorie, aber für Cryptomining-Ressourcen.tracking
,tracking_ad
,tracking_analytics
,tracking_social
, undtracking_content
: zeigt an, dass die Anfrage an Verfolgung beteiligt ist.tracking
ist jede generische Verfolgungsanfrage, die Anhängead
,analytics
,social
undcontent
identifizieren die Art des Trackers.emailtracking
undemailtracking_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ßertracking_content
undfingerprinting_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:
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:
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.