diff --git a/core/src/main/scala/sttp/model/headers/Range.scala b/core/src/main/scala/sttp/model/headers/Range.scala index 9bbaebf0..a31df891 100644 --- a/core/src/main/scala/sttp/model/headers/Range.scala +++ b/core/src/main/scala/sttp/model/headers/Range.scala @@ -13,11 +13,11 @@ case class Range(start: Option[Long], end: Option[Long], unit: String) { def toContentRange(fileSize: Long, unit: String = ContentRangeUnits.Bytes): ContentRange = ContentRange(unit, start.zip(end).headOption, Some(fileSize)) - val contentLength: Long = end.zip(start).map(r => r._1 - r._2).headOption.getOrElse(0) + val contentLength: Long = end.zip(start).map(r => r._1 - r._2 + 1).headOption.getOrElse(0) def isValid(contentSize: Long): Boolean = (start, end) match { - case (Some(_start), Some(_end)) => _start < _end && _end < contentSize + case (Some(_start), Some(_end)) => _start <= _end && _end < contentSize case (Some(_start), None) => _start < contentSize case (None, Some(_end)) => _end < contentSize case _ => false @@ -56,7 +56,7 @@ object Range { private def validateRange(range: Range): Boolean = (range.start, range.end) match { - case (Some(start), Some(end)) => start < end + case (Some(start), Some(end)) => start <= end case (Some(_), None) => true case (None, Some(_)) => true case _ => false diff --git a/core/src/test/scala/sttp/model/headers/RangeTest.scala b/core/src/test/scala/sttp/model/headers/RangeTest.scala index e304aca0..b2a8053c 100644 --- a/core/src/test/scala/sttp/model/headers/RangeTest.scala +++ b/core/src/test/scala/sttp/model/headers/RangeTest.scala @@ -6,6 +6,11 @@ import sttp.model.ContentRangeUnits class RangeTest extends AnyFlatSpec with Matchers { + it should "properly parse the Range header of length one" in { + val actual = Range.parse("bytes=10-10") + actual shouldBe Right(List(Range(Some(10), Some(10), ContentRangeUnits.Bytes))) + } + it should "properly parse simplest Range header" in { val actual = Range.parse("bytes=200-1000") actual shouldBe Right(List(Range(Some(200), Some(1000), ContentRangeUnits.Bytes))) @@ -109,7 +114,7 @@ class RangeTest extends AnyFlatSpec with Matchers { } it should "calculate content length" in { - Range(Some(100), Some(200), ContentRangeUnits.Bytes).contentLength shouldBe 100 + Range(Some(100), Some(200), ContentRangeUnits.Bytes).contentLength shouldBe 101 } it should "map RangeValue to content type" in {