从Socket解析HTTP消息

时间:2014-03-18 15:15:36

标签: javascript node.js

我有一个套接字服务器在同一个端口上侦听所有类型的数据,如果数据是HTTP,那么我想解析它,否则我想用它来做其他事情......

net.createServer(function(socket){
    if(/*socket contains HTTP data*/){
        // parse it
    }
    else{
        // do something else with the socket
    }
}).listen(999)

我应如何解析套接字中的HTTP数据?

我已经开始为此目的编写自己的HTTP解析器,但我不想重新发明轮子,也许有更好的方法。

2 个答案:

答案 0 :(得分:3)

在查看http.js的源代码后,我想出了以下方法来实现它......

var net = require('net'),
    http = require('http'),
    events = require('events');

var HTTPParser = process.binding('http_parser').HTTPParser;


function freeParser(parser){
    if (parser) {
        parser.onIncoming = null;
        parser.socket = null;
        http.parsers.free(parser);
        parser = null;
    }
};


function parse(socket){
    var emitter = new events.EventEmitter();
    var parser = http.parsers.alloc();

    parser.reinitialize(HTTPParser.REQUEST);
    parser.socket = socket;
    parser.maxHeaderPairs = 2000;

    parser.onIncoming = function(req){
        emitter.emit('request', req);
    };

    socket.on('data', function(buffer){
        var ret = parser.execute(buffer, 0, buffer.length);
        if(ret instanceof Error){
            emitter.emit('error');

            freeParser(parser);
        }
    });

    socket.once('close', function(){
        freeParser(parser);
    });

    return emitter;
};


net.createServer(function(socket){
    var parser = parse(socket);

    parser.on('request', function(req){
        // Got parsed HTTP object
    });

    parser.once('error', function(){
        // Not HTTP data
    });
}).listen(999);

答案 1 :(得分:1)

因此Node.JS核心库实际上通过套接字实现HTTP处理。该代码是用Javascript编写的,可见:https://github.com/joyent/node/blob/master/lib/http.js

这里面临的最大挑战是,我不清楚您是如何计划区分流量类型的?我的意思是你可以倾听" HTTP"在任何端口或套接字上,我们通常都同意80(和443 for https )。

但是不清楚你是如何监听对两个HTTP的调用并在同一个套接字中说出MySQL协议。你怎么知道哪些数据包属于哪种协议?我从来没有真正听说有人实施这样一个多功能的"在打开套接字之前,您通常知道期望的数据类型。否则你可能只是在收垃圾,对吧?