【发布时间】:2016-03-21 07:14:03
【问题描述】:
我最初的目的是验证 HTTP 分块传输。但是无意中发现了这个不一致。
API 旨在将文件返回给客户端。我对它使用HEAD 和GET 方法。 返回不同的标头。
对于GET,我得到了这些标题:(这是我所期望的。)
对于HEAD,我得到了这些标题:
根据this thread、HEAD 和GET 应该返回相同的标头,但不一定。
我的问题是:
如果使用Transfer-Encoding: chunked因为文件是动态提供给客户端的,而 Tomcat 服务器无法事先知道它的大小,Tomcat 怎么可能知道Content-Length使用HEAD方法? Tomcat 是否只是 dry-run 处理程序并计算所有文件字节数?为什么它不简单地返回相同的 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 = response.getOutputStream();
InputStream input = servletContext.getResourceAsStream(filename);
BufferedInputStream bufferedInput = new BufferedInputStream(input);
int datum = bufferedInput.read();
while (datum != -1) {
output.write(datum);
datum = bufferedInput.read();
}
output.flush();
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
添加 1 个
在我的代码中,我没有明确添加任何标头,那么它必须是 Tomcat 以它认为合适的方式添加 Content-Length 和 Transfer-Encoding 标头。
那么,Tomcat 决定发送哪些标头的规则是什么?
添加 2 个
可能与Tomcat的工作方式有关。我希望有人可以在这里有所启发。否则,我将调试到Tomcat 8的源代码并分享结果。但这可能需要一段时间。
相关:
【问题讨论】:
标签: http tomcat8 http-method chunked