Search code examples
javascriptnode.jshttpshoutcastnode-request

Ignore header validation for HTTP requests in Node


I am building a proxy server which is supposed to forward data from an Shoutcast server to the client. Using request or even Node's http module this fails due to missing HTTP header:

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

The URL in question is: http://stream6.jungletrain.net:8000

Doing a header request with curl I was able to verify this:

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

Yet the stream is working fine as tested with curl stream6.jungletrain.net:8000.


Is there a way to disable the header verification in request or Node's http? This is the code I am testing it on:

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')
});

I am aware this can be achieved by rolling an implementation with net, there is also icecast-stack but subjectively seen it only implements half of the Stream interfaces properly.


Solution

  • Using icecast, I was able to get this working both using the on('data') event and by piping it to the Express response:

    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')
    });
    

    Or simply:

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

    Also of some note:

    It appears the icecast package has been superseded by https://www.npmjs.com/package/icy