Skip to content

Commit bc9dd08

Browse files
committed
checksum algo prog
1 parent 973a97b commit bc9dd08

4 files changed

Lines changed: 82 additions & 11 deletions

File tree

src/main/java/io/github/jpmorganchase/fusion/api/request/PartFetcher.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.github.jpmorganchase.fusion.api.response.GetPartResponse;
66
import io.github.jpmorganchase.fusion.api.response.Head;
77
import io.github.jpmorganchase.fusion.api.stream.IntegrityCheckingInputStream;
8+
import io.github.jpmorganchase.fusion.digest.PartChecker;
89
import io.github.jpmorganchase.fusion.http.Client;
910
import io.github.jpmorganchase.fusion.http.HttpResponse;
1011
import io.github.jpmorganchase.fusion.oauth.provider.FusionTokenProvider;
@@ -55,6 +56,7 @@ private IntegrityCheckingInputStream getIntegrityCheckingInputStream(
5556
return IntegrityCheckingInputStream.builder()
5657
.part(response.getBody())
5758
.checksum(head.getChecksum())
59+
.partChecker(PartChecker.builder())
5860
.build();
5961
}
6062

src/main/java/io/github/jpmorganchase/fusion/api/response/Head.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@
1818
@EqualsAndHashCode
1919
public class Head {
2020

21-
private static String CHECKSUM_HEADER = "x-jpmc-checksum-sha256";
21+
private static String CHECKSUM_HEADER = "x-jpmc-checksum";
22+
private static String CHECKSUM_SHA256_HEADER = "x-jpmc-checksum-sha256";
2223
private static String VERSION_HEADER = "x-jpmc-version-id";
2324
private static String PART_COUNT_HEADER = "x-jpmc-mp-parts-count";
2425
private static String CONTENT_LENGTH_HEADER = "Content-Length";
2526
private static String CONTENT_RANGE_HEADER = "Content-Range";
2627
private static String CHECKSUM_SEPARATOR = "-";
28+
private static String DEFAULT_ALGORITHM = "SHA-256";
2729

2830
private String version;
2931
private String checksum;
32+
private String checksumAlgorithm;
3033
private int partCount;
3134
private long contentLength;
3235
private ContentRange contentRange;
@@ -58,10 +61,11 @@ public Head build() {
5861
handlePartCountHeader();
5962
handleChecksumHeader();
6063
handleVersionHeader();
64+
handleChecksumAlgorithmHeader();
6165
handleContentLength();
6266
handleContentRangeHeader();
6367
}
64-
return new Head(version, checksum, partCount, contentLength, contentRange, isMultipart);
68+
return new Head(version, checksum, checksumAlgorithm, partCount, contentLength, contentRange, isMultipart);
6569
}
6670

6771
private void handleContentLength() {
@@ -89,6 +93,28 @@ private void handleChecksumHeader() {
8993
this.checksum = values.get(0).split(CHECKSUM_SEPARATOR)[0];
9094
}
9195
}
96+
else {
97+
List<String> values = this.headers.get(CHECKSUM_SHA256_HEADER);
98+
if (nonNull(values) && !values.isEmpty() && nonNull(values.get(0))){
99+
this.checksum = values.get(0).split(CHECKSUM_SEPARATOR)[0];
100+
}
101+
102+
}
103+
104+
}
105+
106+
private void handleChecksumAlgorithmHeader() {
107+
if(this.headers.containsKey(CHECKSUM_AlGO_HEADER)){
108+
List<String> values = this.headers.get(CHECKSUM_ALGO_HEADER);
109+
if(!values.isEmpty() && nonNull(values.get(0))) {
110+
this.checksumAlgorithm = values.get(0);
111+
}
112+
} else
113+
{
114+
this.checksumALgorithm = DEFAULT_ALGORITHM;
115+
}
116+
117+
92118
}
93119

94120
private void handlePartCountHeader() {

src/main/java/io/github/jpmorganchase/fusion/digest/PartChecker.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,39 @@ public class PartChecker {
2020

2121
MessageDigest digest;
2222

23-
String digestAlgo;
23+
private DigestProvider digestProvider;
24+
private String digestAlgo;
25+
private boolean skipChecksum;
26+
private DigestProviderService digestProviderService;
2427

25-
public PartChecker(String digestAlgo) {
28+
29+
30+
public PartChecker(String digestAlgo, DigestProviderService digestProviderService) {
2631
this.digestAlgo = digestAlgo;
32+
this.digestProviderService = digestProviderService;
2733
}
2834

2935
public void update(int bytesRead) throws IOException {
30-
if (Objects.isNull(digest)) {
36+
if (Objects.isNull(digestProvider)) {
3137
init();
3238
}
33-
digest.update(Integer.valueOf(bytesRead).byteValue());
39+
digestProvider.update(Integer.valueOf(bytesRead).byteValue());
3440
}
3541

36-
public void verify(String checksum) throws IOException {
42+
public void verify(String expectedChecksum) throws IOException {
3743
String encodedDigest = Base64.getEncoder().encodeToString(digest.digest());
38-
if (!Objects.isNull(checksum) && !checksum.equals(encodedDigest)) {
44+
if (skipChecksum) {
45+
return;
46+
}
47+
48+
String calculatedChecksum = digestProvider.getDigest();
49+
50+
51+
if (!Objects.equals(expectedChecksum, calculatedChecksum)) {
3952
log.error(
4053
"Corrupted stream encountered, failed to verify checksum [{}] against calculated checksum [{}]",
41-
checksum,
42-
encodedDigest);
54+
expectedChecksum,
55+
calculatedChecksum);
4356
throw new IOException("Corrupted stream, verification of checksum failed");
4457
}
4558
}
@@ -53,11 +66,13 @@ private void init() throws IOException {
5366
}
5467

5568
public static class PartCheckerBuilder {
69+
70+
DigestProviderService digestProviderService = new DigestProviderService();
5671
public PartChecker build() {
5772
if (digestAlgo == null) {
5873
digestAlgo = DEFAULT_DIGEST_ALGO;
5974
}
60-
return new PartChecker(digestAlgo);
75+
return new PartChecker(digestAlgo, skipChecksum, digestProviderService);
6176
}
6277
}
6378
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.github.jpmorganchase.fusion.digest.checksum;
2+
3+
import java.util.Base64;
4+
import java.util.zip.Checksum;
5+
import java.util.zip.checksum;
6+
import software.amazon.awssdk.crt.checksums.CRC32C;
7+
8+
9+
public class CRC32CProvider implements DigestProvider {
10+
11+
private final Checksum checksum;
12+
13+
public CRC32CProvider()
14+
{
15+
this.checksum = newCRC32C();
16+
}
17+
18+
@Override
19+
public String getDigest(){
20+
long checksumValue = checksum.getValue();
21+
return Base64.getEncoder().encodeToString(longToBytes(checksumValue));
22+
}
23+
24+
private byte[] longToBytes(long value)
25+
{
26+
return new byte[] {(byte) (value >>> 24), (byte) (value>>> 16), (byte) (value >>> 8), (byte) value};
27+
}
28+
}

0 commit comments

Comments
 (0)