使用 scalatra 服务器发送大文件在 2^31 - 1 字节后结束

sending large files with scalatra server ends after 2^31 - 1 bytes

我们将 scalatra 与 Jetty 9 一起使用。我们有一个服务于静态文件的端点。但我注意到任何大于 2GB 的东西似乎都会被截断。我可以看到文件被分块发送。 curl 和 wget 可以正确地开始下载并且它们完成时没有错误。我一直在寻找 scalatra 和 Jetty 的问题,但没有看到任何与我所看到的问题类似的问题。但是看起来有人在需要 long

时使用了 int

对于那些通过搜索结果偶然发现这个问题的人...

这是在 Jetty 问题跟踪器上处理的 https://github.com/eclipse/jetty.project/issues/630

答案是这是一个 scalatra 错误,它错误地假设 .transferTo() 可以保证发送交给它的所有字节。

scalatra 实现需要将其对 .transferTo() 的使用放在一个循环中,以验证是否已发送整个大小。

回答为什么是2GB?,那是因为transferTo()使用java的ByteBuffer,它本身有2GB的限制。

这已在 scalatra 2.5.0+ 中修复 http://scalatra.org/2016/11/21/2016-11-21-scalatra-2-5-released.html