如何读取rocket :: Data到整流罩内的字符串?

时间:2018-01-13 21:55:54

标签: stream rust lifetime

我试图在Rocket中实现一个记录请求体的整流报告。不幸的是,由于整流on_request方法只获得对请求中rocket::Data的引用,我无法拨打data.open()

这是我到目前为止的整流罩:

#[derive(Default)]
struct Logger {
}

impl Fairing for Logger {
    fn info(&self) -> Info {
        Info {
            name: "Request / response logger",
            kind: Kind::Request | Kind::Response
        }
    }

    fn on_request(&self, request: &mut Request, data: &Data) {
        if request.method() == Method::Post {
            println!("Request came in!");
            let mut dataStr = "".to_string();
            data.open().read_to_string(&mut dataStr);
            println!("{:?}", dataStr);
        }
    }

    fn on_response(&self, request: &Request, response: &mut Response) {
    }
}

不出所料,我收到了这个错误:

379 |        data.open().read_to_string(&mut dataStr);
    |        ^^^^ cannot move out of borrowed content

有没有办法记录数据而不消耗它?如果没有,是否有另一种方法来实现这样的日志记录整流?

1 个答案:

答案 0 :(得分:0)

  

有没有办法记录数据而不消耗它?

没有。查看Data::open的文档:

  

返回原始数据流。

     

流包含请求正文中的所有数据,包括查看缓冲区中的数据。该方法使用Data实例。这可确保Data类型始终表示请求中的所有数据。

HTTP请求正文是数据的。这些流是一次性读取的。如果您要记录请求的主体,那么数据就会消失,而您的实际处理程序将无法使用。

  

还有另一种方法来实现这样的日志记录整流吗?

我不知道,但从一开始就是一个脆弱的想法。如果有人要发布一个1GB的文件,你真的想要记录整个事情吗?

我能想到的最接近的替代方法是在处理程序中获取拥有的Data,打开它,然后将它的输出“发送”到您的真实代码并将其保存在某处,即逻辑方式。

另见: