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

maa*_*nus 18 dump http node.js

我想知道是否有可能在整个网络中转储整个HTTP请求+响应.

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

此外,我想准确转储通过线路的字节.

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

http原始数据

取自本页.

我使用的是当前node.js的HTTP 客户端使用request.它是普通的HTTP(没有HTTPS).

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

shi*_*ave 6

Request模块返回增强的本机对象。返回值是一个增强的http.ClientRequest对象(种类),并且为回调提供了增强http.IncomingMessage的第二个参数。您可以使用各种属性来重构响应,但不能直接从此处获取。Node提供的本机http API提取了原始响应。

(对于文档IncomingMessageClientRequest在这里: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)