Http Range запрос свойства?
Я застрял в написании некоторых фрагментов кода Java, пытаясь загрузить по диапазону целевой файл с удаленного хоста. Я ожидаю загрузки удаленного файла некоторыми кусками, полагаясь на какой-то многопоточный процесс.
Согласно следующей трассировке отладки все работает хорошо:
Task 2 --> REQUEST PROPERTIES = {Range=[bytes=59124782-88687172]}
Task 3 --> REQUEST PROPERTIES = {Range=[bytes=88687173-118249563]}
Task 0 --> REQUEST PROPERTIES = {Range=[bytes=0-29562390]}
Task 1 --> REQUEST PROPERTIES = {Range=[bytes=29562391-59124781]}
Task 2 --> RETURN_CODE = 206 ==> OK :-) !
Task 2 --> Start Byte = 59124782 / End Byte = 88687172 --> Total bytes = 29562391
Task 0 --> RETURN_CODE = 206 ==> OK :-) !
Task 0 --> Start Byte = 0 / End Byte = 29562390 --> Total bytes = 29562391
Task 3 --> RETURN_CODE = 206 ==> OK :-) !
Task 3 --> Start Byte = 88687173 / End Byte = 118249563 --> Total bytes = 29562391
Task 1 --> RETURN_CODE = 206 ==> OK :-) !
Task 1 --> Start Byte = 29562391 / End Byte = 59124781 --> Total bytes = 29562391
Согласно следующей трассировке отладки все не работает нормально:
Task 0 --> REQUEST PROPERTIES = {Range=[bytes=0-15308169]}
Task 3 --> REQUEST PROPERTIES = {Range=[bytes=45924510-61232679]}
Task 1 --> REQUEST PROPERTIES = {Range=[bytes=15308170-30616339]}
Task 2 --> REQUEST PROPERTIES = {Range=[bytes=30616340-45924509]}
Task 0 --> RETURN_CODE = 206 ==> OK :-) !
Task 0 --> Start Byte = 0 / End Byte = 15308169 --> Total bytes = 15308170
Task 3 --> RETURN_CODE = 200 ==> NOK :-( !
Task 2 --> RETURN_CODE = 200 ==> NOK :-( !
Task 1 --> RETURN_CODE = 200 ==> NOK :-( !
Трюк между двумя прогонами, код один и тот же, удаленный хост один и тот же ... только целевой файл не тот же (второй - наполовину меньше первого, и оба - файлы .zip). Что касается запроса некоторого определенного диапазона, я ожидаю, что для каждого кода возврата задачи 206 будет получено подтверждение частичных данных. Но, опираясь на вторую трассировку, я получаю 3 последних кода задачи 200, что означает, что ответ сервера в порядке, но отправит полный файл :-( ....
Какой король черной магии может привести к такому ???? Погуглив немного, я обнаружил, что какой-то http-сервер может вводить некоторый процесс объединения запросов диапазона ... такое может случиться здесь?
Когда запрашивается несколько диапазонов, сервер МОЖЕТ объединить любой из диапазонов, которые перекрываются или разделяются промежутком, который меньше, чем издержки отправки нескольких частей, независимо от порядка, в котором соответствующая спецификация диапазона байтов появилась в полученное поле заголовка диапазона. Поскольку типичные издержки между частями полезной нагрузки multipart / byteranges составляют около 80 байтов, в зависимости от типа носителя выбранного представления и выбранной длины граничного параметра, может быть менее эффективно передавать много небольших непересекающихся частей, чем передавать все выбранные представление.
Просто для информации вот мой кусок кода Java:
HttpURLConnection urlConn = null;
try {
urlConn = task.openConnection(task.getSourceFileUrl());
urlConn.setRequestMethod("GET");
urlConn.setRequestProperty("Range", "bytes=" + currentByte + "-" + endByte + "");
System.out.println(String.format("Task %s --> REQUEST PROPERTIES = %s", id, urlConn.getRequestProperties().toString()));
if (urlConn.getResponseCode() != HttpURLConnection.HTTP_PARTIAL) {
System.out.println(String.format("Task %s --> RETURN_CODE = %s ==> NOK :-( !", id, urlConn.getResponseCode()));
return;
} else {
System.out.println(String.format("Task %s --> RETURN_CODE = %s ==> OK :-) !", id, urlConn.getResponseCode()));
}
System.out.println(String.format("Task %s --> Start Byte = %s / End Byte = %s --> Total bytes = %s", id, currentByte, endByte, urlConn.getContentLengthLong()));
Спасибо за помощь !!!!!