HTTP响应的主体存储在哪里?(使用Rust + requestwest)



在过去的几天里,我一直在用Rust构建一个简单的CL下载管理器来处理HTTP的东西。我已经对协议如何工作有了基本的了解-下载文件时寻找什么头,如何验证请求是否工作等-但我很难找到一个答案,在HTTP响应体中的实际字节存储在哪里。

例如,发送一个请求并获得一个带有requestwest的响应只需要很少的时间,所以我认为在这个阶段不可能发生下载。真正需要时间的是从体中读取字节。但是这个主体肯定不能存储在RAM中,因为下载一个大文件会使内存使用量飙升。我意识到,在不同的HTTP框架中存储这些数据的位置可能不同,但我想我所追求的是在不使用浏览器下载文件时存储大型HTTP响应体的更一般的解释。

reqwest的情况下,响应体不是完全存储在内存中,除非你要求它(通过调用.bytes().json()例如)-网络连接仍然是活动的在这一点上(头部已被完全接收,但不是正文),因此服务器负责存储或以其他方式准备提供响应的其余部分。可能是HTTP服务器在其内存中有响应,或者它可能直接从自己的磁盘读取;部分响应将暂时存储在各种网络缓冲区中,或沿着电缆从他们的网络传输到您的网络。

这就是为什么Response不实现Clone,为什么检索体的方法采用self;Response(除了一种读取响应头的方式)是一个未完成的网络连接的句柄。您可以使用它来指示reqwest如何将文件的其余部分传递给您-将其读入内存,将其解析为一些JSON或其他数据类型,甚至在使用您自己的代码时处理字节。

每个好的HTTP客户端都有这样的功能,因为在做下一步之前将一个大的响应完全存储在内存中是不高效的。

最新更新