From 08bd4efefae287a3b21896a86c3720e547a78000 Mon Sep 17 00:00:00 2001 From: Kevin Yue Date: Sat, 23 Mar 2024 20:05:54 +0800 Subject: [PATCH] Improve the error message Related #327 --- crates/gpapi/src/gateway/login.rs | 13 ++++++++++--- crates/gpapi/src/portal/config.rs | 13 ++++++++++--- crates/gpapi/src/portal/prelogin.rs | 8 ++++++-- crates/gpapi/src/utils/mod.rs | 17 ++++++++++++++++- 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/crates/gpapi/src/gateway/login.rs b/crates/gpapi/src/gateway/login.rs index 5ba83b7..844613b 100644 --- a/crates/gpapi/src/gateway/login.rs +++ b/crates/gpapi/src/gateway/login.rs @@ -1,5 +1,5 @@ use anyhow::bail; -use log::info; +use log::{info, warn}; use reqwest::Client; use roxmltree::Document; use urlencoding::encode; @@ -7,7 +7,7 @@ use urlencoding::encode; use crate::{ credential::Credential, gp_params::GpParams, - utils::{normalize_server, remove_url_scheme}, + utils::{normalize_server, parse_gp_error, remove_url_scheme}, }; pub async fn gateway_login(gateway: &str, cred: &Credential, gp_params: &GpParams) -> anyhow::Result { @@ -32,7 +32,14 @@ pub async fn gateway_login(gateway: &str, cred: &Credential, gp_params: &GpParam let status = res.status(); if status.is_client_error() || status.is_server_error() { - bail!("Gateway login error: {}", status) + let (reason, res) = parse_gp_error(res).await; + + warn!( + "Gateway login error: reason={}, status={}, response={}", + reason, status, res + ); + + bail!("Gateway login error, reason: {}", reason); } let res_xml = res.text().await?; diff --git a/crates/gpapi/src/portal/config.rs b/crates/gpapi/src/portal/config.rs index e20981a..c5c7f3d 100644 --- a/crates/gpapi/src/portal/config.rs +++ b/crates/gpapi/src/portal/config.rs @@ -1,5 +1,5 @@ use anyhow::bail; -use log::info; +use log::{info, warn}; use reqwest::{Client, StatusCode}; use roxmltree::Document; use serde::Serialize; @@ -10,7 +10,7 @@ use crate::{ gateway::{parse_gateways, Gateway}, gp_params::GpParams, portal::PortalError, - utils::{normalize_server, remove_url_scheme, xml}, + utils::{normalize_server, parse_gp_error, remove_url_scheme, xml}, }; #[derive(Debug, Serialize, Type)] @@ -110,7 +110,14 @@ pub async fn retrieve_config(portal: &str, cred: &Credential, gp_params: &GpPara } if status.is_client_error() || status.is_server_error() { - bail!("Portal config error: {}", status) + let (reason, res) = parse_gp_error(res).await; + + warn!( + "Portal config error: reason={}, status={}, response={}", + reason, status, res + ); + + bail!("Portal config error, reason: {}", reason); } let res_xml = res.text().await.map_err(|e| PortalError::ConfigError(e.to_string()))?; diff --git a/crates/gpapi/src/portal/prelogin.rs b/crates/gpapi/src/portal/prelogin.rs index 4f1d133..12c801e 100644 --- a/crates/gpapi/src/portal/prelogin.rs +++ b/crates/gpapi/src/portal/prelogin.rs @@ -1,5 +1,5 @@ use anyhow::bail; -use log::info; +use log::{info, warn}; use reqwest::{Client, StatusCode}; use roxmltree::Document; use serde::Serialize; @@ -8,7 +8,7 @@ use specta::Type; use crate::{ gp_params::GpParams, portal::PortalError, - utils::{base64, normalize_server, xml}, + utils::{base64, normalize_server, parse_gp_error, xml}, }; const REQUIRED_PARAMS: [&str; 8] = [ @@ -126,6 +126,10 @@ pub async fn prelogin(portal: &str, gp_params: &GpParams) -> anyhow::Result anyhow::Result { pub fn remove_url_scheme(s: &str) -> String { s.replace("http://", "").replace("https://", "") } + +pub(crate) async fn parse_gp_error(res: Response) -> (String, String) { + let reason = res + .headers() + .get("x-private-pan-globalprotect") + .map_or_else(|| "", |v| v.to_str().unwrap_or("")) + .to_string(); + + let res = res.text().await.map_or_else( + |_| "".to_string(), + |v| if v.is_empty() { "".to_string() } else { v }, + ); + + (reason, res) +}