你能从一个字符串构建一个 hyper::Request 吗?

Can you build a hyper::Request from a String?

我正在尝试编写拦截代理。我最初使用 hyper 作为服务器,因为它相对简单,但如果请求格式错误,hyper 会在我将请求传递到上游服务器之前返回响应。我想避免这种情况,所以我希望使用 tokio::net::TcpListener 从浏览器接收请求,然后使用 hyper 作为客户端将请求转发到远程服务器。

当我使用 TcpListener 和后续 TcpStream 时,请求以 u8 形式出现,然后我将其转换为 String。有没有一种方法可以轻松地将其转换为 hyper::Request,或者我是否需要自己编写代码来进行转换?

如果是后者,有没有人对允许我从字符串创建 HTTP 请求的替代库有任何建议?

更新

我发现您可以使用来自 seanmonstar(来自 Hyper 的同一作者)的这个板条箱从字节解析 HTTP 请求:

https://github.com/seanmonstar/httparse

也许使用您的 TCP 流并使用此 httparse 板条箱消耗传入字节就足够了。

原答案

如果我没记错的话,您正在尝试从字节流或从 TcpListener 获取的字节数组 (&[u8]) 创建 hyper::Request 的实例.

要让 Hyper 服务器正确处理请求并使用您已经存在的 TCP 侦听器,您可以使用:https://docs.rs/hyper/0.14.11/hyper/server/struct.Server.html#method.from_tcp

然后您可以使用另一个 crate 将该请求流式传输到代理服务器: https://github.com/tafia/hyper-proxy