我想知道是否有可能在整个网络中转储整个HTTP请求+响应。
我不想获得方法,路径信息,查询字符串,标题,Cookie,正文等等。理论上我可以自己组装原始数据,但是我不需要HTTP库,对吧?
此外,我想将完全转储到线路上的字节。
我想要像这张图片中的原始数据
我使用当前node.js
作为HTTP 客户端与request
。它是普通的HTTP(没有HTTPS)。
在node.js中安装代理是一种选择,但我不会坚持使用库。我可以设想包装套接字读写函数,但是我无法看到如何使用套接字。
答案 0 :(得分:4)
Request模块返回增强的本机对象。返回值是扩充的http.ClientRequest
对象(种类),并且回调是作为第二个参数提供的扩充http.IncomingMessage
。您可以使用各种属性来重建响应,但不能直接从此处获取响应。 Node提供的本机http API抽象出原始响应。
(IncomingMessage
和ClientRequest
的文档位于:https://nodejs.org/api/http.html)。
更有趣的是,这些都是net.Socket
的抽象。如果您使用原生http
API,则可以在发送Socket
(ClientRequest
)之前收听此.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