我一直在尝试使用Range标头值从特定点流式传输音频,但我总是从头开始获取歌曲。我通过一个程序这样做,所以我不确定问题是在我的代码中还是在服务器上。
如何确定服务器是否支持Range标头参数?
感谢。
答案 0 :(得分:29)
HTTP spec定义它的方式,如果服务器知道如何支持Range
标题,它将会。反过来,当它向您返回内容时,它要求它返回带有206 Partial Content标头的Content-Range
响应代码。否则,它将忽略您请求中的Range
标头,并返回200响应代码。
这可能看起来很愚蠢,但您确定要制作有效的HTTP请求标头吗?通常,我忘记在请求中指定HTTP / 1.1,或者忘记指定范围说明符,例如“bytes”。
哦,如果您只想检查,那么只需发送一个HEAD请求而不是GET请求。相同的标题,相同的一切,只是“HEAD”而不是“GET”。如果您收到206
回复,则表示支持Range
,否则您将收到200
回复。
答案 1 :(得分:7)
虽然我在回答这个问题时有点迟,但我认为我的回答将有助于未来的访客。这是一个python方法,用于检测服务器是否支持范围查询。
def accepts_byte_ranges(self, effective_url):
"""Test if the server supports multi-part file download. Method expects effective (absolute) url."""
import pycurl
import cStringIO
import re
c = pycurl.Curl()
header = cStringIO.StringIO()
# Get http header
c.setopt(c.URL, effective_url)
c.setopt(c.NOBODY, 1)
c.setopt(c.HEADERFUNCTION, header.write)
c.perform()
c.close()
header_text = header.getvalue()
header.close()
verbose_print(header_text)
# Check if server accepts byte-ranges
match = re.search('Accept-Ranges:\s+bytes', header_text)
if match:
return True
else:
# If server explicitly specifies "Accept-Ranges: none" in the header, we do not attempt partial download.
match = re.search('Accept-Ranges:\s+none', header_text)
if match:
return False
else:
c = pycurl.Curl()
# There is still hope, try a simple byte range query
c.setopt(c.RANGE, '0-0') # First byte
c.setopt(c.URL, effective_url)
c.setopt(c.NOBODY, 1)
c.perform()
http_code = c.getinfo(c.HTTP_CODE)
c.close()
if http_code == 206: # Http status code 206 means byte-ranges are accepted
return True
else:
return False
答案 2 :(得分:5)
一种方法是尝试,并检查响应。在您的情况下,服务器似乎不支持范围。
或者,对URI执行GET或HEAD,并检查Accept-Ranges response header。
答案 3 :(得分:3)
这是为其他人搜索如何执行此操作。你可以使用curl:
curl -I http://exampleserver.com/example_video.mp4
在标题中你应该看到
Accept-Ranges: bytes
您可以进一步测试检索范围
curl --header "Range: bytes=100-107" -I http://exampleserver.com/example_vide0.mp4
在标题中你应该看到
HTTP/1.1 206 Partial Content
和
Content-Range: bytes 100-107/10000000
Content-Length: 8
[而不是10000000你会看到文件的长度]
答案 4 :(得分:0)
GET
方法与0-0
Range
请求标头一起使用,并检查响应代码是否为206,这将响应
响应正文的第一个和最后一个字节HEAD
方法执行与第一个会话相同的操作,该会话将获得相同的响应标头和没有响应正文的代码此外,您可以检查响应标头上的
Accept-Ranges
以判断它是否可以支持范围,但请注意none
字段上的值是Accept-Ranges
,这意味着它可以&# 39; t支持范围,如果响应标题没有Accept-Ranges
字段,您也无法指出它不支持范围。
如果您在请求标头上使用0-
Range
并使用GET
方法检查响应代码,则必须知道另一件事,响应正文消息将自动缓存在TCP接收窗口上,直到缓存已满。