Extensión de Chrome para leer la respuesta HTTP
Tengo esta extensión de Chrome que modifica el encabezado de las solicitudes antes de enviarlas. Ahora me gustaría poder, dentro de la misma extensión, comprobar el encabezado de la respuesta. Busqué en las API de extensión de Chrome pero no pude encontrar nada de interés.
Este es el código que uso para modificar el encabezado de la solicitud, tal vez te sea útil saber cómo lo hago.
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {/*do something*/},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]);
¿Alguien sabe cómo hacerlo o puede indicarme una fuente interesante? Gracias
Logré capturar todas las solicitudes y respuestas HTTP realizadas por un sitio web, inyectando un script en DOM. Existen varios métodos para hacerlo según sus necesidades y su entorno, por ejemplo, ManifestV3/V2. Aquí está el que he usado:
inyectar.js:
var s = document.createElement('script');
// must be listed in web_accessible_resources in manifest.json
s.src = chrome.runtime.getURL('injected.js');
s.onload = function() {
this.remove();
};
(document.head || document.documentElement).appendChild(s);
Esto inyectaría injection.js en sitios web que coincidan con "content_scripts" y "coinciden" en manifest.json. Mencione contentscript.js e inject.js en "js". Consulte manifest.json al final de la respuesta.
Ahora, el código en injection.js que realiza la captura real de solicitudes y respuestas está inspirado en Cómo capturamos solicitudes AJAX desde una pestaña de un sitio web con una extensión de Chrome . Consulte también la sección de comentarios de ese artículo.
inyectado.js:
(function(xhr) {
var XHR = XMLHttpRequest.prototype;
var open = XHR.open;
var send = XHR.send;
var setRequestHeader = XHR.setRequestHeader;
XHR.open = function(method, url) {
this._method = method;
this._url = url;
this._requestHeaders = {};
this._startTime = (new Date()).toISOString();
return open.apply(this, arguments);
};
XHR.setRequestHeader = function(header, value) {
this._requestHeaders[header] = value;
return setRequestHeader.apply(this, arguments);
};
XHR.send = function(postData) {
this.addEventListener('load', function() {
var endTime = (new Date()).toISOString();
var myUrl = this._url ? this._url.toLowerCase() : this._url;
if(myUrl) {
if (postData) {
if (typeof postData === 'string') {
try {
// here you get the REQUEST HEADERS, in JSON format, so you can also use JSON.parse
this._requestHeaders = postData;
} catch(err) {
console.log('Request Header JSON decode failed, transfer_encoding field could be base64');
console.log(err);
}
} else if (typeof postData === 'object' || typeof postData === 'array' || typeof postData === 'number' || typeof postData === 'boolean') {
// do something if you need
}
}
// here you get the RESPONSE HEADERS
var responseHeaders = this.getAllResponseHeaders();
if ( this.responseType != 'blob' && this.responseText) {
// responseText is string or null
try {
// here you get RESPONSE TEXT (BODY), in JSON format, so you can use JSON.parse
var arr = this.responseText;
// printing url, request headers, response headers, response body, to console
console.log(this._url);
console.log(JSON.parse(this._requestHeaders));
console.log(responseHeaders);
console.log(JSON.parse(arr));
} catch(err) {
console.log("Error in responseType try catch");
console.log(err);
}
}
}
});
return send.apply(this, arguments);
};
})(XMLHttpRequest);
manifiesto.json:
{
"manifest_version": 3,
"name": "Extension Name",
"description": "Some Desc.",
"version": "1.1",
"content_scripts": [{
"matches": ["*://website.com/*"],
"run_at": "document_start",
"js": ["contentscript.js", "inject.js"]
}],
"web_accessible_resources": [{
"resources": ["injected.js"],
"matches": ["*://website.com/*"]
}]
}
Para MV2 el último bloque es simplemente"web_accessible_resources": ["injected.js"]
Vea el ejemplo de encabezados en vivo.
http://code.google.com/chrome/extensions/examples/api/debugger/live-headers.zip
EDITAR: Para la posteridad, puede encontrar una versión de live-headers.zip en su sitio archivado de errores/parches https://chromiumcodereview.appspot.com/9289057
Con la última revisión (2021) ya no incluye el zip, pero aquí está el directorio https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/debugger/live -encabezados/?pathrev=226223