From 6991cbee4805990d6b84b6db763f9e207de60d81 Mon Sep 17 00:00:00 2001 From: Wleeaf <179125857+wleeaf@users.noreply.github.com> Date: Sun, 25 Oct 2026 21:21:50 +0000 Subject: [PATCH] range: a suffix range longer than the content selects all of it --- jooby/src/main/java/io/jooby/ByteRange.java | 3 ++- jooby/src/test/java/io/jooby/ByteRangeTest.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/jooby/src/main/java/io/jooby/ByteRange.java b/jooby/src/main/java/io/jooby/ByteRange.java index 37bc47bf65..01bcc9708d 100644 --- a/jooby/src/main/java/io/jooby/ByteRange.java +++ b/jooby/src/main/java/io/jooby/ByteRange.java @@ -85,7 +85,8 @@ static ByteRange parse(@Nullable String value, long contentLength) { long start = range[0]; long end = range[1]; if (start == -1) { - start = contentLength - end; + // A suffix longer than the content selects all of it. + start = Math.max(0, contentLength - end); end = contentLength - 1; } if (end == -1 || end > contentLength - 1) { diff --git a/jooby/src/test/java/io/jooby/ByteRangeTest.java b/jooby/src/test/java/io/jooby/ByteRangeTest.java index 30ac51b666..b1de1fa00d 100644 --- a/jooby/src/test/java/io/jooby/ByteRangeTest.java +++ b/jooby/src/test/java/io/jooby/ByteRangeTest.java @@ -89,6 +89,16 @@ public void byteRange() { assertEquals("bytes 101-199/200", range.getContentRange()); }); + range( + "bytes=-300", + 200, + range -> { + assertEquals(PARTIAL_CONTENT, range.getStatusCode()); + assertEquals(0, range.getStart()); + assertEquals(200, range.getEnd()); + assertEquals("bytes 0-199/200", range.getContentRange()); + }); + // 100-150 is ignored. range( "bytes=0-50, 100-150",