Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ObjectWriteResponse: return checksums if any #1609

Merged
merged 5 commits into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion api/src/main/java/io/minio/MinioAsyncClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -532,7 +532,8 @@ public CompletableFuture<ObjectWriteResponse> copyObject(CopyObjectArgs args)
args.region(),
args.object(),
result.etag(),
response.header("x-amz-version-id"));
response.header("x-amz-version-id"),
result);
} catch (XmlParserException e) {
throw new CompletionException(e);
} finally {
Expand Down
66 changes: 66 additions & 0 deletions api/src/main/java/io/minio/ObjectWriteResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,68 @@

package io.minio;

import io.minio.messages.CompleteMultipartUploadOutput;
import io.minio.messages.CopyObjectResult;
import okhttp3.Headers;

/** Response class of any APIs doing object creation. */
public class ObjectWriteResponse extends GenericResponse {
private String etag;
private String versionId;
private String checksumCRC32;
private String checksumCRC32C;
private String checksumSHA1;
private String checksumSHA256;

public ObjectWriteResponse(
Headers headers, String bucket, String region, String object, String etag, String versionId) {
super(headers, bucket, region, object);
this.etag = etag;
this.versionId = versionId;
if (headers != null) {
this.checksumCRC32 = headers.get("x-amz-checksum-crc32");
this.checksumCRC32C = headers.get("x-amz-checksum-crc32c");
this.checksumSHA1 = headers.get("x-amz-checksum-sha1");
this.checksumSHA256 = headers.get("x-amz-checksum-sha256");
}
}

public ObjectWriteResponse(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. By default, populate checksums from headers
  2. Accept CopyObjectResult as an additional argument and populate checksums
  3. Accept CompleteMultipartUploadResult as an additional argument and populate checkums

Headers headers,
String bucket,
String region,
String object,
String etag,
String versionId,
CopyObjectResult result) {
super(headers, bucket, region, object);
this.etag = etag;
this.versionId = versionId;
if (result != null) {
this.checksumCRC32 = result.checksumCRC32();
this.checksumCRC32C = result.checksumCRC32C();
this.checksumSHA1 = result.checksumSHA1();
this.checksumSHA256 = result.checksumSHA256();
}
}

public ObjectWriteResponse(
Headers headers,
String bucket,
String region,
String object,
String etag,
String versionId,
CompleteMultipartUploadOutput result) {
super(headers, bucket, region, object);
this.etag = etag;
this.versionId = versionId;
if (result != null) {
this.checksumCRC32 = result.checksumCRC32();
this.checksumCRC32C = result.checksumCRC32C();
this.checksumSHA1 = result.checksumSHA1();
this.checksumSHA256 = result.checksumSHA256();
}
}

public String etag() {
Expand All @@ -37,4 +87,20 @@ public String etag() {
public String versionId() {
return versionId;
}

public String checksumCRC32() {
return checksumCRC32;
}

public String checksumCRC32C() {
return checksumCRC32C;
}

public String checksumSHA1() {
return checksumSHA1;
}

public String checksumSHA256() {
return checksumSHA256;
}
}
3 changes: 2 additions & 1 deletion api/src/main/java/io/minio/S3Base.java
Original file line number Diff line number Diff line change
Expand Up @@ -2015,7 +2015,8 @@ public CompletableFuture<ObjectWriteResponse> completeMultipartUploadAsync(
result.location(),
result.object(),
result.etag(),
response.header("x-amz-version-id"));
response.header("x-amz-version-id"),
result);
} catch (XmlParserException e) {
// As this CompleteMultipartUpload REST call succeeded, just log it.
Logger.getLogger(S3Base.class.getName())
Expand Down
28 changes: 28 additions & 0 deletions api/src/main/java/io/minio/messages/CopyObjectResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ public class CopyObjectResult {
@Element(name = "LastModified")
private ResponseDate lastModified;

@Element(name = "ChecksumCRC32", required = false)
private String checksumCRC32;

@Element(name = "ChecksumCRC32C", required = false)
private String checksumCRC32C;

@Element(name = "ChecksumSHA1", required = false)
private String checksumSHA1;

@Element(name = "ChecksumSHA256", required = false)
private String checksumSHA256;

public CopyObjectResult() {}

/** Returns ETag of the object. */
Expand All @@ -46,4 +58,20 @@ public String etag() {
public ZonedDateTime lastModified() {
return lastModified.zonedDateTime();
}

public String checksumCRC32() {
return checksumCRC32;
}

public String checksumCRC32C() {
return checksumCRC32C;
}

public String checksumSHA1() {
return checksumSHA1;
}

public String checksumSHA256() {
return checksumSHA256;
}
}
Loading