2017-02-22 18 views
1

このコードをエクスポーズしてWebサイトをダウンロードし、ダウンロードが完了したらコールバック関数を実行します。Node.jsが完全なWebサイトをダウンロードしていません

var request = require("request"); 

var options = { 
    uri: "http://www.hellointernet.fm/podcast?format=rss", 
    headers: { 
    'User-Agent': 'request' 
    } 
}; 

request(options, function(error, response, body) { 
    console.log(body); 
}); 

しかし、コールバックを実行すると完全なウェブサイトはダウンロードされません。私は他のURLで試してみました。

フルページがダウンロードされるまでどのように待機できますか?

+0

まあ、このサーバーでは間違いなく何かがあります。あなたのコードには何も問題はありません。パケットスニッファーを実行すると、サーバーが実際にデータの送信を実際に停止していることがわかります。今問題はなぜですか。 – Brad

+0

ああ、このサーバは 'connection:close'を正しく処理していません。 – Brad

+0

コマンドライン 'curl -A" request "http://www.hellointernet.fm/podcast?format = rss'から動作するようです。 – doublesharp

答えて

1

ここで問題となるのは、間違って動作するサーバーを扱っていることです。あなたのコードは問題ありません。

GET /podcast?format=rss HTTP/1.1 
User-Agent: request 
host: www.hellointernet.fm 
Connection: close 

サーバはその後、70キロバイトと私たちは期待しているフル360872バイトの間のどこかに、各要求で長さが変化するデータで応答:ワイヤ上

は、あなたのアプリケーションは、このHTTPリクエストを書き込みます。サーバーのバッファーが完全に送信される前に、接続が閉じられています。壊れたサーバーではありません。

ただし、HTTP/1.1キープアライブを使用する予定であることをサーバーに伝えると、正常に機能します。

GET /podcast?format=rss HTTP/1.1 
User-Agent: request 
host: www.hellointernet.fm 
Connection: keep-alive 

これは、サーバーが途中で接続を終了していないためです。基本的に、あなたはサーバーのバグをハックしています。

var http = require('http'); 

その後、リクエストのオプションで:上部付近にこれを追加し、あなたのコードでこれを実装するに

agent: http.Agent({keepAlive: true}) 

基本的に、これはHTTPエージェントを使用するように要求モジュールを伝えます(これがNode.jsアプリケーションでキープアライブを可能にするものです)。エージェントを使用すると、HTTPクライアントは、サーバーの問題をハッキングするキープアライブでHTTP要求を行うことができます。

hellointernet.fmを実行しているユーザーに連絡し、サーバーがひどく壊れていることを伝えることをお勧めします。これはおそらくあらゆる種類のクライアントを壊しているでしょう。

+0

ありがとうございました! –

+0

@PeterMaskulio問題はありません。将来このようなものをデバッグしたいのであれば、WiresharkとFiddlerで心地よくなることをお勧めします。 HTTPプロトコル違反を検出するのは本当にうまくいきます。その多くはブラウザベースのHTTP要求ツールでは検出できません。 – Brad

関連する問題