runtime: propagate request context through adapters

This commit is contained in:
a.tolmachev
2026-05-01 11:44:43 +00:00
parent 3b1a7c6993
commit 7be6bed347
6 changed files with 530 additions and 24 deletions
@@ -65,6 +65,62 @@ pub async fn spawn_unary_echo_server() -> String {
format!("http://{}", address)
}
pub async fn spawn_metadata_echo_server() -> String {
#[derive(Default)]
struct MetadataEchoServiceImpl;
#[tonic::async_trait]
impl echo::echo_service_server::EchoService for MetadataEchoServiceImpl {
async fn unary_echo(
&self,
request: Request<echo::EchoRequest>,
) -> Result<Response<echo::EchoResponse>, Status> {
let message = request.get_ref().message.clone();
let request_id = request
.metadata()
.get("x-request-id")
.and_then(|value| value.to_str().ok())
.unwrap_or_default();
let correlation_id = request
.metadata()
.get("x-correlation-id")
.and_then(|value| value.to_str().ok())
.unwrap_or_default();
Ok(Response::new(echo::EchoResponse {
message: format!("{}|{}|{}", message, request_id, correlation_id),
}))
}
type ServerEchoStream = std::pin::Pin<
Box<dyn futures_util::Stream<Item = Result<echo::EchoResponse, Status>> + Send>,
>;
async fn server_echo(
&self,
_request: Request<echo::EchoRequest>,
) -> Result<Response<Self::ServerEchoStream>, Status> {
Ok(Response::new(Box::pin(stream::empty())))
}
}
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
let address = listener.local_addr().unwrap();
let incoming = tonic::transport::server::TcpIncoming::from(listener);
tokio::spawn(async move {
Server::builder()
.add_service(echo::echo_service_server::EchoServiceServer::new(
MetadataEchoServiceImpl,
))
.serve_with_incoming(incoming)
.await
.unwrap();
});
format!("http://{}", address)
}
pub fn descriptor_set_b64() -> String {
STANDARD.encode(echo::FILE_DESCRIPTOR_SET)
}