@@ -6,9 +6,11 @@ use std::path::{Path, PathBuf};
66use std:: process:: { Command , Stdio } ;
77use std:: str;
88
9+ use anyhow:: anyhow;
910use anyhow:: { Context , Result } ;
1011use directories:: ProjectDirs ;
1112use oauth2:: AccessToken ;
13+ use serde:: de:: DeserializeOwned ;
1214use serde:: { Deserialize , Serialize } ;
1315use 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
237245fn store_certs (
0 commit comments