我能够使用下面的源代码在Node.js中捕获原始请求。
var http = require('http');
var express = require('express');
var remote = express();
remote.use(function(req, res, next) {
req.socket.once('data', function(data) {
console.log(data.toString());
});
next();
});
remote.use(function(req, res, next) {
res.end('end');
});
http.createServer(remote).listen(8080);
但是这个源可以在第二个请求之后捕获原始请求,因为第一个请求是在绑定事件处理程序之前消耗的。如果客户端不使用keep alive,我无法捕获任何请求。
如何捕获原始请求,包括第一次请求?
答案 0 :(得分:2)
我找到了使用'connection' event on http.Server的方法。
poiTrackerManager.startPOITrackerWithRadius(5000, 0.1);
答案 1 :(得分:0)
嘿,不确定您是否仍然遇到问题。我最近不得不解决这个问题,我玩了很多事情,而这就是我最终得到的结果:
https://github.com/vincenzorm117/http-capture/blob/master/index.js
这是代码,以防链接出现任何问题:
var PORT = process.env.PORT || 3000
const net = require('net')
const fs = require('fs')
if( !fs.existsSync('./payloads') ) {
fs.mkdirSync('./payloads');
}
var server = net.createServer((sock) => {
console.log(`Connected: ${sock.remoteAddress}`)
let filename = FileName(sock);
let wstream = fs.createWriteStream(`./payloads/${filename}`);
sock.on('data', wstream.write.bind(wstream));
sock.on('end', () => {
wstream.end();
delete wstream;
console.log(`Disconnected: ${sock.remoteAddress}`)
});
setTimeout(() => {
if( !sock.destroyed ) {
sock.write('HTTP/1.1 200 OK\r\n');
sock.end();
}
}, 3000);
});
server.listen(PORT, 'localhost');
function FileName() {
var d = new Date(),
year = d.getFullYear(),
month = d.getMonth(),
date = d.getDate();
hour = d.getHours();
minutes = d.getMinutes();
seconds = d.getSeconds();
if( month < 10 ) month = '0' + month;
if( date < 10 ) date = '0' + date;
if( hour < 10 ) hour = '0' + hour;
if( minutes < 10 ) minutes = '0' + minutes;
if( seconds < 10 ) seconds = '0' + seconds;
return `request__${year}-${month}-${date}__${hour}-${minutes}-${seconds}.http`;
}
我有点懒,将服务器设置为在3秒钟后终止连接,而不是解析HTTP请求。您可以将其更新为1秒,但这应该没问题。