忽略 header 对 Node 中 HTTP 请求的验证
Ignore header validation for HTTP requests in Node
我正在构建一个代理服务器,它应该将数据从 Shoutcast 服务器转发到客户端。使用 request
甚至 Node 的 http
模块由于缺少 HTTP header:
而失败
{ [Error: Parse Error] bytesParsed: 0, code: 'HPE_INVALID_CONSTANT' }
问题中的 URL 是:http://stream6.jungletrain.net:8000
用 curl 做一个 header 请求我能够验证这一点:
$ curl -I http://stream6.jungletrain.net:8000
curl: (52) Empty reply from server
然而,经 curl stream6.jungletrain.net:8000
.
测试,流工作正常
有没有办法在 request
或 Node 的 http
中禁用 header 验证?这是我正在测试的代码:
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
, there is also icecast-stack
滚动实现来实现,但主观上认为它只正确实现了一半的 Stream
接口。
使用 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
取代
我正在构建一个代理服务器,它应该将数据从 Shoutcast 服务器转发到客户端。使用 request
甚至 Node 的 http
模块由于缺少 HTTP header:
{ [Error: Parse Error] bytesParsed: 0, code: 'HPE_INVALID_CONSTANT' }
问题中的 URL 是:http://stream6.jungletrain.net:8000
用 curl 做一个 header 请求我能够验证这一点:
$ curl -I http://stream6.jungletrain.net:8000
curl: (52) Empty reply from server
然而,经 curl stream6.jungletrain.net:8000
.
有没有办法在 request
或 Node 的 http
中禁用 header 验证?这是我正在测试的代码:
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
, there is also icecast-stack
滚动实现来实现,但主观上认为它只正确实现了一半的 Stream
接口。
使用 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
取代