Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在node.js中接收非HTTP请求_Javascript_Node.js_Http_Rtsp - Fatal编程技术网

Javascript 在node.js中接收非HTTP请求

Javascript 在node.js中接收非HTTP请求,javascript,node.js,http,rtsp,Javascript,Node.js,Http,Rtsp,我需要在Node JS中接收与HTTP请求几乎相同的请求,但在标头中有一个与HTTP不同的词,例如,请求的第一行是: POST / RTSP/1.0 (而不是POST/HTTP/1.0) 请求格式的其余部分在各个方面都与HTTP相同 有没有办法让http服务器解析器忽略在请求的第一行中称为http的协议?所以我可以使用http.createServer等来接收和响应这些“非http”请求 (我知道我可以使用网络模块而不是http模块,但是我必须自己实现头解析等。)最简单的方法是在节点中实现tc

我需要在Node JS中接收与HTTP请求几乎相同的请求,但在标头中有一个与HTTP不同的词,例如,请求的第一行是:

POST / RTSP/1.0
(而不是
POST/HTTP/1.0

请求格式的其余部分在各个方面都与HTTP相同

有没有办法让http服务器解析器忽略在请求的第一行中称为http的协议?所以我可以使用http.createServer等来接收和响应这些“非http”请求


(我知道我可以使用网络模块而不是http模块,但是我必须自己实现头解析等。)

最简单的方法是在节点中实现tcp服务器,作为代理来代替初始POST:

(注意:我还没有测试过这段代码,但它应该足以说明这个想法)


你也可以用HAProxy做同样的事情

。。。那么你的问题到底是什么?@bguiz,基本上,有没有一种方法可以让它忽略它在头中没有说HTTP?(无需仅为一个单词的差异重写http服务器)如果服务器确实是,那么您仍然需要编写自己的。除此之外,如果其余内容没有差异,那么正确的做法是将服务器改为编写HTTP而不是RTSP,而且这也会简单得多。我假设你问这个问题是因为你没有访问服务器的权限?我无法控制客户端代码(iOS和iTunes Airplay),它将这些POST请求作为RTSP而不是HTTP发送。(根据维基百科RTSP没有POST方法,所以是HTTP)对不起,我在上面的评论中混淆了服务器和客户端。不幸的是,这会让你陷入困境。我不知道这个问题的答案-也许这个网站上的其他人可以帮助你!我也会这样做,但是在客户端连接和下游服务器之间使用一个转换流,并在那里执行正则表达式…实际上,我在这里重新使用了比streams2旧的portforward.js脚本:)缺少一个括号:
if(requestText.match(/POST\/RTSP\/1.0/){
应该是
if(requestText.match)(/POST\/RTSP\/1.0/){
var net = require('net');

net.createServer(function(s)
{
    var sawRequest = false;
    var buff = "";
    var requestText = "";
    var connected = false;
    var cli = net.createConnection(yourHttpServerPort);
    s.on('data', function(d) {
        if (!sawRequest) {
           requestText += d.toString();
           if (requestText.match(/POST \/ RTSP\/1.0/)) {
              requestText.replace('POST / RTSP/1.0', 'POST / HTTP/1.0');
              buff = requestText;
              sawRequest = true;
           } 
        } else {
           buff += d.toString();
        }
        if (connected)
        {
           if (buff != '')
             cli.write(buff);
           cli.write(d);
        } else {
           buff += d.toString();
        }
    });
    cli.once('connect', function() {
        connected = true;
        cli.write(buff);
    });
    cli.pipe(s);

}).listen(publicFacingRTSPport);