jQuery ajax在HTTP 206上崩溃chrome(部分内容)

时间:2013-04-06 06:03:47

标签: jquery ajax http google-chrome crash

这件事一直困扰着我一段时间,到目前为止我无法在网上找到理由/解决方案。这是设置:

我在浏览器上运行了一个胖的JS客户端,将搜索请求发送到内部系统。那些请求只是GET,没什么特别的。他们会返回一个URL,搜索结果一旦可用就会被放入其中。

然后,我然后轮询给定的URL以获取结果(不时地说,每5分钟一次)并处理要呈现给用户的数据。该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()配置中的头文件,但这似乎是一种更简单的方法。

successerror函数永远不会被调用,超时(5分钟)也不是问题 - 它全部在局域网上,整个传输时间不到半分钟。

我可以在一个没有任何问题的选项卡中打开该URL,它向我显示解压缩的计划ASCII文本。但是当使用jQuery的ajax()检索数据时,我正面临一个悲伤标签页(几乎每次都有,但仅限于“部分内容”HTTP 206响应)。

我错过了什么?尝试在JS调试器中“单步执行”并没有多大帮助,因为我得到的只是一个突然的悲伤选项卡,然后调试会话被杀死。

更新:单步执行jQuery的代码并停在readyState===4的函数中,我能够捕获响应。它是HTTP 200的全文(从开始的<html>标记一直到结束的标记,在一个<pre>标记中间有108K行)。 一旦我得到了回复并试图“扩展”this值,我就会得到一个悲伤的标签页

2 个答案:

答案 0 :(得分:0)

我认为您遇到了Chrome内存限制。对于AJAX调用,对this chrome进行加密可能会限制为3000个字符。

正如您已经注意到开发人员工具显示了所有内容,但是当读取它以返回到jQuery时,它会遇到某种形式的上限。您是否可以尝试将响应限制在该限制之下以确定其是否有效?也许尝试使用其他浏览器?

如果这是问题,您可以尝试将结果部分返回。返回的一些部分可能会绕过限制。

答案 1 :(得分:0)

由于您的bash代理(yikes!)没有进行任何gzipping,并且curl通常会解压缩它通过Content-Encoding接收的任何内容:gzip,我假设您的内部服务器的响应回来了gzip,但没有Content-Encoding标题存在。

听起来你的curl脚本从你的内部服务器得到206,对吧?这有点奇怪,因为服务器应该只返回206以响应Range头。但是,作为一个给定的,您将获得gzip压缩内容的部分响应并将其作为200传递给Chrome。当然,这不应该导致Chrome崩溃,但可能存在错误。

也许尝试解压缩:

#!/bin/bash
echo "Content-type: text/html"
echo ""
curl -k "`cat`" | gunzip

您还希望更改Ajax数据源:

data: self.url_res,

如果失败,请尝试使用-i从curl捕获完整标头以进行进一步调试。