为什么HTTP响应没有给我指定的数据范围?

时间:2016-03-17 17:11:45

标签: java networking http-headers range httpresponse

所以我使用Range属性从url抓取一个HTTP对象,例如.png。我找到了整个对象的内容长度,然后我将每个范围的起始字节和结束字节分开。一切正常,直到最后一个范围。

// 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

发生了什么事?

2 个答案:

答案 0 :(得分: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
  

byte-range-spec中的first-byte-pos值给出了字节偏移量      范围中的第一个字节。 last-byte-pos值给出了      范围中最后一个字节的字节偏移量;也就是说,字节      指定的职位是包容性的字节偏移从零开始。

因此,27657的长度为0-27656

当您要求22128-27657时,您要求的字节数多于可用字节数,并且响应将被截断为实际可用的字节数。

答案 1 :(得分:1)

字节范围为0索引。对于bytes=22128-27657,您要求通过27658字节的第22129字节,但只有27657字节。您的两个示例都表现正常。