这件事已经困扰了我一段时间了,到目前为止,我在网上找不到原因/解决方案。下面是设置:
我在浏览器上运行了一个胖的JS客户机,将搜索请求激发到一个内部系统中。那些要求只是得到的,没什么特别的。它们返回一个URL,搜索结果一旦可用就会放入其中。
然后,我轮询给定的URL以获得结果(每隔5分钟就进行一次),并处理要提交给用户的数据。该URL指向一个gzipped结果文件,它只是一个纯文本(ASCII)。
现在..。搜索结果通常在几百行文本之内,但偶尔也会有数十万行文本,有时是7-10 be的文本(解压缩后)。这就是浏览器显示悲伤标签页的地方。
(没有必要用这种方法指出安全问题,因为这些问题很多而且非常有力)。
没有什么特别的-只是打电话给
$.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返回确实是一个gzipped,所以我为此设置了标题。我想我可以在ajax()的配置中更新头部,但这似乎是一种更简单的方法。
success或error函数永远不会被调用,超时(5分钟)也不是问题--它都在局域网上,整个传输时间不到半分钟。
我可以在选项卡中打开这个URL,没有任何问题,它向我展示了解压缩的计划ASCII文本。但是当使用jQuery的ajax()检索数据时,我面临的是一个悲伤的选项卡页面(几乎每次都是这样,但只针对“部分内容”HTTP 206响应)。
我遗漏了什么?尝试在JS调试器中“迈出一步”并没有多大帮助,因为我得到的只是一个突然的悲伤选项卡,然后调试会话就被终止了。
更新:通过jQuery的代码并在readyState===4的函数上停下来,我能够捕捉到响应。它是带有全文的HTTP 200 (从打开的<html>标记一直到在单个<pre>标记之间有108 K行的结束<html>标记)。
发布于 2013-04-06 06:32:58
我认为你遇到了Chrome内存限制。AJAX调用的this chrome编码可能有300个字符的限制。
正如您已经注意到的,开发人员工具显示了所有内容,但是当阅读要返回给jQuery时,会遇到某种形式的上限。你能试着把你的反应限制在这个限制下,看看它是否有效吗?或者用另一个浏览器试试?
如果这是问题所在,您可以尝试以部分方式返回结果。返回的几个部分可能会绕过限制。
发布于 2013-04-17 14:03:46
自从你的bash代理(哇!)不执行任何gzip,而curl通常使用内容编码:gzip解压它接收到的任何内容,我假设来自您内部服务器的响应正在返回gzip,但是没有出现内容编码头。
听起来你的卷发脚本是从你的内部服务器得到206的,对吗?这有点奇怪,因为服务器应该只返回206响应范围头。但是,假设是给定的,您将得到gzipped内容的部分响应,并将其作为一个200传递到Chrome。当然,这不应该使Chrome崩溃,但是里面可能有一个bug。
也许试着解开:
#!/bin/bash
echo "Content-type: text/html"
echo ""
curl -k "`cat`" | gunzip您还需要更改Ajax数据源:
data: self.url_res,如果失败,请尝试使用-i从curl捕获完整的标头,以便进一步调试。
https://stackoverflow.com/questions/15847629
复制相似问题