如何在Node.js中捕获原始请求

时间:2015-09-01 20:33:30

标签: javascript node.js sockets express

我能够使用下面的源代码在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,我无法捕获任何请求。

如何捕获原始请求,包括第一次请求?

2 个答案:

答案 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秒,但这应该没问题。