Skip to content

Commit 984f6b9

Browse files
authored
fix(ssh): failure in backend error response parsing (#139)
The omnect-cli would print serde deserialization errors upon unsupported response format from the backend. We, therefore, introduce a new function for resolving the response and handling the error message accordingly.
1 parent e3d4bcd commit 984f6b9

File tree

1 file changed

+22
-21
lines changed

1 file changed

+22
-21
lines changed

src/ssh.rs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ use std::path::{Path, PathBuf};
66
use std::process::{Command, Stdio};
77
use std::str;
88

9+
use anyhow::anyhow;
910
use anyhow::{Context, Result};
1011
use directories::ProjectDirs;
1112
use oauth2::AccessToken;
13+
use serde::de::DeserializeOwned;
1214
use serde::{Deserialize, Serialize};
1315
use url::Url;
1416

@@ -176,21 +178,25 @@ struct SshTunnelInfo {
176178
bastion_username: String,
177179
}
178180

179-
async fn into_error_message(response: reqwest::Response) -> String {
180-
#[derive(Deserialize)]
181-
struct ErrorMessage {
182-
#[serde(rename = "internalMsg")]
183-
internal_message: String,
184-
}
185-
181+
async fn unpack_response<T: DeserializeOwned>(response: reqwest::Response) -> Result<T> {
186182
let status = response.status();
183+
let body = response
184+
.text()
185+
.await
186+
.map_err(|err| anyhow!("could not read response body: {err}"))?;
187187

188-
match response.json().await {
189-
Ok(ErrorMessage { internal_message }) => internal_message,
190-
Err(_) => format!(
191-
"Something went wrong while creating the ssh tunnel: {}",
192-
status.canonical_reason().unwrap() // safe
193-
),
188+
if !status.is_success() {
189+
#[derive(Deserialize)]
190+
struct ErrorMessage {
191+
#[serde(rename = "internalMsg")]
192+
internal_message: String,
193+
}
194+
195+
anyhow::bail!(serde_json::from_str::<ErrorMessage>(&body)
196+
.map(|err| err.internal_message)
197+
.unwrap_or_else(|_| "unknown error type".to_string()))
198+
} else {
199+
serde_json::from_str(&body).map_err(|_| anyhow!("unsupported reply."))
194200
}
195201
}
196202

@@ -224,14 +230,9 @@ async fn request_ssh_tunnel(
224230
.await
225231
.map_err(|err| anyhow::anyhow!("Failed to perform ssh tunnel request: {err}"))?;
226232

227-
let status = response.status();
228-
229-
if !status.is_success() {
230-
let error_msg = into_error_message(response).await;
231-
anyhow::bail!("Something went wrong while creating the ssh tunnel. status: {status}, message: {error_msg}");
232-
}
233-
234-
Ok(response.json().await?)
233+
unpack_response(response)
234+
.await
235+
.map_err(|err| anyhow::anyhow!("Something went wrong creating the ssh tunnel: {err}"))
235236
}
236237

237238
fn store_certs(

0 commit comments

Comments
 (0)