Strip JSON comments for grpc and graphql vars

This commit is contained in:
Gregory Schier
2026-03-05 07:56:24 -08:00
parent 2cf70c1771
commit 8bb4d9cb5e
4 changed files with 26 additions and 3 deletions

1
Cargo.lock generated
View File

@@ -10399,6 +10399,7 @@ dependencies = [
"urlencoding", "urlencoding",
"yaak-common", "yaak-common",
"yaak-models", "yaak-models",
"yaak-templates",
"yaak-tls", "yaak-tls",
"zstd", "zstd",
] ]

View File

@@ -34,6 +34,7 @@ use tokio::time;
use yaak_common::command::new_checked_command; use yaak_common::command::new_checked_command;
use yaak_crypto::manager::EncryptionManager; use yaak_crypto::manager::EncryptionManager;
use yaak_grpc::manager::{GrpcConfig, GrpcHandle}; use yaak_grpc::manager::{GrpcConfig, GrpcHandle};
use yaak_templates::strip_json_comments::strip_json_comments;
use yaak_grpc::{Code, ServiceDefinition, serialize_message}; use yaak_grpc::{Code, ServiceDefinition, serialize_message};
use yaak_mac_window::AppHandleMacWindowExt; use yaak_mac_window::AppHandleMacWindowExt;
use yaak_models::models::{ use yaak_models::models::{
@@ -433,6 +434,7 @@ async fn cmd_grpc_go<R: Runtime>(
result.expect("Failed to render template") result.expect("Failed to render template")
}) })
}); });
let msg = strip_json_comments(&msg);
in_msg_tx.try_send(msg.clone()).unwrap(); in_msg_tx.try_send(msg.clone()).unwrap();
} }
Ok(IncomingMsg::Commit) => { Ok(IncomingMsg::Commit) => {
@@ -468,6 +470,7 @@ async fn cmd_grpc_go<R: Runtime>(
&RenderOptions { error_behavior: RenderErrorBehavior::Throw }, &RenderOptions { error_behavior: RenderErrorBehavior::Throw },
) )
.await?; .await?;
let msg = strip_json_comments(&msg);
app_handle.db().upsert_grpc_event( app_handle.db().upsert_grpc_event(
&GrpcEvent { &GrpcEvent {

View File

@@ -29,4 +29,5 @@ tower-service = "0.3.3"
urlencoding = "2.1.3" urlencoding = "2.1.3"
yaak-common = { workspace = true } yaak-common = { workspace = true }
yaak-models = { workspace = true } yaak-models = { workspace = true }
yaak-templates = { workspace = true }
yaak-tls = { workspace = true } yaak-tls = { workspace = true }

View File

@@ -11,6 +11,7 @@ use std::time::Duration;
use tokio::io::AsyncRead; use tokio::io::AsyncRead;
use yaak_common::serde::{get_bool, get_str, get_str_map}; use yaak_common::serde::{get_bool, get_str, get_str_map};
use yaak_models::models::HttpRequest; use yaak_models::models::HttpRequest;
use yaak_templates::strip_json_comments::strip_json_comments;
pub(crate) const MULTIPART_BOUNDARY: &str = "------YaakFormBoundary"; 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 { fn build_url(r: &HttpRequest) -> String {
let (url_string, params) = apply_path_placeholders(&ensure_proto(&r.url), &r.url_parameters); 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, &url_string,
params params
.iter() .iter()
.filter(|p| p.enabled && !p.name.is_empty()) .filter(|p| p.enabled && !p.name.is_empty())
.map(|p| (p.name.clone(), p.value.clone())) .map(|p| (p.name.clone(), p.value.clone()))
.collect(), .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, serde_json::Value>) -> 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)> { fn build_headers(r: &HttpRequest) -> Vec<(String, String)> {
@@ -266,7 +284,7 @@ fn build_graphql_body(
body: &BTreeMap<String, serde_json::Value>, body: &BTreeMap<String, serde_json::Value>,
) -> Option<SendableBodyWithMeta> { ) -> Option<SendableBodyWithMeta> {
let query = get_str_map(body, "query"); 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" { if method.to_lowercase() == "get" {
// GraphQL GET requests use query parameters, not a body // GraphQL GET requests use query parameters, not a body