From 4dcf38715bacf1ac75ba6d322c011ecb2909f34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 8 Sep 2026 12:21:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=9B=BE=E7=89=87=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E9=80=89=E9=A1=B9=20multipart=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 覆盖质量、背景、输出格式与 mask 文件字段 断言文件名、MIME 类型和字节内容均正确发送 --- .../src/vector_engine/curl_transport.rs | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs b/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs index fdc35a71d..42832b6ed 100644 --- a/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs +++ b/server-rs/crates/platform-image/src/vector_engine/curl_transport.rs @@ -429,6 +429,53 @@ mod tests { server.abort(); } + #[tokio::test] + async fn vector_engine_curl_transport_posts_raw_edit_options_and_mask() { + let (base_url, server, request_rx) = start_single_response_server().await; + let response = send_vector_engine_multipart_edit_request_with_curl_options( + format!("{base_url}/v1/images/edits").as_str(), + "test-key", + GPT_IMAGE_2_MODEL, + "测试提示词", + None, + "1536x1024", + 1, + &[ReferenceImage { + bytes: b"reference".to_vec(), + mime_type: "image/webp".to_string(), + file_name: "reference.webp".to_string(), + }], + Some(&RawImageEditOptions { + quality: Some("high".to_string()), + background: Some("transparent".to_string()), + output_format: Some("png".to_string()), + width: 1536, + height: 1024, + mask: Some(ReferenceImage { + bytes: b"mask-bytes".to_vec(), + mime_type: "image/png".to_string(), + file_name: "mask.png".to_string(), + }), + }), + 1_000, + ) + .await + .expect("curl multipart raw edit request should succeed"); + + assert_eq!(response.status, 200); + let request = request_rx + .await + .expect("mock server should capture request"); + let request_text = String::from_utf8_lossy(request.as_slice()); + assert!(request_text.contains("name=\"quality\"\r\n\r\nhigh")); + assert!(request_text.contains("name=\"background\"\r\n\r\ntransparent")); + assert!(request_text.contains("name=\"output_format\"\r\n\r\npng")); + assert!(request_text.contains("name=\"mask\"; filename=\"mask.png\"")); + assert!(request_text.contains("Content-Type: image/png")); + assert!(request_text.contains("mask-bytes")); + server.abort(); + } + async fn start_single_response_server() -> ( String, tokio::task::JoinHandle<()>,