【问题标题】:Ignore header validation for HTTP requests in Node忽略 Node 中 HTTP 请求的标头验证
【发布时间】:2015-09-25 16:56:52
【问题描述】:

我正在构建一个代理服务器,它应该将数据从 Shoutcast 服务器转发到客户端。使用 request 甚至 Node 的 http 模块,由于缺少 HTTP 标头而失败:

{ [Error: Parse Error] bytesParsed: 0, code: 'HPE_INVALID_CONSTANT' }

有问题的网址是:http://stream6.jungletrain.net:8000

使用 curl 进行标头请求我能够验证这一点:

$ curl -I http://stream6.jungletrain.net:8000
curl: (52) Empty reply from server

然而,正如curl stream6.jungletrain.net:8000 所测试的那样,流工作正常。


有没有办法禁用request 或Node 的http 中的标头验证?这是我正在测试的代码:

var express = require('express');
var request = require('request');
var app = express();

app.get('/', function (req, res) {
  request('http://stream6.jungletrain.net:8000').pipe(res);
  stream.pipe(res);
});

var server = app.listen(3000, function () {
  console.log('Server started')
});

我知道这可以通过使用net 滚动实现来实现,还有icecast-stack 但主观上认为它只正确实现了Stream 接口的一半。

【问题讨论】:

  • icecast 是什么类型的流?另外 - stream.pipe(res) 在你的例子中做了什么?
  • 建议您查看 github.com/nodejitsu/node-http-proxy 以了解已经基于节点的 http 代理实现。但就我个人而言,我不会推荐 nodejs 作为代理服务器,你最好使用 nginx 之类的东西。
  • 这不是 Icecast 服务器。它是 Shoutcast,它不符合 HTTP 标准,所以遇到问题也就不足为奇了。
  • @TBR 不错,你是怎么发现的?
  • 我是 Icecast 的维护者,我知道 Icecast 不会做这种废话,但 Shoutcast 会。 ;-)

标签: javascript node.js http shoutcast node-request


【解决方案1】:

使用icecast,我能够使用on('data') 事件和通过管道将其传递给Express 响应来实现此功能:

var express = require('express');
var app = express();
var icecast = require('icecast');

var url = 'http://stream6.jungletrain.net:8000';

app.get('/', function(req, res) {
    icecast.get(url, function(icecastRes) {
        console.error(icecastRes.headers);
        icecastRes.on('metadata', function(metadata) {
            var parsed = icecast.parse(metadata);
            console.error(parsed);
        });
        icecastRes.on('data', function(chunk) {
            console.log(chunk);
        })
    });
});

var server = app.listen(3000, function() {
    console.log('Server started')
});

或者简单地说:

app.get('/', function(req, res) {
    icecast.get(url).pipe(res);
});

还有一些注意事项:

icecast 包似乎已被 https://www.npmjs.com/package/icy 取代

【讨论】:

  • 谢谢,也许我应该澄清一下,但我使用的是以前的实现,它没有公开正确的unpipeclose 接口。
  • 那么这个模块是否暴露了这些?如果没有,我建议最简单的做法是尝试将它们实施到 icecast 中并提交 PR。
  • Hrm,它似乎也被替换了,旧的从未从 NPM 中删除。 npmjs.com/package/icy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2012-01-11
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多