在AJAX请求之后,Chrome会在HTTP 205响应中下载重新加载的页面

时间:2014-04-07 10:09:49

标签: javascript ajax google-chrome http-status-codes

在项目上工作时,我只是发出一个AJAX请求来处理一些数据 完成作业后,服务器将返回HTTP 205 RESET CONTENT响应

我使用此状态代码告诉请求者reset the document view

以下是我使用的代码

$.ajax({
    url: '/unread',
    method: 'PUT',
    data: {
        notifications: elements
    }
}).done(function(content, message, xhr) {
    if (205 !== xhr.status) {
        // Generic error message
        return;
    }

    window.location.reload(true)
}).fail(function() {
    // Generic error message
})

这适用于Internet Explorer (8及以上),Firefox (28.0)和Opera (12.16)。但Chrome (33.0)和Opera (20.0)而不是刷新页面,下载正在重新加载的页面的响应内容 < / strong> dump 致电window.location.reload

这是我尝试过的事情

  • window.location.href = window.location.href给出相同的结果
  • history.go(0)给出相同的结果
  • 如果我删除window.location.reload,则不会重新加载任何内容
  • 清除缓存,删除本地状态或进入私人导航不会改变任何内容
  • 如果我更改了响应代码(例如204),它可以正常工作

以下是发生了什么的视觉网络

Chrome makes a download

附加信息(以及更深入的调查)

  • 我在Ubuntu 12.04
  • 可以在使用Windows 7(相同版本的Chrome)的其他计算机上重现错误
  • 无法使用Debian 7.1(相同的Chrome版本)在其他计算机上复制错误

为什么Chrome和Opera在205 HTTP响应中的行为如此?

1 个答案:

答案 0 :(得分:3)

我能找到的最接近的是它可能是一个bug,因为在这个文件中:    https://chromium.googlesource.com/chromium/chromium/+/trunk/net/http/http_stream_parser.cc

从第837行开始的注释与第850行的代码不匹配:即注释没有提到205必须是零长度,但代码对待205就像1xx,204和304.这实际上是唯一的闪烁代码我可以找到提到205(在定义常量之外)。

也许值得尝试最新的Opera版本;如果问题也发生在那里,它会更强烈地指向Blink源代码中的错误。