我有一个JS客户端在浏览器上运行,向内部系统发出搜索请求。这些请求只是GET请求,没有什么特别的。它们返回一个URL,当搜索结果可用时,将把结果放入其中。
然后,我会定期(比如每5分钟)轮询给定的URL以获取结果,并处理数据以呈现给用户。该URL指向一个gzip压缩的结果文件,它只是一个普通的文本文件(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
返回的确实是一个经过gzip压缩的HTML,所以我设置了相应的头信息。我想我可以在ajax()的配置中更新头信息,但这似乎是一个更简单的方法。
success
或error
函数从未被调用,超时(5分钟)也不是问题——所有操作都在局域网内完成,整个传输时间不到半分钟。
我可以在选项卡中毫无问题地打开该URL,并显示未经压缩的ASCII文本。但是当使用jQuery的ajax()检索数据时,我面临着一个令人沮丧的页面(几乎每次都是如此,但仅针对“部分内容”HTTP 206响应)。
我错过了什么?尝试在JS调试器中“逐步执行”并在readyState===4
的函数处停止,我能够捕获响应。它是一个HTTP 200
响应,包含完整的文本(从开头的<html>
标记一直到带有108K行的单个<pre>
标记的结尾)。
一旦我得到了响应并尝试“展开”this
值,我就会得到一个令人沮丧的页面。
更新:通过逐步执行jQuery的代码并停在readyState===4
的函数处,我能够捕获响应。它是一个HTTP 200
响应,包含完整的文本(从开头的<html>
标记一直到带有108K行的单个<pre>
标记的结尾)。
一旦我得到了响应并尝试“展开”this
值,我就会得到一个令人沮丧的页面。