This is an automated email from the ASF dual-hosted git repository.
Gargi-jais11 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new b8bc13d9a7e HDDS-16336. S3 GET inverted Range with start inside object
yields negative Content-Length (#11160).
b8bc13d9a7e is described below
commit b8bc13d9a7e63f4cb3e8d9bb631b372eefcbb64a
Author: Mark Tsai <[email protected]>
AuthorDate: Tue Sep 8 16:53:26 2026 +0800
HDDS-16336. S3 GET inverted Range with start inside object yields negative
Content-Length (#11160).
---
.../ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java | 19 +++++++++++++++++++
.../hadoop/ozone/s3/util/RangeHeaderParserUtil.java | 6 +++++-
.../ozone/s3/util/TestRangeHeaderParserUtil.java | 7 +++++++
3 files changed, 31 insertions(+), 1 deletion(-)
diff --git
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
index f56676d37f6..c9f7276da51 100644
---
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
+++
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
@@ -22,6 +22,7 @@
import static org.apache.hadoop.ozone.s3.awssdk.S3SDKTestUtils.createFile;
import static org.apache.hadoop.ozone.s3.util.S3Utils.stripQuotes;
import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
+import static org.apache.http.HttpStatus.SC_OK;
import static org.apache.http.HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@@ -1629,6 +1630,24 @@ public void testUploadPartCopyInvalidRange() {
}
}
+ @Test
+ public void testGetObjectInvertedRange() {
+ final String bucketName = getBucketName();
+ final String keyName = getKeyName();
+ final String content = "0123456789";
+ s3Client.createBucket(b -> b.bucket(bucketName));
+ s3Client.putObject(b -> b.bucket(bucketName).key(keyName),
RequestBody.fromString(content));
+
+ // An inverted range is ignored and the whole object is returned, matching
AWS GetObject.
+ ResponseBytes<GetObjectResponse> response = s3Client.getObjectAsBytes(
+ b -> b.bucket(bucketName).key(keyName).range("bytes=8-3"));
+
+ assertEquals(SC_OK, response.response().sdkHttpResponse().statusCode());
+ assertEquals(content, response.asUtf8String());
+ assertEquals(Long.valueOf(content.length()),
response.response().contentLength());
+ assertNull(response.response().contentRange());
+ }
+
@Test
public void testLowLevelMultipartUpload(@TempDir Path tempDir) throws
Exception {
final String bucketName = getBucketName();
diff --git
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
index 92a0d71983b..ae3c5360ba5 100644
---
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
+++
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
@@ -75,7 +75,11 @@ public static RangeHeader parseRangeHeader(String
rangeHeaderVal, long
end = length - 1;
}
} else {
- if (end >= length) {
+ if (start > end) {
+ readFull = true;
+ start = 0;
+ end = length - 1;
+ } else if (end >= length) {
end = length - 1;
}
}
diff --git
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
index 82fee27d3e1..c9085119fb9 100644
---
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
+++
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
@@ -61,6 +61,13 @@ public void testRangeHeaderParser() {
assertTrue(rangeHeader.isReadFull());
assertFalse(rangeHeader.isInValidRange());
+ // inverted range, start is still inside the object
+ rangeHeader = RangeHeaderParserUtil.parseRangeHeader("bytes=8-3", 10);
+ assertEquals(0, rangeHeader.getStartOffset());
+ assertEquals(9, rangeHeader.getEndOffset());
+ assertTrue(rangeHeader.isReadFull());
+ assertFalse(rangeHeader.isInValidRange());
+
// bytes spec is wrong
rangeHeader = RangeHeaderParserUtil.parseRangeHeader("mb=11-8", 10);
assertEquals(0, rangeHeader.getStartOffset());
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]