maa*_*nus 18 dump http node.js
我想知道是否有可能在整个网络中转储整个HTTP请求+响应.
我不想得到方法,路径信息,查询字符串,标题,cookie,正文等等.理论上我可以自己组装原始数据,但是我不需要HTTP库,对吧?
此外,我想准确转储通过线路的字节.
我想要像这张图片中的原始数据
取自本页.
我使用的是当前node.js的HTTP 客户端使用request.它是普通的HTTP(没有HTTPS).
在node.js中安装代理是一种选择,但我并不坚持使用库.我可以想象包装套接字读写函数,但我看不到如何使用套接字.
Request模块返回增强的本机对象。返回值是一个增强的http.ClientRequest对象(种类),并且为回调提供了增强http.IncomingMessage的第二个参数。您可以使用各种属性来重构响应,但不能直接从此处获取。Node提供的本机http API提取了原始响应。
(对于文档IncomingMessage和ClientRequest在这里:https://nodejs.org/api/http.html)。
更有趣的是,这些都是的抽象net.Socket。如果您使用本机httpAPI,则可以Socket在发送ClientRequest(带有.end)之前先听一下。这会给您一个Buffer包含HTTP响应的信息。
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();
Run Code Online (Sandbox Code Playgroud)
看起来这并不使您可以侦听出站请求,但是它对于响应非常有用。
返回到抽象链,这可以与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"
]
Run Code Online (Sandbox Code Playgroud)
而且的确,如果我们戳一下可疑的外观_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()); });
});
Run Code Online (Sandbox Code Playgroud)
小智 0
这将返回作为响应发送的请求标头
const http = require("http")
function getRawHeader(req, res) {
const httpVersion = req.httpVersion
let str = `${req.method.toUpperCase()} ${req.url} HTTP/${httpVersion}\n`
for (let i = 0; i < req.rawHeaders.length; i = i + 2) {
str += `${req.rawHeaders[1]} : ${req.rawHeaders[i + 1]}\n`
console.log(i)
}
let written = false
req.on("readable", (chunk) => {
const data = req.read()
if (!written) {
res.write(str)
res.write("\n")
}
written = true
if (data) res.write(data)
})
}
http.createServer((req, res) => {
getRawHeader(req, res)
req.on("end", () =>res.end())
}).listen(7200, () => console.log("server f is running"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2280 次 |
| 最近记录: |