aboutsummaryrefslogtreecommitdiff
path: root/src/server/client_commands.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/client_commands.rs')
-rw-r--r--src/server/client_commands.rs30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/server/client_commands.rs b/src/server/client_commands.rs
index 86243e31..34be0519 100644
--- a/src/server/client_commands.rs
+++ b/src/server/client_commands.rs
@@ -92,6 +92,20 @@ pub(crate) fn error_message(
}
}
+fn correlate_response_id(response: String, request_id: &str) -> String {
+ let Ok(mut value) = serde_json::from_str::<serde_json::Value>(&response) else {
+ return response;
+ };
+ let Some(id) = value.get_mut("id") else {
+ return response;
+ };
+ if id.as_str() == Some(request_id) {
+ return response;
+ }
+ *id = serde_json::Value::String(request_id.to_owned());
+ serde_json::to_string(&value).unwrap_or(response)
+}
+
pub(crate) fn spawn_response_waiter(
client_id: u64,
boot_id: String,
@@ -109,7 +123,7 @@ pub(crate) fn spawn_response_waiter(
"endpoint command ended without a response",
)
});
- let response = response.into_bytes();
+ let response = correlate_response_id(response, &request_id).into_bytes();
if response.is_empty() {
let _ = server_event_tx.blocking_send(
ServerEvent::ClientShellEndpointResponseChunkReady {
@@ -319,6 +333,20 @@ mod tests {
}
#[test]
+ fn endpoint_response_uses_the_client_request_id() {
+ let response = serde_json::json!({
+ "id": "endpoint:boot-a:7:client-shell:1",
+ "result": { "type": "ok" }
+ })
+ .to_string();
+
+ let correlated = correlate_response_id(response, "client-shell:1");
+ let decoded: serde_json::Value = serde_json::from_str(&correlated).expect("response json");
+
+ assert_eq!(decoded["id"], "client-shell:1");
+ }
+
+ #[test]
fn endpoint_responses_are_chunked_without_truncation() {
let (response_tx, response_rx) = mpsc::channel();
let (event_tx, mut event_rx) = tokio_mpsc::channel(8);