in maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java [268:374]
protected void implGet(GetTask task) throws Exception {
boolean resume = task.getResumeOffset() > 0L && task.getDataPath() != null;
HttpResponse<InputStream> response = null;
try {
while (true) {
HttpRequest.Builder request =
HttpRequest.newBuilder().uri(resolve(task)).method("GET", HttpRequest.BodyPublishers.noBody());
headers.forEach(request::setHeader);
if (resume) {
long resumeOffset = task.getResumeOffset();
long lastModified = pathProcessor.lastModified(task.getDataPath(), 0L);
request.header(RANGE, "bytes=" + resumeOffset + '-');
request.header(
IF_UNMODIFIED_SINCE,
RFC7231.format(Instant.ofEpochMilli(lastModified - MODIFICATION_THRESHOLD)));
request.header(ACCEPT_ENCODING, "identity");
}
try {
response = send(request.build(), HttpResponse.BodyHandlers.ofInputStream());
if (response.statusCode() >= MULTIPLE_CHOICES) {
if (resume && response.statusCode() == PRECONDITION_FAILED) {
closeBody(response);
resume = false;
continue;
}
try {
JdkRFC9457Reporter.INSTANCE.generateException(response, (statusCode, reasonPhrase) -> {
throw new HttpTransporterException(statusCode);
});
} finally {
closeBody(response);
}
}
} catch (ConnectException e) {
closeBody(response);
throw enhance(e);
}
break;
}
long offset = 0L,
length = response.headers().firstValueAsLong(CONTENT_LENGTH).orElse(-1L);
if (resume) {
String range = response.headers().firstValue(CONTENT_RANGE).orElse(null);
if (range != null) {
Matcher m = CONTENT_RANGE_PATTERN.matcher(range);
if (!m.matches()) {
throw new IOException("Invalid Content-Range header for partial download: " + range);
}
offset = Long.parseLong(m.group(1));
length = Long.parseLong(m.group(2)) + 1L;
if (offset < 0L || offset >= length || (offset > 0L && offset != task.getResumeOffset())) {
throw new IOException("Invalid Content-Range header for partial download from offset "
+ task.getResumeOffset() + ": " + range);
}
}
}
final boolean downloadResumed = offset > 0L;
final Path dataFile = task.getDataPath();
if (dataFile == null) {
try (InputStream is = response.body()) {
utilGet(task, is, true, length, downloadResumed);
}
} else {
try (FileUtils.CollocatedTempFile tempFile = FileUtils.newTempFile(dataFile)) {
task.setDataPath(tempFile.getPath(), downloadResumed);
if (downloadResumed && Files.isRegularFile(dataFile)) {
try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(dataFile))) {
Files.copy(inputStream, tempFile.getPath(), StandardCopyOption.REPLACE_EXISTING);
}
}
try (InputStream is = response.body()) {
utilGet(task, is, true, length, downloadResumed);
}
tempFile.move();
} finally {
task.setDataPath(dataFile);
}
}
if (task.getDataPath() != null) {
String lastModifiedHeader = response.headers()
.firstValue(LAST_MODIFIED)
.orElse(null); // note: Wagon also does first not last
if (lastModifiedHeader != null) {
try {
pathProcessor.setLastModified(
task.getDataPath(),
ZonedDateTime.parse(lastModifiedHeader, RFC7231)
.toInstant()
.toEpochMilli());
} catch (DateTimeParseException e) {
// fall through
}
}
}
Map<String, String> checksums = checksumExtractor.extractChecksums(headerGetter(response));
if (checksums != null && !checksums.isEmpty()) {
checksums.forEach(task::setChecksum);
}
} finally {
closeBody(response);
}
}