From 27c0cd4f9b88d5157999a2f3db42227dbd65580e Mon Sep 17 00:00:00 2001 From: rustdesk Date: Fri, 27 Mar 2026 14:39:47 +0800 Subject: [PATCH] fix per review --- src/common.rs | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/common.rs b/src/common.rs index b6aaa6548..12adc3bff 100644 --- a/src/common.rs +++ b/src/common.rs @@ -1646,14 +1646,8 @@ async fn http_request_via_tcp_proxy( body: Option<&str>, header: &str, ) -> ResultType { - let mut headers = parse_json_header_entries(header)?; + let headers = parse_json_header_entries(header)?; let body_bytes = body.unwrap_or("").as_bytes(); - // Always include Content-Type for consistency with parse_simple_header - headers.push(HeaderEntry { - name: "Content-Type".into(), - value: "application/json".into(), - ..Default::default() - }); let resp = tcp_proxy_request(method, url, body_bytes, headers).await?; http_proxy_response_to_json(resp) @@ -2826,6 +2820,38 @@ mod tests { assert!(err.contains("HTTP header information parsing failed!")); } + #[test] + fn test_parse_json_header_entries_preserves_single_content_type() { + let headers = parse_json_header_entries( + r#"{"Content-Type":"text/plain","Authorization":"Bearer token"}"#, + ) + .unwrap(); + + assert_eq!( + headers + .iter() + .filter(|entry| entry.name.eq_ignore_ascii_case("Content-Type")) + .count(), + 1 + ); + assert_eq!( + headers + .iter() + .find(|entry| entry.name.eq_ignore_ascii_case("Content-Type")) + .map(|entry| entry.value.as_str()), + Some("text/plain") + ); + } + + #[test] + fn test_parse_json_header_entries_does_not_add_default_content_type() { + let headers = parse_json_header_entries(r#"{"Authorization":"Bearer token"}"#).unwrap(); + + assert!(!headers + .iter() + .any(|entry| entry.name.eq_ignore_ascii_case("Content-Type"))); + } + #[test] fn test_tcp_proxy_fallback_log_condition() { assert_eq!(tcp_proxy_fallback_log_condition(), "failed or 5xx");