这件事已经困扰我一段时间了,到目前为止我在网上找不到原因/解决方案。这是设置:
我有一个在浏览器上运行的胖 JS 客户端,向内部系统发起搜索请求。这些请求只是 GET 的,没什么特别的。它们返回一个 URL,一旦搜索结果可用,就会将其放入其中。
然后我轮询给定的 URL 以获取结果(不时地,比如每 5 分钟一次)并处理要呈现给用户的数据。该 URL 指向一个压缩的结果文件,它只是一个纯文本 (ASCII)。
现在......搜索结果通常在几百行文本内,但偶尔会有数十万行文本,有时是 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
只不过是一个简单的哑代理(允许我的 JS 通过中继curl
请求从不同的域中提取数据)更复杂的地方:
#!/bin/bash
echo "Content-type: text/html"
echo "Content-encoding: gzip"
echo ""
/bin/bash
返回的确实是压缩后的 HTML,所以我为此设置了标题。我想我可以更新 ajax() 配置中的标题,但这似乎是一种更简单的方法。
success
or函数永远不会被调用,error
超时(5 分钟)也不是问题——它都在 LAN 上,整个传输不到半分钟。
我可以毫无问题地在选项卡中打开该 URL,它会显示解压缩的计划 ASCII 文本。但是当使用 jQuery 的 ajax() 检索数据时,我面临着一个悲伤的标签页(几乎每次,但仅适用于“部分内容”HTTP 206 响应)。
我错过了什么?尝试在 JS 调试器中“逐步执行”并没有多大帮助,因为我得到的只是一个突然的悲伤标签,然后调试会话被终止。
更新:单步执行 jQuery 代码并在readyState===4
' 函数处停止,我能够捕捉到响应。它是HTTP 200
全文(从开始<html>
标签一直到结束标签,在单个<pre>
标签之间有 108K 行)。一旦我得到那个回应并试图“扩大”this
我得到一个悲伤标签页的价值