区分 Raw 图片 PNG 资源限制错误
将有效但超出解码限制的 PNG 映射为明确的 400 提示 补充超大合法 PNG 的回归测试
This commit is contained in:
@@ -243,7 +243,7 @@ fn decode_image(value: RawImageData, field: &str) -> Result<ReferenceImage, AppE
|
||||
}
|
||||
reader
|
||||
.decode()
|
||||
.map_err(|_| bad_request(format!("{field}.data 必须是有效 PNG 文件")))?;
|
||||
.map_err(|error| map_decode_image_error(field, error))?;
|
||||
Ok(ReferenceImage {
|
||||
bytes,
|
||||
file_name: format!("{field}.png"),
|
||||
@@ -251,6 +251,16 @@ fn decode_image(value: RawImageData, field: &str) -> Result<ReferenceImage, AppE
|
||||
})
|
||||
}
|
||||
|
||||
fn map_decode_image_error(field: &str, error: image::ImageError) -> AppError {
|
||||
let message = match error {
|
||||
image::ImageError::Limits(_) => {
|
||||
format!("{field}.data 超出 PNG 尺寸或解码资源上限(单边不超过 {RAW_IMAGE_MAX_EDGE}px)")
|
||||
}
|
||||
_ => format!("{field}.data 必须是有效 PNG 文件"),
|
||||
};
|
||||
bad_request(message)
|
||||
}
|
||||
|
||||
async fn raw_image_edit_price(state: &AppState, width: u32, height: u32) -> Result<u32, AppError> {
|
||||
let tier = if width.max(height) > 1536 { "2K" } else { "1K" };
|
||||
state
|
||||
@@ -373,4 +383,24 @@ mod tests {
|
||||
assert!(prepare_request(serde_json::from_value(payload).expect("request")).is_err());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn oversized_valid_png_reports_resource_limit() {
|
||||
let payload = serde_json::json!({
|
||||
"image": {
|
||||
"data": encoded_png(RAW_IMAGE_MAX_EDGE + 1, 1),
|
||||
"mimeType": "image/png"
|
||||
},
|
||||
"prompt": "edit",
|
||||
"width": 1024,
|
||||
"height": 1024
|
||||
});
|
||||
let parsed: RawImageEditRequest = serde_json::from_value(payload).expect("request");
|
||||
let error = match prepare_request(parsed) {
|
||||
Ok(_) => panic!("oversized PNG should fail"),
|
||||
Err(error) => error,
|
||||
};
|
||||
|
||||
assert!(format!("{error:?}").contains("超出 PNG 尺寸或解码资源上限"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user