我想知道是否可以在整个 HTTP 请求+响应通过网络时转储它。
我不想获取方法、路径信息、查询字符串、标题、cookie、正文等等。理论上我可以自己组装原始数据,但是我不需要 HTTP 库,对吧?
此外,我想准确地转储通过网络传输的字节。
我想要这张图片中的原始数据
取自 this page .
我正在使用当前的 node.js
作为带有 request
的 HTTP client。它是纯 HTTP(无 HTTPS)。
在 node.js 中安装代理是一种选择,但我不坚持使用库。我可以想象包装套接字的读写函数,但是我看不到如何到达使用的套接字。
最佳答案
请求模块返回增强的 native 对象。返回值是一个增强的 http.ClientRequest
对象(种类),回调提供一个增强的 http.IncomingMessage
作为第二个参数。您可以使用各种属性来重建响应,但不能直接从这里获取。 Node 提供的原生 http API 抽象出原始响应。
(IncomingMessage
和 ClientRequest
的文档在这里: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/