@@ -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,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
237238fn store_certs (
0 commit comments