Skip to content

Commit 9d4585f

Browse files
authored
Merge pull request #1837 from adobe/1818-correctly-detect-eol-in-chunked-uploads
Correctly detect EOL in chunked uploads
2 parents a5bea08 + dc01aff commit 9d4585f

24 files changed

+907
-456
lines changed

CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ Version 3.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Jav
134134
* Version updates
135135
* TBD
136136

137-
## 3.7.3 - PLANNED
137+
## 3.7.3
138138
3.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Java integration.
139139

140140
* Features and fixes

integration-tests/src/test/resources/sampleFile_large.txt

+129
Large diffs are not rendered by default.

server/src/main/java/com/adobe/testing/s3mock/dto/ChecksumAlgorithm.java

+10
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ public static ChecksumAlgorithm fromString(String value) {
4343
};
4444
}
4545

46+
public static ChecksumAlgorithm fromHeader(String value) {
47+
return switch (value) {
48+
case "x-amz-checksum-sha256" -> SHA256;
49+
case "x-amz-checksum-sha1" -> SHA1;
50+
case "x-amz-checksum-crc32" -> CRC32;
51+
case "x-amz-checksum-crc32c" -> CRC32C;
52+
default -> null;
53+
};
54+
}
55+
4656
public Algorithm toAlgorithm() {
4757
return switch (this) {
4858
case CRC32 -> Algorithm.CRC32;

server/src/main/java/com/adobe/testing/s3mock/service/ObjectService.java

+11-10
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
import static com.adobe.testing.s3mock.S3Exception.NOT_MODIFIED;
2525
import static com.adobe.testing.s3mock.S3Exception.NO_SUCH_KEY;
2626
import static com.adobe.testing.s3mock.S3Exception.PRECONDITION_FAILED;
27+
import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_CHECKSUM;
2728
import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_DECODED_CONTENT_LENGTH;
29+
import static com.adobe.testing.s3mock.util.AwsHttpHeaders.X_AMZ_TRAILER;
2830
import static com.adobe.testing.s3mock.util.HeaderUtil.checksumAlgorithmFromSdk;
2931
import static com.adobe.testing.s3mock.util.HeaderUtil.isChunked;
3032
import static com.adobe.testing.s3mock.util.HeaderUtil.isChunkedAndV4Signed;
@@ -37,6 +39,7 @@
3739
import com.adobe.testing.s3mock.dto.Delete;
3840
import com.adobe.testing.s3mock.dto.DeleteResult;
3941
import com.adobe.testing.s3mock.dto.DeletedS3Object;
42+
import com.adobe.testing.s3mock.dto.Error;
4043
import com.adobe.testing.s3mock.dto.LegalHold;
4144
import com.adobe.testing.s3mock.dto.Owner;
4245
import com.adobe.testing.s3mock.dto.Retention;
@@ -45,9 +48,7 @@
4548
import com.adobe.testing.s3mock.store.BucketStore;
4649
import com.adobe.testing.s3mock.store.ObjectStore;
4750
import com.adobe.testing.s3mock.store.S3ObjectMetadata;
48-
import com.adobe.testing.s3mock.util.AbstractAwsInputStream;
49-
import com.adobe.testing.s3mock.util.AwsChunkedDecodingChecksumInputStream;
50-
import com.adobe.testing.s3mock.util.AwsUnsignedChunkedDecodingChecksumInputStream;
51+
import com.adobe.testing.s3mock.util.AwsChunkedInputStream;
5152
import com.adobe.testing.s3mock.util.DigestUtil;
5253
import java.io.IOException;
5354
import java.io.InputStream;
@@ -161,7 +162,7 @@ public DeleteResult deleteObjects(String bucketName, Delete delete) {
161162
response.addDeletedObject(DeletedS3Object.from(object));
162163
} catch (IllegalStateException e) {
163164
response.addError(
164-
new com.adobe.testing.s3mock.dto.Error("InternalError",
165+
new Error("InternalError",
165166
object.key(),
166167
"We encountered an internal error. Please try again.",
167168
object.versionId()));
@@ -266,13 +267,13 @@ public void verifyRetention(Retention retention) {
266267

267268
public Pair<Path, String> toTempFile(InputStream inputStream, HttpHeaders httpHeaders) {
268269
try {
269-
var tempFile = Files.createTempFile("tempObject", "");
270+
var tempFile = Files.createTempFile("ObjectService", "toTempFile");
270271
try (OutputStream os = Files.newOutputStream(tempFile)) {
271272
InputStream wrappedStream = wrapStream(inputStream, httpHeaders);
272273
wrappedStream.transferTo(os);
273274
ChecksumAlgorithm algorithmFromSdk = checksumAlgorithmFromSdk(httpHeaders);
274275
if (algorithmFromSdk != null
275-
&& wrappedStream instanceof AbstractAwsInputStream awsInputStream) {
276+
&& wrappedStream instanceof AwsChunkedInputStream awsInputStream) {
276277
return Pair.of(tempFile, awsInputStream.getChecksum());
277278
}
278279
return Pair.of(tempFile, null);
@@ -291,11 +292,11 @@ public void verifyChecksum(Path path, String checksum, ChecksumAlgorithm checksu
291292

292293
InputStream wrapStream(InputStream dataStream, HttpHeaders headers) {
293294
var lengthHeader = headers.getFirst(X_AMZ_DECODED_CONTENT_LENGTH);
295+
var trailHeader = headers.getOrEmpty(X_AMZ_TRAILER);
296+
var hasChecksum = trailHeader.stream().anyMatch(h -> h.contains(X_AMZ_CHECKSUM));
294297
var length = lengthHeader == null ? -1 : Long.parseLong(lengthHeader);
295-
if (isChunkedAndV4Signed(headers)) {
296-
return new AwsChunkedDecodingChecksumInputStream(dataStream, length);
297-
} else if (isChunked(headers)) {
298-
return new AwsUnsignedChunkedDecodingChecksumInputStream(dataStream, length);
298+
if (isChunkedAndV4Signed(headers) || isChunked(headers)) {
299+
return new AwsChunkedInputStream(dataStream, length, hasChecksum);
299300
} else {
300301
return dataStream;
301302
}

server/src/main/java/com/adobe/testing/s3mock/util/AbstractAwsInputStream.java

-119
This file was deleted.

server/src/main/java/com/adobe/testing/s3mock/util/AwsChunkedDecodingChecksumInputStream.java

-77
This file was deleted.

0 commit comments

Comments
 (0)