我试图在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
有没有办法记录数据而不消耗它?如果没有,是否有另一种方法来实现这样的日志记录整流?
答案 0 :(得分:0)
有没有办法记录数据而不消耗它?
没有。查看Data::open
的文档:
返回原始数据流。
流包含请求正文中的所有数据,包括查看缓冲区中的数据。该方法使用
Data
实例。这可确保Data
类型始终表示请求中的所有数据。
HTTP请求正文是数据的流。这些流是一次性读取的。如果您要记录请求的主体,那么数据就会消失,而您的实际处理程序将无法使用。
还有另一种方法来实现这样的日志记录整流吗?
我不知道,但从一开始就是一个脆弱的想法。如果有人要发布一个1GB的文件,你真的想要记录整个事情吗?
我能想到的最接近的替代方法是在处理程序中获取拥有的Data
,打开它,然后将它的输出“发送”到您的真实代码并将其保存在某处,即逻辑方式。
另见: