node.js - 将整个 HTTP 通信转储为 nodejs 中的原始数据

标签 node.js http dump

我想知道是否可以在整个 HTTP 请求+响应通过网络时转储它。

我不想获取方法、路径信息、查询字符串、标题、cookie、正文等等。理论上我可以自己组装原始数据,但是我不需要 HTTP 库,对吧?

此外,我想准确地转储通过网络传输的字节

我想要这张图片中的原始数据

http raw data

取自 this page .

我正在使用当前的 node.js 作为带有 request 的 HTTP client。它是纯 HTTP(无 HTTPS)。

在 node.js 中安装代理是一种选择,但我不坚持使用库。我可以想象包装套接字的读写函数,但是我看不到如何到达使用的套接字。

最佳答案

请求模块返回增强的 native 对象。返回值是一个增强的 http.ClientRequest 对象(种类),回调提供一个增强的 http.IncomingMessage 作为第二个参数。您可以使用各种属性来重建响应,但不能直接从这里获取。 Node 提供的原生 http API 抽象出原始响应。

(IncomingMessageClientRequest 的文档在这里:https://nodejs.org/api/http.html)。

更有趣的是,这些都是对 net.Socket 的抽象。如果你使用原生 http API,你可以在发送 ClientRequest 之前监听这个 Socket(使用 .end)。这将为您提供一个包含 HTTP 响应的 Buffer

let http = require("http");
let nativeRequest = http.get({
    host: "google.com"
}); //get a ClientRequest object
nativeRequest.on('socket', function (socket) {
    socket.on('data', function (data) { console.log(data.toString()); });
});
nativeRequest.end();

这看起来不能让您窥探出站请求,但它对响应很有用。

向后移动抽象链,这适用于 Request。我将跳过该片段,因为它与之前的和即将到来的几乎相同。

为了获得请求,我们可以在 Socket 的内部四处寻找,看看是否有我们可以滥用的东西。 Object.keys(socket) 返回以下数组:

[
   "connecting",
   "_hadError",
   "_handle",
   "_parent",
   "_host",
   "_readableState",
   "readable",
   "domain",
   "_events",
   "_eventsCount",
   "_maxListeners",
   "_writableState",
   "writable",
   "allowHalfOpen",
   "destroyed",
   "_bytesDispatched",
   "_sockname",
   "_pendingData",
   "_pendingEncoding",
   "server",
   "_server",
   "parser",
   "_httpMessage"
]

事实上,如果我们查看可疑的 _pendingData,我们可以在请求发送之前查看它:

let request = require('request');

let req = request("http://google.com", function (e, r, d) {});
req.on('socket', function (socket) {
    console.log("========\nRequest\n========")
    console.log(JSON.stringify(socket._pendingData, null, 3));
    console.log("========\nResponse\n========");
    socket.on('data', function (data) { console.log(data.toString()); });
});

关于node.js - 将整个 HTTP 通信转储为 nodejs 中的原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50688524/

相关文章:

c# - 更改每个请求的安全协议(protocol) (HttpClient)

python - 欺骗 HTTP 请求的源 IP 地址

java - JVM内存转储

javascript - Javascript 中链表和 Node 的问题

http - 多个客户端如何同时连接到服务器上的一个端口,比如 80?

javascript - 使用 puppeteer 进行抓取并返回 JSON

C# - 我无法将我的进程输出转储到文件中

android - 在c中使用fwrite()转储内存

node.js - 从 Java(Spring Boot)或 Node.js 检查/连接到在 docker 中运行的 Redis

node.js - 删除当前发出事件的事件监听器