From 28b4ad28870c5a9682ec66792751a61b75163d13 Mon Sep 17 00:00:00 2001 From: Martin Zurowietz Date: Fri, 12 Dec 2025 12:15:00 +0100 Subject: [PATCH] webdav: fix range header formatting in relay request An open-ended range like `bytes=0-` produced an invalid header like "bytes=0-null", resulting in no data being transferred. This patch implements support for open-ended ranges (`bytes=0-`) and suffix ranges (`bytes=-500`). References https://github.com/dCache/dcache/issues/7971 Signed-off-by: Martin Zurowietz --- .../org/dcache/webdav/DcacheResourceFactory.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/modules/dcache-webdav/src/main/java/org/dcache/webdav/DcacheResourceFactory.java b/modules/dcache-webdav/src/main/java/org/dcache/webdav/DcacheResourceFactory.java index bda8efb5e6c..e6f5d7f2b0c 100644 --- a/modules/dcache-webdav/src/main/java/org/dcache/webdav/DcacheResourceFactory.java +++ b/modules/dcache-webdav/src/main/java/org/dcache/webdav/DcacheResourceFactory.java @@ -1793,8 +1793,19 @@ public void relayData(OutputStream outputStream, io.milton.http.Range range) try { connection.setRequestProperty("Connection", "Close"); if (range != null) { - connection.addRequestProperty("Range", - String.format("bytes=%d-%d", range.getStart(), range.getFinish())); + String rangeHeader; + Long start = range.getStart(); + Long finish = range.getFinish(); + + if (start == null && finish != null) { + rangeHeader = String.format("bytes=-%d", finish); + } else if (start != null && finish == null) { + rangeHeader = String.format("bytes=%d-", start); + } else { + rangeHeader = String.format("bytes=%d-%d", start, finish); + } + + connection.addRequestProperty("Range", rangeHeader); } connection.connect();