如何在 Rust 中发出 gRPC firestore 监听请求?
How to make a gRPC firestore listen request in Rust?
使用来自 https://github.com/gkkachi/firestore-grpc 的 gRPC 绑定,我能够拼凑一些看似有效但未收到任何内容的东西:
正在创建请求:
let req = ListenRequest {
database: format!("projects/{}/databases/(default)", project_id),
labels: HashMap::new(),
target_change: Some(TargetChange::AddTarget(Target {
// "Rust" in hex: https://github.com/googleapis/python-firestore/issues/51
target_id: 0x52757374,
once: false,
target_type: Some(TargetType::Documents(DocumentsTarget {
documents: vec![users_collection],
})),
resume_type: None,
})),
};
发送中:
let mut req = Request::new(stream::iter(vec![req]));
let metadata = req.metadata_mut();
metadata.insert(
"google-cloud-resource-prefix",
MetadataValue::from_str(&db).unwrap(),
);
println!("sending request");
let res = get_client(&token).await?.listen(req).await?;
let mut res = res.into_inner();
while let Some(msg) = res.next().await {
println!("getting response");
dbg!(msg);
}
(完整代码 in this repo)。
可以发出请求,但流不包含任何实际内容。我从调试日志中得到的唯一提示是
[2021-10-27T14:54:39Z DEBUG h2::codec::framed_write] send frame=GoAway { error_code: NO_ERROR, last_stream_id: StreamId(0) }
[2021-10-27T14:54:39Z DEBUG h2::proto::connection] Connection::poll; connection error error=GoAway(b"", NO_ERROR, Library)
知道缺少什么吗?
正如 rust users forum 中指出的那样,我遗漏的关键是请求流立即结束,这导致连接关闭。 send frame=GoAway
实际上是由客户端(facepalm)发送的。
要保持连接打开并接收响应,我们可以保持输入流挂起:Request::new(stream::iter(vec![req]).chain(stream::pending()))
。将有更好的方法来设置并控制后续输入请求,但这足以修复示例。
使用来自 https://github.com/gkkachi/firestore-grpc 的 gRPC 绑定,我能够拼凑一些看似有效但未收到任何内容的东西:
正在创建请求:
let req = ListenRequest {
database: format!("projects/{}/databases/(default)", project_id),
labels: HashMap::new(),
target_change: Some(TargetChange::AddTarget(Target {
// "Rust" in hex: https://github.com/googleapis/python-firestore/issues/51
target_id: 0x52757374,
once: false,
target_type: Some(TargetType::Documents(DocumentsTarget {
documents: vec![users_collection],
})),
resume_type: None,
})),
};
发送中:
let mut req = Request::new(stream::iter(vec![req]));
let metadata = req.metadata_mut();
metadata.insert(
"google-cloud-resource-prefix",
MetadataValue::from_str(&db).unwrap(),
);
println!("sending request");
let res = get_client(&token).await?.listen(req).await?;
let mut res = res.into_inner();
while let Some(msg) = res.next().await {
println!("getting response");
dbg!(msg);
}
(完整代码 in this repo)。
可以发出请求,但流不包含任何实际内容。我从调试日志中得到的唯一提示是
[2021-10-27T14:54:39Z DEBUG h2::codec::framed_write] send frame=GoAway { error_code: NO_ERROR, last_stream_id: StreamId(0) }
[2021-10-27T14:54:39Z DEBUG h2::proto::connection] Connection::poll; connection error error=GoAway(b"", NO_ERROR, Library)
知道缺少什么吗?
正如 rust users forum 中指出的那样,我遗漏的关键是请求流立即结束,这导致连接关闭。 send frame=GoAway
实际上是由客户端(facepalm)发送的。
要保持连接打开并接收响应,我们可以保持输入流挂起:Request::new(stream::iter(vec![req]).chain(stream::pending()))
。将有更好的方法来设置并控制后续输入请求,但这足以修复示例。