diff --git a/Cargo.lock b/Cargo.lock index 5a06b414..f822e0d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10399,6 +10399,7 @@ dependencies = [ "urlencoding", "yaak-common", "yaak-models", + "yaak-templates", "yaak-tls", "zstd", ] diff --git a/crates-tauri/yaak-app/src/lib.rs b/crates-tauri/yaak-app/src/lib.rs index 480995dd..23d357a1 100644 --- a/crates-tauri/yaak-app/src/lib.rs +++ b/crates-tauri/yaak-app/src/lib.rs @@ -34,6 +34,7 @@ use tokio::time; use yaak_common::command::new_checked_command; use yaak_crypto::manager::EncryptionManager; use yaak_grpc::manager::{GrpcConfig, GrpcHandle}; +use yaak_templates::strip_json_comments::strip_json_comments; use yaak_grpc::{Code, ServiceDefinition, serialize_message}; use yaak_mac_window::AppHandleMacWindowExt; use yaak_models::models::{ @@ -433,6 +434,7 @@ async fn cmd_grpc_go( result.expect("Failed to render template") }) }); + let msg = strip_json_comments(&msg); in_msg_tx.try_send(msg.clone()).unwrap(); } Ok(IncomingMsg::Commit) => { @@ -468,6 +470,7 @@ async fn cmd_grpc_go( &RenderOptions { error_behavior: RenderErrorBehavior::Throw }, ) .await?; + let msg = strip_json_comments(&msg); app_handle.db().upsert_grpc_event( &GrpcEvent { diff --git a/crates/yaak-http/Cargo.toml b/crates/yaak-http/Cargo.toml index 20183503..34ebba4b 100644 --- a/crates/yaak-http/Cargo.toml +++ b/crates/yaak-http/Cargo.toml @@ -29,4 +29,5 @@ tower-service = "0.3.3" urlencoding = "2.1.3" yaak-common = { workspace = true } yaak-models = { workspace = true } +yaak-templates = { workspace = true } yaak-tls = { workspace = true } diff --git a/crates/yaak-http/src/types.rs b/crates/yaak-http/src/types.rs index 3ca14e15..1131b58c 100644 --- a/crates/yaak-http/src/types.rs +++ b/crates/yaak-http/src/types.rs @@ -11,6 +11,7 @@ use std::time::Duration; use tokio::io::AsyncRead; use yaak_common::serde::{get_bool, get_str, get_str_map}; use yaak_models::models::HttpRequest; +use yaak_templates::strip_json_comments::strip_json_comments; pub(crate) const MULTIPART_BOUNDARY: &str = "------YaakFormBoundary"; @@ -136,14 +137,31 @@ pub fn append_query_params(url: &str, params: Vec<(String, String)>) -> String { fn build_url(r: &HttpRequest) -> String { let (url_string, params) = apply_path_placeholders(&ensure_proto(&r.url), &r.url_parameters); - append_query_params( + let mut url = append_query_params( &url_string, params .iter() .filter(|p| p.enabled && !p.name.is_empty()) .map(|p| (p.name.clone(), p.value.clone())) .collect(), - ) + ); + + // GraphQL GET requests encode query/variables as URL query parameters + if r.method.to_lowercase() == "get" && r.body_type.as_deref() == Some("graphql") { + url = append_graphql_query_params(&url, &r.body); + } + + url +} + +fn append_graphql_query_params(url: &str, body: &BTreeMap) -> String { + let query = get_str_map(body, "query").to_string(); + let variables = strip_json_comments(&get_str_map(body, "variables")); + let mut params = vec![("query".to_string(), query)]; + if !variables.trim().is_empty() { + params.push(("variables".to_string(), variables)); + } + append_query_params(url, params) } fn build_headers(r: &HttpRequest) -> Vec<(String, String)> { @@ -266,7 +284,7 @@ fn build_graphql_body( body: &BTreeMap, ) -> Option { let query = get_str_map(body, "query"); - let variables = get_str_map(body, "variables"); + let variables = strip_json_comments(&get_str_map(body, "variables")); if method.to_lowercase() == "get" { // GraphQL GET requests use query parameters, not a body