Skip to content

Commit e391bfc

Browse files
committed
fix(ssh): failure in backend error response parsing
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 e391bfc

File tree

1 file changed

+29
-21
lines changed

1 file changed

+29
-21
lines changed

src/ssh.rs

Lines changed: 29 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,32 @@ 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}"))?;
187+
188+
if !status.is_success() {
189+
#[derive(Deserialize)]
190+
struct ErrorMessage {
191+
#[serde(rename = "internalMsg")]
192+
internal_message: String,
193+
}
194+
195+
let err = if let Ok(ErrorMessage {
196+
internal_message: message,
197+
}) = serde_json::from_str(&body)
198+
{
199+
anyhow!(message)
200+
} else {
201+
anyhow!("unknown error type.")
202+
};
187203

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-
),
204+
Err(err)
205+
} else {
206+
serde_json::from_str(&body).map_err(|_| anyhow!("unsupported reply."))
194207
}
195208
}
196209

@@ -224,14 +237,9 @@ async fn request_ssh_tunnel(
224237
.await
225238
.map_err(|err| anyhow::anyhow!("Failed to perform ssh tunnel request: {err}"))?;
226239

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?)
240+
unpack_response(response)
241+
.await
242+
.map_err(|err| anyhow::anyhow!("Something went wrong creating the ssh tunnel: {err}"))
235243
}
236244

237245
fn store_certs(

0 commit comments

Comments
 (0)