如何在Node.js中捕获原始请求
How to capture a raw request in Node.js
我能够在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,我将无法捕获任何请求。
如何捕获原始请求,包括第一个请求?
我找到了一种方法在http.Server上使用'connection'事件。
var http = require('http');
var express = require('express');
var remote = express();
remote.use(function(req, res, next) {
res.end('end');
});
var server = http.createServer(remote);
server.on('connection', function(socket) {
socket.on('data', function(chunk) {
console.log(chunk.toString());
});
});
server.listen(8080);
嘿,不确定你是否还有问题。我最近不得不解决这个问题,我尝试了很多东西,这就是我最终的结果:
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秒,应该没问题。
相关文章:
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- ajax请求的顺序总是不同的
- Meteor如何接收HTTP请求
- 有没有一种方法可以防止img get请求使用css或js发生
- 从ajax请求中获取javascript对象
- JSONP请求返回结果,但也触发error_callback
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 使用jQuery从原始页面内容创建iframe
- 从ajax请求中获取原始文本
- 在 Blockcypher 上广播原始事务,在 POST 请求时出现错误
- 通过javascript获取原始/未修改的请求字符串
- AJAX-PHP;XML-POST请求指向PHP文件,而不是停留在原始页面
- 在Neo4j API中阻止了交叉原始请求
- 有没有办法更改浏览器's的URL,而不将第一个原始请求重定向到服务器
- 发送原始HTTP请求
- AJAX请求从每个页面访问服务器,我无法找到原始AJAX调用的源
- JQuery Ajax POST -请求体不显示在原始HTTP请求
- 如何在Node.js中捕获原始请求
- 提交ajax请求时,如何“搁置”原始请求?在满足条件之前暂时使用
- 如何用xmlhttp请求发送原始文本