parsing来自Socket的HTTP消息

我有一个套接字服务器监听同一端口上的所有types的数据,如果数据是HTTP然后我想parsing它,否则我想要做一些其他的事情…

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

我应该如何parsing来自套接字的HTTP数据?

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

在查看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); 

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

这里面的巨大挑战是,我不清楚你打算如何区分stream量types? 我的意思是你可以听任何端口或套接字“HTTP”,我们只是普遍同意80( https为443 )。

但是不清楚如何在同一套接字中侦听HTTP和MySQL协议。 你怎么知道哪个数据包属于哪个协议? 我从来没有听说过任何人实现这种“多用途”的套接字,你通常知道什么types的数据打开套接字之前预期。 否则,你可能会收到垃圾,对不对?