2017-03-11 5 views
1

NodeJSサーバを使用してクライアントとIPカメラの間のプロキシとして機能しようとしています。カメラからリアルタイムストリームを要求すると、それは、ノードを介したHTTPレスポンスストリーミング

で続き、データの連続ストリームが続きます。 Chromeでカメラのストリームを開くと、決して終了しないダウンロードが開始され、それをカールすると、継続的な応答が開始されます。

ノードは、カメラからの応答をバッファリングし、そのたびにHTTPパーサーで解析しているようです。これは

HPE_INVALID_HEADER_TOKEN 

と罰金それが正しいヘッダを持っているとして、最初の時間を動作しますが、データそのエラーの第2のバッファ時に誰かがこれが起こっている理由を説明する助けてくださいことはできますか?これはデータの連続ストリームです。なぜ、2番目のバッファでHTTPヘッダーを解析しようとしていますか?紛失しているか、カメラがHTTP仕様に正しく従っていないかどうかはわかりません。

編集:サンプル・コード

const options = { 
    family: 4, 
    headers: { 
     Authorization: 'Basic ' + base64EncodedAuth, 
    }, 
    host: '192.168.1.131', 
    method: 'GET', 
    path: '/cgi-bin/realmonitor.cgi?action=getStream&channel=1&subtype=0', 
    port: 80, 
    protocol:'http:', 
}; 


const req = http.request(options, (res) => { 
    console.log(`STATUS: ${res.statusCode}`); 
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`); 
    res.on('data', (chunk) => { 
     console.log(`BODY: ${chunk}`); 
    }); 
    res.on('end',() => { 
     console.log('No more data in response.'); 
    }); 
}); 

req.on('error', (e) => { 
    console.log(`problem with request: ${e.message}`); 
}); 

req.end(); 

ヒットする唯一のコールバックは、「エラー」です。

+0

node.jsコードを表示して、実際に行っていることを確認できますか?コードに関する質問には常にコードが含まれている必要があります。私はあなたが新しいデータが送信されている限り、それを続けるように応答をパイプしたいと思うでしょう。 – jfriend00

+0

サンプルコードを追加しました。最初は、リクエストパッケージを使用して応答をパイプしていましたが、応答がパイプされる前に同じエラーが発生しました。 – Huw

+0

raw tcpまたはudp socketでデータを取得できませんか?私はあなたがHTTPの解析に問題がないと思う。 –

答えて

1

として、私はさらにカメラからカールログを検査し、すべてがマークされていたことに気づい:それはすべてのヘッダーを持っていることを知らせるためにHTTPの仕様で必要とされる別のCRLFを送信されることはありません

<= Recv header

送信されました。そのため、パーサーはヘッダを解析してエラーを投げているのです。

+0

従来のhttpサーバにヘッダなしのレスポンス・カード(HTTP 0.9レスポンス)をリクエストすると、同様の問題が発生しました。それは本当にHTTP解析エラーをスローします。そして、私は実際に生のソケットを使ってそれを解決しました... –

関連する問題