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",