在过去两个月中,我在Chrome的开发者控制台上收到以下错误:
net::ERR_INCOMPLETE_CHUNKED_ENCODING
Run Code Online (Sandbox Code Playgroud)
症状:
服务器环境:
在我们内部的Apache服务器上发生了这种情况.它不会发生在任何其他人身上 - 即我们的用户都没有遇到这个问题 - 我们的开发团队也没有其他人.
其他人使用完全相同的Chrome版本访问完全相同的服务器.我还尝试禁用所有扩展程序并在隐身模式下浏览 - 无效.
我使用过Firefox并且发生了同样的事情.截断的文件和诸如此类的东西.唯一的问题是,Firefox不会引发任何控制台错误,因此您需要通过Firebug检查HTTP请求以查看问题.
来自Apache的响应标头:
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:close
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Mon, 27 Apr 2015 10:52:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.2.22 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.10-1ubuntu3.8
Run Code Online (Sandbox Code Playgroud)
在测试时,我能够通过在我的htaccess文件中强制HTTP 1.0来解决问题:
SetEnv downgrade-1.0
Run Code Online (Sandbox Code Playgroud)
这摆脱了问题.但是,通过HTTP 1.1强制HTTP 1.0不是一个合适的解决方案.
更新:因为我是唯一一个遇到此问题的人,我认为我需要花更多的时间来调查它是否是客户端问题.如果我进入Chrome的设置并使用"恢复默认设置"选项,问题将消失大约10-20分钟.然后它返回.
我正在使用play框架来生成分块响应.代码是:
class Test extends Controller {
public static void chunk() throws InterruptedException {
for (int i = 0; i < 10; i++) {
String data = repeat("" + i, 1000);
response.writeChunk(data);
Thread.sleep(1000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用浏览器访问时http://localhost:9000/test/chunk
,我可以看到显示的数据每秒都在增加.但是,当我编写一个javascript函数来接收和处理数据时,发现它将阻塞直到收到所有数据.
代码是:
$(function(){
$.ajax(
"/test/chunked",
{
"success": function(data, textStatus, xhr) {
alert(textStatus);
}
}
);
});
Run Code Online (Sandbox Code Playgroud)
收到所有数据后,我可以看到10秒后弹出一个消息框.
如何获取流并及时处理数据?
是否可以设置内容长度标头并使用分块传输编码?这样做是否解决了在使用chunked时不知道客户端响应长度的问题?
我正在考虑的情况是当你有一个大文件要传输时,确定它的大小没有问题,但它太大而无法完全缓冲.(如果你没有使用chunked,那么整个响应必须首先得到缓冲?对吗?)
谢谢.
有些专家可以解释两者之间的差异吗?是不是chunked是一个流协议而多部分不是?使用multipart有什么好处?
当我使用plupload来块文件(设置选项chunk_size
)时,我会为每个块获得一个单独的PHP请求.查看$_FILES
变量,每个块都是类型"application/octet-stream"
.
有没有简单,标准和舒适的方法如何在服务器端将这些部分组合在一起?
保证理智(例如,当其中一件丢失时等).
我最初的目的是验证HTTP分块传输.但不小心发现了这种不一致.
API旨在将文件返回给客户端.我用它HEAD
和GET
方法来对付它. 返回不同的标头.
因为GET
,我得到这些标题:(这是我的预期.)
对于HEAD
,我得到这些标题:
根据这个线程,HEAD
并且GET
应该返回相同的标题,但不一定.
我的问题是:
如果Transfer-Encoding: chunked
使用,因为该文件是动态反馈给客户端和Tomcat服务器无法知道它的大小提前,怎么可能Tomcat的知道Content-Length
何时HEAD
使用哪种方法?Tomcat只是干运行处理程序并计算所有文件字节?为什么不简单地返回相同的Transfer-Encoding: chunked
标题?
下面是我使用Spring Web MVC实现的RESTful API :
@RestController
public class ChunkedTransferAPI {
@Autowired
ServletContext servletContext;
@RequestMapping(value = "bootfile.efi", method = { RequestMethod.GET, RequestMethod.HEAD })
public void doHttpBoot(HttpServletResponse response) {
String filename = "/bootfile.efi";
try {
ServletOutputStream output …
Run Code Online (Sandbox Code Playgroud) 使用Varnish 4,我有一组后端,它们响应有效的Content-Length
标头而没有Transfer-Encoding
标头.
在客户端的第一次点击中,Varnish正在删除Content-Length
标题并添加Transfer-Encoding: chunked
到响应中,而不是使用这些标头响应客户端.(有趣的是,有效载荷似乎没有任何块 - 它是一个连续的有效载荷).
这会给像Flash视频播放器这样的客户端造成严重问题,这些客户端正试图根据Content-Length
标头进行分段大小,带宽等分析.他们的分析失败了,他们不能做多比特流等等.
我尝试过一些半明显的事情,比如:
beresp.do_stream = true
beresp.do_gzip = false
unset req.http.Accept-Encoding
示例后端响应:
HTTP/1.1 200 OK
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 19:44:35 GMT
Server: Apache
Content-Length: 796618
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
样品清漆响应:
HTTP/1.1 200 OK
Server: Apache
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 23:10:06 GMT
X-Varnish: 2
Age: 0
Transfer-Encoding: chunked
Accept-Ranges: bytes
Run Code Online (Sandbox Code Playgroud)
对象的后续加载不包括Content-Length …
HTTP 1.1客户端是否可以设置一个标头值,指示不应对请求的响应进行分块?或者是防止这种情况的唯一方法是发送HTTP 1.0请求?我试过谷歌搜索,但我能找到的方法是禁用HTTP 1.1服务器上的分块传输,所以我猜测它在客户端是不可能的,但我想我还是会问.
我们为客户开发各种网站,最近我们的一些"较重"网站遇到了一个奇怪的问题.
我们的几个Magento商店和另外一个基于PHP的网站仅在我的PC和1个客户端的PC上无法在Chrome和其他浏览器上加载控制台错误:
网:: ERR_INCOMPLETE_CHUNKED_ENCODING
此错误通常显示在各种JS文件中,例如:/js/magentothem/jquery-ui.js
在刷新时,您可以多次重现相同的错误,然后偶尔网站将加载正常.
如果您在单独的选项卡中打开JS文件,文件会在随机点(即未完全加载)中明显切断,但在多次刷新后将干净地加载.
它不仅仅是一个有问题的文件 - 它在JS文件之间有所不同 - 文件正确上传到服务器.
我们在办公室里有4台电脑,它只发生在我的电脑上,但也奇怪地在我们客户的一台机器上出现同样的错误.
我们都运行相同版本的Chrome(包括运行良好的机器).
调查后... - 如果我将网络电缆更改为以前连接到接收页面的PC的其他人之一,我仍然会收到错误
- 如果我将网络电缆和HotSpot断开连接到我的iPhone网络,网站加载正常!
我已经尝试在服务器上禁用所有形式的缓存,并检查错误日志,但都无济于事.
任何人都可以解释这个问题可能与什么有关?我确信这个错误与服务器无关 - 可能是我和我客户的PC之间的巧合,但问题是什么......
提前致谢
我一直在努力处理几个类实现,以检索分块数据但没有成功.以下是一个有问题的简化代码模块.在网上浏览之后,过去似乎出现了问题(2009年,2010年;版本1.1,1.5),但现在应该解决这些问题.我没有看到Android平台对此协议有任何明确的成功.
救命!
如果我输入无效令牌,我能看到一些响应 - Web服务将响应应用程序错误消息.但是,有效的url和令牌只会响应检测到的chunked协议(isChunked()返回true),但没有任何内容被读取,也没有任何超时等等.
从命令行使用CURL发出的完全相同的URL按预期工作,并显示连续内容(来自Web服务的已发布数据).
是否存在任何Web服务端黑客,例如,添加更多行尾,强制接收流?
URI uri;
try {
uri = new URI("http://cws.mycompany.com/service/events?accesskeyid=8226f3ddc65a420abc391d8f1fe12de44766146762_1298174060748");
HttpClient httpClient=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(uri);
ResponseHandler<String> rh=new BasicResponseHandler();
String responseString=httpClient.execute(httpGet,rh);
Log.d(TAG, "response as string:\n" + responseString);
} catch (URISyntaxException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
} catch (ClientProtocolException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
} catch (IOException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)