【问题标题】:Handling chunked requests in Scalatra在 Scalatra 中处理分块请求
【发布时间】:2017-08-21 09:16:25
【问题描述】:

我对使用 Scalatra 处理分块请求很感兴趣。 Scalatra 是否支持访问分块 http 请求的单个块?还是我只需要等待分块请求结束,然后再处理整个请求?

【问题讨论】:

    标签: scala http scalatra


    【解决方案1】:

    Scalalatra 只是 Java Servlet 的包装器。它允许您访问richRequest.inputStream directly。其他一切都与 Java 相同。

    您可能需要从输入流中解析chunked encoding

    另见:Chunked http decoding in java?

    您可以在此处找到InputStream 的包装器:http://www.java2s.com/Code/Java/File-Input-Output/AnInputStreamthatimplementsHTTP11chunking.htm

    【讨论】:

    • 这个输入流在接收到第一个块后是否立即可用?下一个块也应该在这个输入流中吗?
    • @StEVee 是的,是的。但是,您必须自己解析分块数据编码(the data inside input stream is raw)或使用我提供的包装器链接(实际上您可以检查包装器的代码 - 它非常不言自明)
    • 更准确地说 - InputStream 本质上是惰性的,(这是一个有点简化的解释,但是)它只是在套接字缓冲区可用时读取数据,即使它没有被分块。基本上,分块编码带来的唯一区别是您不必指定 Content-Length,因此客户端可以在流式传输期间动态选择数据的大小,因此它可以动态选择流何时结束(何时关闭连接)。它没有更多的魔法。
    • 关于魔法的另一个问题。有一个方法inputStream.available,它返回一个估计可以从这个输入流中读取(或跳过)而不阻塞的字节数。对于带有正文的非分块请求,它可以返回 0 吗?一些罕见的情况下,已经从套接字读取了标头但主体还没有
    • @StEVee 回答有关“可用”的问题。它实际上取决于实现,但总的来说,当您从套接字读取数据到某个本地缓冲区时,0 表示连接结束。但是,available 表示本地缓冲区中还剩下多少数据,在某些实现中,理论上可能本地缓冲区大小完全等于 header 的大小,因此在读取 header 后,available 将为零。