7

Nodeの基本http.request()機能は普通のHTTPサーバーで問題なく使えています。http.request()SHOUTcastサーバーで使用する(または同様の)必要があります。SHOUTcast の「プロトコル」は HTTP と完全に互換性がありますが、1 つの詳細を除きます...最初の応答行です。

通常の HTTP サーバーは次のように応答します。

HTTP/1.1 200 OK

SHOUTcast サーバーは次のように応答します。

ICY 200 OK

ここでも、プロトコルの残りの部分は同じです。唯一の違いはHTTP/1.xICYです。

Node の関数を拡張、サブクラス化、またはなんらかの方法で変更http.request()して、SHOUTcast サーバーで動作できるようにしたいと考えています。Node を使用した SHOUTcast への接続は、以前にも行われていましたが、車輪全体を再発明することによってのみ行われました。プロトコルの小さな違いに相当するもののために、私はむしろそれをしたくありません。

私の質問: 次のいずれかを行う方法はありますか?

  1. Node の HTTP パーサーの関連部分を拡張またはオーバーライドします。(パーサーがネイティブ コードのように見えるため、これが可能であるとは思えません。)

  2. HTTP の関連部分を解析する独自のコードを作成しますが、HTTP の既存の Node コンポーネントをできるだけ多く再利用します。

  3. Node の HTTP パーサーに到達する前に最初のサーバー応答行を変更できるように、単純な内部プロキシ (または何らかの方法でデータを中継) を作成します。

  4. 他の何か?

Shredの使用も検討しましたが、応答をストリーミングするオプションはありません。(イベントを発生させる前にサーバーの応答全体が完了するのを待ちます。これは、データが無期限に実行されるストリーミング サーバーでは機能しません。) 同じ方針でRequestを試しましたが、Node 独自の HTTP パーサーを使用しているため、ネイティブ HTTP クライアントの場合と同じ解析エラーが発生します。

4

2 に答える 2

5

内部プロキシに似ていますが、追加の接続なしで、これを行う別の方法を思いつきました。内部で使用されている HTTP クライアントのソケットをオーバーライドできるようです。ondataこれが完了すると、データを元の内部ソケット関数に渡す前に、簡単にフックして変更できます。

使用法

var httpicy = new HttpIcyClient();
httpicy.request(/* your normal request parameters here */);

ソース

var http = require('http');

var HttpIcyClient = function () {};
HttpIcyClient.prototype.request = function (options, callback) {
    var req = http.request(options, callback),
        originalOnDataFunction,
        receiveBuffer = new Buffer(0);

    req.on('socket', function (socket) {
        originalOnDataFunction = socket.ondata;
        socket.ondata = function (d, start, end) {
            receiveBuffer = Buffer.concat([receiveBuffer, d.slice(start, end)]);
            if (receiveBuffer.length >= 4) {
                socket.ondata = originalOnDataFunction;
                if (receiveBuffer.toString('ascii', 0, 4) === 'ICY ') {
                    receiveBuffer = Buffer.concat([new Buffer('HTTP/1.0 ', 'ascii'), receiveBuffer.slice(4)]);
                }
                socket.ondata.apply(this, [receiveBuffer, 0, receiveBuffer.length]);
            }
        };
    });
    return req;
}
于 2012-08-25T06:31:53.800 に答える
1

3。単純な内部プロキシを作成する

バン。了解しました。

Node.jsnetオブジェクトを使用して、ユーザーとhttpサーバーの間に実際に配置されるTCPサーバーを作成します。説明したように、すべての要求と応答の最初の行を置き換えれば、httpサーバーを基本的にそのまま使用し続けることができます。(非標準ポートに内部httpサーバーを作成し、別のポートにネットサーバーを作成してから、要求元のユーザーからのデータの最初のチャンクと最初のチャンクをインターセプトするためのコードを使用して、2つの間にストリームをチェーンします。応答するサーバーからのデータの。)

すべてのコードはJavascriptであり、すべて(ほとんど)bufferbloatなしでストリーミングされます。

編集、私はあなたの投稿を少し読み間違えたようです。Node.jsシャウトキャストサーバーを実装しようとしているのではなく、そこからデータにアクセスしようとしているようです。オブジェクトは引き続き機能するnetはずですが、まったく同じようには機能しません。

を使用net.connectして、指定されたshoutcastサーバーと通信しnet、ストリームを認識している新しいサーバーを使用して、サーバーとnet.connectの間でプロキシを行う必要がありますhttp.request()。したがって、次のように機能します。

+---------------+    +----------+    +-----------+    +----------------+
| http.request()|--->|net.Server|--->|net.connect|--->|SHOUTcast Server|
|               |<---|          |<---|           |<---|                |
+---------------+    +----------+    +-----------+    +----------------+
                  TCP             JS               TCP

それは私がそれをどのように構成するかについてです。

于 2012-03-27T00:27:11.173 に答える