Browse Source

http: match Go bool parsing for dl

rust-volume-server
Chris Lu 4 days ago
parent
commit
e918cf9bd5
  1. 11
      seaweed-volume/src/server/handlers.rs
  2. 38
      test/volume_server/http/headers_static_test.go

11
seaweed-volume/src/server/handlers.rs

@ -1024,8 +1024,7 @@ async fn get_or_head_handler_inner(
// Only set if not already set by response-content-disposition query param
if !response_headers.contains_key(header::CONTENT_DISPOSITION) && !filename.is_empty() {
let disposition_type = if let Some(ref dl_val) = query.dl {
// Parse dl as bool: "true", "1" -> attachment; anything else -> inline
if dl_val == "true" || dl_val == "1" {
if parse_go_bool(dl_val).unwrap_or(false) {
"attachment"
} else {
"inline"
@ -1315,6 +1314,14 @@ fn extract_filename_from_path(path: &str) -> String {
}
}
fn parse_go_bool(value: &str) -> Option<bool> {
match value {
"1" | "t" | "T" | "TRUE" | "True" | "true" => Some(true),
"0" | "f" | "F" | "FALSE" | "False" | "false" => Some(false),
_ => None,
}
}
// ============================================================================
// Image processing helpers
// ============================================================================

38
test/volume_server/http/headers_static_test.go

@ -59,6 +59,44 @@ func TestReadPassthroughHeadersAndDownloadDisposition(t *testing.T) {
}
}
func TestDownloadDispositionUsesGoBoolParsing(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
clusterHarness := framework.StartVolumeCluster(t, matrix.P1())
conn, grpcClient := framework.DialVolumeServer(t, clusterHarness.VolumeGRPCAddress())
defer conn.Close()
const volumeID = uint32(97)
framework.AllocateVolume(t, grpcClient, volumeID, "")
client := framework.NewHTTPClient()
fullFileID := framework.NewFileID(volumeID, 661123, 0x55667789)
uploadResp := framework.UploadBytes(t, client, clusterHarness.VolumeAdminURL(), fullFileID, []byte("dl-bool-parse-content"))
_ = framework.ReadAllAndClose(t, uploadResp)
if uploadResp.StatusCode != http.StatusCreated {
t.Fatalf("upload expected 201, got %d", uploadResp.StatusCode)
}
parts := strings.SplitN(fullFileID, ",", 2)
if len(parts) != 2 {
t.Fatalf("unexpected file id format: %q", fullFileID)
}
fidOnly := parts[1]
url := fmt.Sprintf("%s/%d/%s/%s?dl=t", clusterHarness.VolumeAdminURL(), volumeID, fidOnly, "report.txt")
resp := framework.DoRequest(t, client, mustNewRequest(t, http.MethodGet, url))
_ = framework.ReadAllAndClose(t, resp)
if resp.StatusCode != http.StatusOK {
t.Fatalf("download read expected 200, got %d", resp.StatusCode)
}
contentDisposition := resp.Header.Get("Content-Disposition")
if !strings.Contains(contentDisposition, "attachment") || !strings.Contains(contentDisposition, "report.txt") {
t.Fatalf("download disposition with dl=t mismatch: %q", contentDisposition)
}
}
func TestStaticAssetEndpoints(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")

Loading…
Cancel
Save