From 331667c00e076dbfdb31bbed2be38b1f4818296c Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 12 Feb 2022 14:12:13 +0100 Subject: [PATCH] WIP: Start auditing all `forward_request` calls on the server When the host returns an error after a server has forwarded a request, we want to surface that error to the guest. At the moment, the server just returns early leaving some requests unresponded on the guest. I started auditing all the code paths where we do that, but I am wondering whether there's some other approach that would prevent us from repeating this mistake in other code paths. --- crates/server/src/rpc.rs | 70 +++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/crates/server/src/rpc.rs b/crates/server/src/rpc.rs index e6711fb7b1f9eecec2fcedd5620689d8cc25cb42..a160769d6df196122bc7e370b4f3b9b37b92dddc 100644 --- a/crates/server/src/rpc.rs +++ b/crates/server/src/rpc.rs @@ -684,11 +684,19 @@ impl Server { let sender = request.sender_id; let receipt = request.receipt(); - let response = self + match self .peer .forward_request(sender, host, request.payload.clone()) - .await?; - self.peer.respond(receipt, response)?; + .await + { + Ok(response) => self.peer.respond(receipt, response)?, + Err(error) => self.peer.respond_with_error( + receipt, + proto::Error { + message: error.to_string(), + }, + )?, + } Ok(()) } @@ -708,11 +716,19 @@ impl Server { let sender = request.sender_id; let receipt = request.receipt(); - let response = self + match self .peer .forward_request(sender, host, request.payload.clone()) - .await?; - self.peer.respond(receipt, response)?; + .await + { + Ok(response) => self.peer.respond(receipt, response)?, + Err(error) => self.peer.respond_with_error( + receipt, + proto::Error { + message: error.to_string(), + }, + )?, + } Ok(()) } @@ -731,11 +747,19 @@ impl Server { let sender = request.sender_id; let receipt = request.receipt(); - let response = self + match self .peer .forward_request(sender, host, request.payload.clone()) - .await?; - self.peer.respond(receipt, response)?; + .await + { + Ok(response) => self.peer.respond(receipt, response)?, + Err(error) => self.peer.respond_with_error( + receipt, + proto::Error { + message: error.to_string(), + }, + )?, + } Ok(()) } @@ -754,11 +778,19 @@ impl Server { let sender = request.sender_id; let receipt = request.receipt(); - let response = self + match self .peer .forward_request(sender, host, request.payload.clone()) - .await?; - self.peer.respond(receipt, response)?; + .await + { + Ok(response) => self.peer.respond(receipt, response)?, + Err(error) => self.peer.respond_with_error( + receipt, + proto::Error { + message: error.to_string(), + }, + )?, + } Ok(()) } @@ -777,11 +809,19 @@ impl Server { let sender = request.sender_id; let receipt = request.receipt(); - let response = self + match self .peer .forward_request(sender, host, request.payload.clone()) - .await?; - self.peer.respond(receipt, response)?; + .await + { + Ok(response) => self.peer.respond(receipt, response)?, + Err(error) => self.peer.respond_with_error( + receipt, + proto::Error { + message: error.to_string(), + }, + )?, + } Ok(()) }