このことはしばらくの間私を悩ませてきましたが、今のところウェブ上で理由/解決策を見つけることができません. セットアップは次のとおりです。
ブラウザーで実行されているファット JS クライアントがあり、内部システムに検索要求を送信しています。これらのリクエストはただの GET であり、特別なことではありません。それらは、検索結果が利用可能になったときに配置される URL を返します。
次に、指定された URL をポーリングして結果を取得し (5 分ごとなど)、データを処理してユーザーに提示します。その URL は、単なるプレーン テキスト (ASCII) である gzip 圧縮された結果ファイルを指しています。
現在...検索結果は多くの場合、数百行のテキスト内にありますが、時には数十万行のテキストがあり、時には7-10MB相当のテキスト(解凍後)があります。そして、ブラウザーが悲しいタブ ページを表示する場所です。
(このアプローチのセキュリティの問題を指摘する必要はありません。それらは多数あり、非常に強力です)。
特別なことは何もありません - を呼び出すだけです
$.ajax({
url: '/cgi-bin/ajax_gz.cgi',
type: 'POST',
data: 'curl -k "' + self.url_res + '"',
dataType: 'html',
success: function (_data, _status, _xhr) {
self.update_result(_data, _status, _xhr);
},
error: function (_xhr, _status, _error) {
self.set_status(Status.ACK);
},
timeout: 5 * ONE_MINUTE
});
ここでajax_gz.cgi
、単純なダムプロキシよりも精巧なものはありません(curl
リクエストをリレーすることにより、JSが別のドメインからデータをプルできるようにするため):
#!/bin/bash
echo "Content-type: text/html"
echo "Content-encoding: gzip"
echo ""
/bin/bash
戻り値は確かに gzip された HTML であるため、そのヘッダーを設定しています。ajax() の構成でヘッダーを更新できると思いますが、これはより簡単なアプローチのようです。
success
または関数が呼び出されることはerror
なく、タイムアウト (5 分) も問題ではありません。すべて LAN 上にあり、転送全体に 30 分もかかりません。
その URL をタブでまったく問題なく開くことができ、解凍された計画の ASCII テキストが表示されます。しかし、jQuery の ajax() を使用してデータを取得すると、悲しいタブ ページが表示されます (ほとんどの場合、「部分的なコンテンツ」HTTP 206 応答の場合のみ)。
私は何が欠けていますか?JSデバッガーで「ステップスルー」しようとしても、突然悲しいタブが表示され、デバッグセッションが強制終了されるだけなので、あまり役に立ちません。
更新: jQuery のコードをステップ実行し、readyState===4
の関数で停止すると、応答をキャッチできました。それはHTTP 200
全文でした(開始<html>
タグから終了タグまで、1つの<pre>
タグで間に108K行あります)。その応答を取得してthis
値を「拡張」しようとすると、悲しいタブページが表示されました