From 13c119be11d4d17c49e2eaabb31b00626f5975f7 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 (cherry picked from commit c7cbf8eede79d27788d13d6cc920c89a79869e0b) Signed-off-by: Tigran Mkrtchyan --- .../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 ae2d7594aa5..03c2ff298c1 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 @@ -1796,8 +1796,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();