重复 headers 响应/浏览器间歇性失败
Duplicate headers in response / browsers failing intermittently
这个问题似乎是几天前开始的,没有任何代码更改,我的本地 tomcat 服务器将停止响应。
我的主要过滤器断点没有命中,只有一些资源被加载。
失败的那些,似乎有重复的响应headers:
Accept-Ranges:bytes
Accept-Ranges:bytes
Content-Disposition:inline;filename="online-framework.js"
Content-Disposition:inline;filename="online-framework.js"
Content-Encoding:gzip
Content-Encoding:gzip
Content-Range:bytes 0-42062/42063
Content-Range:bytes 0-42062/42063
Content-Type:application/javascript
Content-Type:application/javascript
Date:Tue, 19 Apr 2016 13:01:18 GMT
ETag:online-framework.js_42063_1461060446000
ETag:online-framework.js_42063_1461060446000
Expires:Tue, 26 Apr 2016 13:01:19 GMT
Expires:Tue, 26 Apr 2016 13:01:19 GMT
Last-Modified:Tue, 19 Apr 2016 10:07:26 GMT
Last-Modified:Tue, 19 Apr 2016 10:07:26 GMT
Server:Apache-Coyote/1.1
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
Transfer-Encoding:chunked
Vary:Accept-Encoding
Vary:Accept-Encoding
并且 chrome 因错误停止:Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING
,这是有道理的。
tomcat 连接器尚未修改,并且包含 gzip 响应。我尝试了什么:
- 线程转储 - 没有明显的阻塞代码
- wireshark - 对它的了解不够好,无法找出问题所在
- 禁用杀毒软件
- 无代理 运行宁
页面似乎一直在加载。这是踢球者,它是随机发生的,它会在一个小时开始工作,但不会在下一个小时开始工作。
我唯一能想到的是某些领域的东西可能已经改变,windows 更新没有 运行,并且其他 3 或 4 台电脑做同样的事情,而另外 2 台没有(相同版本)
我不知道下一步要看哪里?有什么想法吗?
好的伙计们,在这里回答我自己的问题,但我找到了解决方案。
我使用的是自定义 file servlet written by @BalusC;问题就出在这里
这是我的发现:
- 使用
Content-Encoding: gzip
和 Content-Range
的组合时出现问题
- 产生的错误是:
ERR_INCOMPLETE_CHUNKED_ENCODING
- 我首先决定禁用此过滤器,让 tomcat 的
DefaultServlet
处理它...问题消失了
- 作为一名程序员,我必须知道为什么。
- 我仍然没有确切原因,但我认为这是因为gzip不能用长度准确表示
Content-Range
的规范还指出:
The Content-Range entity-header is sent with a partial entity-body to specify where in the full entity-body the partial body should be applied. Range units are defined in section 3.12.
并且在代码中,即使是完整响应也已发送:
if (ranges.isEmpty() || ranges.get(0) == full) {
// Return full file.
Range r = full;
response.setContentType(contentType);
response.setHeader("Content-Range", "bytes " + r.start + "-" + r.end + "/" + r.total);
if (content) {
// .....
我删除了那行,然后一切又开始工作了!我真的很希望有人能参与进来,并可能给出更好的解释。
这是失败文件的 chrome://net-internals/
输出:
t= 3740 [st= 38] -HTTP_STREAM_REQUEST
t= 3740 [st= 38] +HTTP_TRANSACTION_SEND_REQUEST [dt=0]
t= 3740 [st= 38] HTTP_TRANSACTION_SEND_REQUEST_HEADERS
--> GET /Core/resources/scripts/scriptaculous/dragdrop.js?t=1461139610 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
DNT: 1
Referer: http://localhost:8080/Core/Dashboard?componentID=VCmq3c
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,af;q=0.6
Cookie: [306 bytes were stripped]
t= 3740 [st= 38] -HTTP_TRANSACTION_SEND_REQUEST
t= 3740 [st= 38] +HTTP_TRANSACTION_READ_HEADERS [dt=4]
t= 3740 [st= 38] HTTP_STREAM_PARSER_READ_HEADERS [dt=4]
t= 3744 [st= 42] HTTP_TRANSACTION_READ_RESPONSE_HEADERS
--> HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: inline;filename="dragdrop.js"
Accept-Ranges: bytes
ETag: dragdrop.js_19250_1461136271305
Last-Modified: Wed, 20 Apr 2016 07:11:11 GMT
Expires: Wed, 27 Apr 2016 08:06:51 GMT
Content-Range: bytes 0-19249/19250
Content-Type: application/javascript
Transfer-Encoding: chunked
Vary: Accept-Encoding
Date: Wed, 20 Apr 2016 08:06:50 GMT
t= 3744 [st= 42] -HTTP_TRANSACTION_READ_HEADERS
t= 3744 [st= 42] HTTP_CACHE_WRITE_INFO [dt=56]
t= 3800 [st= 98] HTTP_CACHE_WRITE_DATA [dt=0]
t= 3800 [st= 98] HTTP_CACHE_WRITE_INFO [dt=1]
t= 3801 [st= 99] URL_REQUEST_DELEGATE [dt=0]
t= 3801 [st= 99] -URL_REQUEST_START_JOB
t= 3801 [st= 99] URL_REQUEST_DELEGATE [dt=0]
t= 3801 [st= 99] HTTP_TRANSACTION_READ_BODY [dt=0]
t= 3801 [st= 99] HTTP_CACHE_WRITE_DATA [dt=1]
t= 3802 [st= 100] URL_REQUEST_JOB_BYTES_READ
--> byte_count = 3683
t= 3802 [st= 100] HTTP_TRANSACTION_READ_BODY [dt=0]
t= 3802 [st= 100] HTTP_CACHE_WRITE_DATA [dt=0]
t= 3802 [st= 100] URL_REQUEST_JOB_BYTES_READ
--> byte_count = 13982
t= 3802 [st= 100] HTTP_TRANSACTION_READ_BODY [dt=20365]
--> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING)
t=24167 [st=20465] FAILED
--> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING)
t=24168 [st=20466] -REQUEST_ALIVE
--> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING)
最后,这里有一些真正帮助了我的链接,似乎 spring 去年遇到了同样的问题。
我仍然不明白为什么这会在 运行 好几年之后随机开始并且 真的 会感谢任何输入。
这个问题似乎是几天前开始的,没有任何代码更改,我的本地 tomcat 服务器将停止响应。
我的主要过滤器断点没有命中,只有一些资源被加载。
失败的那些,似乎有重复的响应headers:
Accept-Ranges:bytes
Accept-Ranges:bytes
Content-Disposition:inline;filename="online-framework.js"
Content-Disposition:inline;filename="online-framework.js"
Content-Encoding:gzip
Content-Encoding:gzip
Content-Range:bytes 0-42062/42063
Content-Range:bytes 0-42062/42063
Content-Type:application/javascript
Content-Type:application/javascript
Date:Tue, 19 Apr 2016 13:01:18 GMT
ETag:online-framework.js_42063_1461060446000
ETag:online-framework.js_42063_1461060446000
Expires:Tue, 26 Apr 2016 13:01:19 GMT
Expires:Tue, 26 Apr 2016 13:01:19 GMT
Last-Modified:Tue, 19 Apr 2016 10:07:26 GMT
Last-Modified:Tue, 19 Apr 2016 10:07:26 GMT
Server:Apache-Coyote/1.1
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
Transfer-Encoding:chunked
Vary:Accept-Encoding
Vary:Accept-Encoding
并且 chrome 因错误停止:Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING
,这是有道理的。
tomcat 连接器尚未修改,并且包含 gzip 响应。我尝试了什么:
- 线程转储 - 没有明显的阻塞代码
- wireshark - 对它的了解不够好,无法找出问题所在
- 禁用杀毒软件
- 无代理 运行宁
页面似乎一直在加载。这是踢球者,它是随机发生的,它会在一个小时开始工作,但不会在下一个小时开始工作。
我唯一能想到的是某些领域的东西可能已经改变,windows 更新没有 运行,并且其他 3 或 4 台电脑做同样的事情,而另外 2 台没有(相同版本)
我不知道下一步要看哪里?有什么想法吗?
好的伙计们,在这里回答我自己的问题,但我找到了解决方案。
我使用的是自定义 file servlet written by @BalusC;问题就出在这里
这是我的发现:
- 使用
Content-Encoding: gzip
和Content-Range
的组合时出现问题
- 产生的错误是:
ERR_INCOMPLETE_CHUNKED_ENCODING
- 我首先决定禁用此过滤器,让 tomcat 的
DefaultServlet
处理它...问题消失了 - 作为一名程序员,我必须知道为什么。
- 我仍然没有确切原因,但我认为这是因为gzip不能用长度准确表示
Content-Range
的规范还指出:
The Content-Range entity-header is sent with a partial entity-body to specify where in the full entity-body the partial body should be applied. Range units are defined in section 3.12.
并且在代码中,即使是完整响应也已发送:
if (ranges.isEmpty() || ranges.get(0) == full) {
// Return full file.
Range r = full;
response.setContentType(contentType);
response.setHeader("Content-Range", "bytes " + r.start + "-" + r.end + "/" + r.total);
if (content) {
// .....
我删除了那行,然后一切又开始工作了!我真的很希望有人能参与进来,并可能给出更好的解释。
这是失败文件的 chrome://net-internals/
输出:
t= 3740 [st= 38] -HTTP_STREAM_REQUEST t= 3740 [st= 38] +HTTP_TRANSACTION_SEND_REQUEST [dt=0] t= 3740 [st= 38] HTTP_TRANSACTION_SEND_REQUEST_HEADERS --> GET /Core/resources/scripts/scriptaculous/dragdrop.js?t=1461139610 HTTP/1.1 Host: localhost:8080 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Accept: */* User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36 DNT: 1 Referer: http://localhost:8080/Core/Dashboard?componentID=VCmq3c Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8,af;q=0.6 Cookie: [306 bytes were stripped] t= 3740 [st= 38] -HTTP_TRANSACTION_SEND_REQUEST t= 3740 [st= 38] +HTTP_TRANSACTION_READ_HEADERS [dt=4] t= 3740 [st= 38] HTTP_STREAM_PARSER_READ_HEADERS [dt=4] t= 3744 [st= 42] HTTP_TRANSACTION_READ_RESPONSE_HEADERS --> HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Disposition: inline;filename="dragdrop.js" Accept-Ranges: bytes ETag: dragdrop.js_19250_1461136271305 Last-Modified: Wed, 20 Apr 2016 07:11:11 GMT Expires: Wed, 27 Apr 2016 08:06:51 GMT Content-Range: bytes 0-19249/19250 Content-Type: application/javascript Transfer-Encoding: chunked Vary: Accept-Encoding Date: Wed, 20 Apr 2016 08:06:50 GMT t= 3744 [st= 42] -HTTP_TRANSACTION_READ_HEADERS t= 3744 [st= 42] HTTP_CACHE_WRITE_INFO [dt=56] t= 3800 [st= 98] HTTP_CACHE_WRITE_DATA [dt=0] t= 3800 [st= 98] HTTP_CACHE_WRITE_INFO [dt=1] t= 3801 [st= 99] URL_REQUEST_DELEGATE [dt=0] t= 3801 [st= 99] -URL_REQUEST_START_JOB t= 3801 [st= 99] URL_REQUEST_DELEGATE [dt=0] t= 3801 [st= 99] HTTP_TRANSACTION_READ_BODY [dt=0] t= 3801 [st= 99] HTTP_CACHE_WRITE_DATA [dt=1] t= 3802 [st= 100] URL_REQUEST_JOB_BYTES_READ --> byte_count = 3683 t= 3802 [st= 100] HTTP_TRANSACTION_READ_BODY [dt=0] t= 3802 [st= 100] HTTP_CACHE_WRITE_DATA [dt=0] t= 3802 [st= 100] URL_REQUEST_JOB_BYTES_READ --> byte_count = 13982 t= 3802 [st= 100] HTTP_TRANSACTION_READ_BODY [dt=20365] --> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING) t=24167 [st=20465] FAILED --> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING) t=24168 [st=20466] -REQUEST_ALIVE --> net_error = -355 (ERR_INCOMPLETE_CHUNKED_ENCODING)
最后,这里有一些真正帮助了我的链接,似乎 spring 去年遇到了同样的问题。
我仍然不明白为什么这会在 运行 好几年之后随机开始并且 真的 会感谢任何输入。