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

时间:2018-06-04 20:46:33

标签: node.js http dump

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

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

此外,我想将完全转储到线路上的字节

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

this page

取自enter image description here

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

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

3 个答案:

答案 0 :(得分:4)

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

IncomingMessageClientRequest的文档位于:https://nodejs.org/api/http.html)。

更有趣的是,这些都是net.Socket的抽象。如果您使用原生http API,则可以在发送SocketClientRequest)之前收听此.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()); });
});

答案 1 :(得分:0)

这将返回作为响应发送的请求标头

npm install @types/jquery --save-dev

答案 2 :(得分:0)

http.request还可以选择传递您自己的连接(createConnection)。您可以使用此选项提供您自己创建的连接,该连接是“piped()”到记录器转换流。

const { Transform } = require('stream');
const http = require('http');
const agent = new http.Agent();
let nativeRequest = http.get({
    host: 'google.com',
    createConnection: options => {
        let connection = agent.createConnection(options);
        let logger = new Transform({
            transform: (chunk, encoding, callback) => {
                console.log(chunk.toString());
                connection.write(chunk, encoding, callback);
            },
            flush: () => {},
        });
        connection.pipe(logger);
        return logger;
    },
});
nativeRequest.on('socket', function(socket) {
    socket.on('data', function(data) {
        console.log(data.toString());
    });
});
nativeRequest.end();

一些注释

我尝试实施PassThrough流而不是Transform。当我将PassThrough流传输到连接时,这给了我HTTP解析错误。我不知道为什么说实话。

从文档

中加入flush: () => {}非常重要
  

当没有更多要写入的数据被消耗时,但在发出'end'事件之前,将调用此信号,表示可读流的结束。

https://nodejs.org/api/stream.html#stream_transform_flush_callback