javascript - 使用 Puppeteer 拦截请求时如何获取原始编码的响应大小?

标签 javascript puppeteer

在 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 bugsencodedDataLength 密切相关。

检查下面的代码和结果以查看证明。

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/

使用多个 gzip 工具进行测试。到处都是同样的结果。 enter image description here

Content-Length header 在各个方面都更加可靠。

关于javascript - 使用 Puppeteer 拦截请求时如何获取原始编码的响应大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831249/

相关文章:

javascript - Puppeteer 在网站控制台中运行 javascript (devtools)

javascript - Puppeteer:如何在嵌套选择器中获取 img src?

javascript - 解析特定语言环境中的日期字符串(不是时区!)

iframe - 如何使用 headless chrome 获取带有 puppeteer 的 Iframe 的内部 Html?

javascript - 允许在 Puppeteer 的所有站点上运行 Flash

javascript - 在 javascript 函数中更改 span 类属性值

javascript - 如何从 PostgreSQL 中提取数据,处理,然后存储在 javascript 中?

javascript - Facebook用户认证流程

javascript - 编辑器 js : Tap in created table

javascript - Controller 方法中的本地 JSON 文件和数据