2015-09-25 33 views
2

我正在構建一個代理服務器,它應該將數據從Shoutcast服務器轉發到客戶端。使用request甚至節點的http模塊失敗是由於缺少HTTP標頭:忽略節點中HTTP請求的頭部驗證

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

有問題的網址是:http://stream6.jungletrain.net:8000

做,捲曲頭請求我能夠驗證這一點:

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

然而,該流正在與curl stream6.jungletrain.net:8000測試工作正常。


有沒有一種方法來禁用request頭驗證或節點的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接口的一半。

+0

icecast是什麼類型的流?另外 - 什麼是'stream.pipe(res)'在你的例子中做? – brandonscript

+0

建議您查看https://github.com/nodejitsu/node-http-proxy,查看是否已有基於節點的http代理實現。但個人而言,我不會爲代理服務器推薦nodejs,並且最好使用類似nginx的東西。 – sagie

+1

這不是一個Icecast服務器。它是Shoutcast,它不符合HTTP,所以毫無疑問你有問題。 – TBR

回答

3

使用icecast,我能得到這個工作都使用on('data')事件通過其管道向新快報迴應:

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包已被所取代10

+0

謝謝,也許我應該澄清,但我使用的是前身實現,並沒有公開正確的'unpipe'或'close'接口。 –

+0

所以這個模塊確實暴露了這些或不是?如果沒有,我建議最簡單的做法是嘗試將它們實施到icecast並提交PR。 – brandonscript

+0

Hrm,似乎它已被替換,舊的從未從NPM中刪除。 https://www.npmjs.com/package/icy – brandonscript