-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDownloadVerify.java
More file actions
89 lines (77 loc) · 2.41 KB
/
DownloadVerify.java
File metadata and controls
89 lines (77 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.util.HexFormat;
import java.util.Objects;
import java.util.logging.Logger;
public final class DownloadVerify
{
private static final Logger LOG =
Logger.getLogger("DownloadVerify");
private DownloadVerify()
{
}
public static void main(
final String[] args)
throws Exception
{
final var sourceURI =
URI.create(args[0]);
final var outputFile =
Paths.get(args[1]).toAbsolutePath();
final var hashExpected =
args[2];
LOG.info("Download: %s".formatted(sourceURI));
LOG.info("File: %s".formatted(outputFile));
LOG.info("Expected SHA256: %s".formatted(hashExpected));
if (Files.isRegularFile(outputFile)) {
LOG.info("Output file already exists.");
return;
}
final var client =
HttpClient.newBuilder()
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
final var request =
HttpRequest.newBuilder(sourceURI)
.GET()
.build();
final var response =
client.send(
request,
HttpResponse.BodyHandlers.ofFile(
outputFile,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE
)
);
final var statusCode = response.statusCode();
if (statusCode >= 400) {
LOG.severe("Status Code: %s".formatted(statusCode));
throw new IOException(
"Server returned status code %s".formatted(statusCode)
);
}
final var digest = MessageDigest.getInstance("SHA-256");
try (var stream = Files.newInputStream(outputFile)) {
try (var digestStream = new DigestInputStream(stream, digest)) {
digestStream.transferTo(OutputStream.nullOutputStream());
}
}
final var hashReceived = HexFormat.of().formatHex(digest.digest());
if (!Objects.equals(hashExpected, hashReceived)) {
LOG.severe("Expected SHA256: %s".formatted(hashExpected));
LOG.severe("Received SHA256: %s".formatted(hashReceived));
throw new IOException("Download file failed hash check.");
}
}
}