2016-03-17 3 views
0

Итак, я захватываю HTTP-объект, такой как .png, из URL-адреса, используя свойство Range. Я нахожу длину содержимого всего объекта, а затем разбиваю начальные байты и заканчивая байты каждого диапазона. Все работает отлично до последнего диапазона.Почему ответ HTTP не дает мне мой указанный диапазон данных?

// My specified range is: 
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); 
urlConnection.setRequestProperty("Range", "bytes=22128-27657"); 

// It returns (Response Header): 
HTTP/1.1 206 Partial Content 
Thu, 17 Mar 2016 17:04:34 GMT 
Downloaded Size: 5533 
bytes 
5529 
bytes 22128-27656/27657 // !!! - Incorrect 
Keep-Alive 

Однако на любом другом диапазоне, я получаю данные я прошу:

// My specified range is: 
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); 
urlConnection.setRequestProperty("Range", "bytes=5533-11066"); 

// It returns (Response Header): 
HTTP/1.1 206 Partial Content 
Thu, 17 Mar 2016 17:04:34 GMT 
Downloaded Size: 5533 
bytes 
5529 
bytes 5533-11066/27657 // !!! - Correct 
Keep-Alive 

Что происходит?

ответ

1

Диапазон байтов 0-индексный. С bytes=22128-27657 вы запрашиваете 22129-й байт через 27658-й байт, но всего 27657 байт. Оба ваших примера ведут себя правильно.

+0

Итак, я получаю все данные? –

+1

Правильно. '22128-27656/27657' означает, что все остальные данные из позиции' 22128' в конец документа были возвращены. –

1

Значение заголовка Content-Range определяется как (сокращенно):

Content-Range  = byte-content-range 
byte-content-range = bytes-unit SP byte-range-resp 
byte-range-resp  = byte-range "/" (complete-length/"*") 
byte-range   = first-byte-pos "-" last-byte-pos 
complete-length  = 1*DIGIT 

и section 2.1 говорит:

first-byte-pos  = 1*DIGIT 
last-byte-pos  = 1*DIGIT 

Значение первого байта-полюсная в байт-пастбищам spec дает смещение байта первого байта в диапазоне. Значение last-byte-pos дает байт-смещение последнего байта в диапазоне; то есть байт указанных позиций указаны. Байт-смещения начинаются с нуля.

Так с длиной 27657, позиции 0-27656.

Когда вы запрашиваете 22128-27657, вы запрашиваете больше байтов, чем доступно, и ответ усечен до того, что действительно доступно.

Смежные вопросы