在 Chrome 中加载页面时,我使用此代码记录编码后的响应大小:
const puppeteer = require("puppeteer");
(async function() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page._client.on("Network.loadingFinished", data => {
console.log("finished", { encodedDataLength: data.encodedDataLength });
});
// await page.setRequestInterception(true);
// page.on("request", async request => {
// request.continue();
// });
await page.goto("http://example.com");
await browser.close();
})();
这是输出:
finished { encodedDataLength: 967 }
但是,如果我取消注释代码片段中的四行,输出将更改为:
finished { encodedDataLength: 0 }
这确实有一定道理,因为截获的请求可能已被客户端以某种方式修改,并且之后不会再次 gzip 压缩。
但是,有没有办法访问原始 gzip 响应大小?
Chrome 跟踪也不包括 gzipped 大小:
"encodedDataLength": 0, "decodedBodyLength": 1270,
最佳答案
对于这种情况,我们可以使用 Content-Length
header 值。
Google 的好人决定他们不会修复 some weird bugs与 encodedDataLength
密切相关。
检查下面的代码和结果以查看证明。
page.on("request", async request => {
request.continue();
});
// Monitor using _client
page._client.on("Network.responseReceived", ({ response }) => {
console.log("responseReceived", [
response.headers["Content-Length"],
response.encodedDataLength
]);
});
page._client.on("Network.loadingFinished", data => {
console.log("loadingFinished", [data.encodedDataLength]);
});
// Monitor using CDP
const devToolsResponses = new Map();
const devTools = await page.target().createCDPSession();
await devTools.send("Network.enable");
devTools.on("Network.responseReceived", event => {
devToolsResponses.set(event.requestId, event.response);
});
devTools.on("Network.loadingFinished", event => {
const response = devToolsResponses.get(event.requestId);
const encodedBodyLength =
event.encodedDataLength - response.headersText.length;
console.log(`${encodedBodyLength} bytes for ${response.url}`);
});
结果没有 setRequestInterception:
responseReceived [ '606', 361 ]
loadingFinished [ 967 ]
606 bytes for http://example.com/
结果与 setRequestInterception:
responseReceived [ '606', 0 ]
loadingFinished [ 0 ]
-361 bytes for http://example.com/
Content-Length
header 在各个方面都更加可靠。
关于javascript - 使用 Puppeteer 拦截请求时如何获取原始编码的响应大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831249/