From 38e29535a2fed0fcb079e990a0fd81ec67f81e3f Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 17 Mar 2026 22:47:42 -0700 Subject: [PATCH] Set HasName and HasMime flags for empty values matching Go Go's CreateNeedleFromRequest sets HasName and HasMime flags even when the filename or MIME type is empty (len < 256 is true for len 0). Rust skipped empty values, causing the on-disk needle format to differ: Go-written needles include extra bytes for the empty name/mime size fields, changing the serialized needle size in the idx entry. This ensures binary format compatibility between Go and Rust servers. --- seaweed-volume/src/server/handlers.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/seaweed-volume/src/server/handlers.rs b/seaweed-volume/src/server/handlers.rs index 28ef78bcb..0a5440f48 100644 --- a/seaweed-volume/src/server/handlers.rs +++ b/seaweed-volume/src/server/handlers.rs @@ -2267,7 +2267,8 @@ pub async fn post_handler( n.set_is_compressed(); } - if !mime_type.is_empty() && mime_type.len() < 256 { + // Go sets HasMime even for empty MIME types: if len(pu.MimeType) < 256 + if mime_type.len() < 256 { n.mime = mime_type.as_bytes().to_vec(); n.set_has_mime(); } @@ -2291,8 +2292,9 @@ pub async fn post_handler( } } - // Set filename on needle (matches Go: n.Name = []byte(pu.FileName)) - if !filename.is_empty() && filename.len() < 256 { + // Set filename on needle (matches Go: if len(pu.FileName) < 256) + // Go sets HasName even for empty filenames + if filename.len() < 256 { n.name = filename.as_bytes().to_vec(); n.name_size = filename.len() as u8; n.set_has_name();